一、常见操作
1. 简介
Redis(Remote Dictionary Server)是一个开源的内存数据存储系统,
通常被称为缓存数据库或键值存储数据库。它被设计用来解决高性能、低延迟的数据存储和访问需求。
2. 应用
当多个用户同时访问一个商品 A,而 Redis 缓存中没有商品 A 的数据时,可以执行以下步骤:
1. 第一个用户访问商品 A,发现 Redis 缓存中没有,于是从数据库读取商品 A 的数据。
2. 这个用户将商品 A 的数据存储在 Redis 缓存中,以便下次访问时可以直接从缓存获取。
3. 后续的其他用户访问商品 A,由于已经有了缓存,它们可以直接从 Redis 缓存中获取商品 A 的数据,而不需要再访问数据库。
非常适合读多写少的场景
3. String常见操作
1. select 0
Redis 默认有 16 个数据库,编号从 0 到 15,可以通过 SELECT 命令在不同数据库之间切换。
2. keys *
获取所有的key
3. set name frank
设置<"name":"frank">的键值对
如果之前已经存在就覆盖
4. setnx age 30
如果key不存在就设置,返回1
如果key存在,就不设置,返回0
用于分布式锁:
a. 先setnx设置缓存抢锁
b. 再用expire设置过期时间
5. del age
删除kv
6. expire age 100
expire设置过期时间,到期自动删除释放锁
7. ttl age
time to live,剩余时间
返回-2代表已经没有这个key了
4. 其他类型写入
1. 写入字符串类型(String):
SET mykey "Hello World"
2. 写入列表类型(List):
LPUSH mylist "item1"
LPUSH mylist "item2"
LPUSH mylist "item3"
3. 写入哈希表类型(Hash):
HSET myhash field1 "value1"
HSET myhash field2 "value2"
HSET myhash field3 "value3"
4. 写入集合类型(Set):
SADD myset "member1"
SADD myset "member2"
SADD myset "member3"
5. 写入有序集合类型(Sorted Set):
ZADD myzset 1 "member1"
ZADD myzset 2 "member2"
ZADD myzset 3 "member3"
二、常见问题
1. 缓存失效的情况
1. 缓存过期
2. 缓存更新
3. Redis异常
4. 网络异常
2. Redis 的优点
Redis 的优点包括高性能、可扩展性、数据持久性、丰富的数据类型、支持事务和 Lua 脚本
3. Redis 如何实现数据持久性
Redis通过把数据保存到磁盘文件中实现数据持久性
方式1:通过保存到快照
方式2:通过保存到日志文件
在服务重启之后,Redis可以从快照文件或者日志文件恢复数据
4. Redis 如何处理并发访问
Redis是单线程,但是通过异步IO处理,通过乐观锁解决访问。可以同时处理多个客户端请求。
5. Redis有哪些数据结构
字符串、列表、哈希表、集合和有序集合
6. Redis的主从复制
Redis服务器把数据复制到其他服务,使其他服务拥有相同的读写功能。分为以下步骤:
1. 主服务使用数据永久性把数据写到快照/日志
2. 从服务器与主服务器建立连接,接收并执行主服务器的写命令。
3. 断开连接,从服务器成为一个独立的Redis数据库,可以接受读操作请求。
优势:主从复制可以用于实现数据备份、负载均衡以及读写分离等需求。
主服务主要是写的操作,并将数据同步给从服务器,从服务器主要实现读的操作
7. Redis的过期策略
1. 定期删除:定期扫描,发现过期数据直接删除
2. 惰性删除:Redis写kv的时候会检查是否过期,如果过期直接删除
8. 缓存穿透、缓存击穿、缓存雪崩
缓存穿透
原因:大量数据访问Redis中不存在的数据,可能是业务数据被勿删,或者攻击
解决:1.布隆筛选器
2.设置空的值,过期时间较短
3.常用数据预热
4.设置限流和熔断
缓存击穿
原因:有一个数据过期的时候,正好遇到了批量对这个数据的Redis访问,导致大量数据同时访问数据库
解决:1.添加互斥锁,当发现缓存失效后,申请互斥锁,其他数据访问的时候因为互斥锁的存在,等待锁的释放
2.先放一个空值,时间有效期较短
缓存雪崩
原因:有批量数据失效,并且时效期间有批量数据访问
解决:1. 使用主从热复制
2.分布式缓存
3.过期时间随机,不是固定值
4.非核心业务,拒绝访问数据库
9.为什么 Redis 需要把所有数据放到内存中
1. 为了达到最大的读写速度,内存读取速度比磁盘IO速度更快
2. 定期异步把数据写入到磁盘,达到数据永久性
10. Redis key 的过期时间和永久有效
EXPIRE 和 PERSIST 命令
PERSIST是在设置EXPIRE之后,再进行设置,以此取消过期时间的限制
11. Redis 分布式锁
setnx设置的时候加锁,expire设置加过期时间
12. Redis集群的原理
1. 高可用性集群:集群有主备关系,当主机群出现故障时,备用集群能当做主机群使用,以防系统故障
2. 高扩展性集群:Redis内存不足时,可以将数据分片存储在不同的节点上,保障可扩展性
13.Redis淘汰机制
No Eviction (不淘汰策略):当内存不足时,Redis会拒绝写入操作并返回错误。
Allkeys-LRU (最近最少使用策略):从所有键中选择最近最少使用的键进行删除。
Allkeys-Random (随机淘汰策略):从所有键中随机选择一个键进行删除。
Volatile-LRU (过期时间最近最少使用策略):从设置了过期时间的键中选择最近最少使用的键进行删除。
Volatile-Random (过期时间随机淘汰策略):从设置了过期时间的键中随机选择一个键进行删除。
Volatile-TTL (过期时间最近的策略):从设置了过期时间的键中选择过期时间最近的键进行删除。
版权声明:本文为moso_wang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。