一、什么是Redis?
-
Redis一个非关系型数据库,并且数据是存储在内存中的。
-
广泛应用于缓存、同时其还可以用于分布式锁和消息队列
二、Redis的优势:
- 支持的数据类型丰富
- 支持数据持久化( rdb快照和aof日志 )
- 支持lua脚本、事务
三、Redis各数据类型的特点:
-
string 简单的kv类型,一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。
-
list 链表类型,发布与订阅或者说消息队列、慢查询。
-
hash string类型的field 和 value 的映射表,适合用于存储对象数据。
-
set 无序集合,类似于hashset,数据不能重复,常用于需要存放的数据不能重复以及需要获取多个数据源交集和并集等场景。
-
zset 有序集合,常用于需要对数据根据某个权重进行排序的场景。比如在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息。
-
bitmap 存储连续的二进制数字(0 和 1),适合需要保存状态信息(比如是否签到、是否登录...)并需要进一步对这些信息进行分析的场景。比如用户签到情况、活跃用户情况、用户行为统计(比如是否点赞过某个视频)。
四、Redis的过期删除策略
Redis通过一个过期字典保存数据过期的时间,过期字典的key指向redis中的数据的key,value保存key指向的数据的过期时间(毫秒精度的UNIX时间戳),有以下两种过期策略:
-
惰性策略:用到的时候才会去查看数据是否过期,可能会因为过期数据太多占用空间。
-
定期删除策略:每隔一段时间抽取一批key进行过期删除操作。
五、Redis的内存淘汰机制:
- volatile-lru 从已设置过期时间的数据集中挑选最少使用的数据淘汰
- volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰
- volatile-random 从已设置过期时间的数据集中随机挑选数据淘汰
- allkeys-lru 从数据集中淘汰最少使用的数据
- allkeys-random 从数据集中随机淘汰数据
- no-eviction 不淘汰,内存不足时不写入数据并且报错
六、Redis 持久化机制
1: rdb(快照持久化)
每隔一段时间保存一次快照,恢复时直接回复快照
2: aof(日志持久化)
将每条更改操作的命令写入到aof文件中,恢复数据时通过读取aof文件
七、常见问题
1.缓存穿透
缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。
2.缓存雪崩
同一时间数据大批量的失效,导致请求直接到数据库上。
八、常用的缓存读写策略
- 旁路缓存模式 ,写操作先更新DB再直接删除cache,读操作先查询cache,查不到就从DB查出返回,并把数据写入到cache中。
- 读写穿透模式,写操作先查cache,不存在就直接更新DB,存在则先更新cache再更新DB,读操作先从cache读取数据,读到直接返回,读不到先从DB查出再写入到cache后返回。
- 异步缓存写入模式,和读写穿透模式类似,但是写操作时不同步更新DB,而是通过异步批量更新的方式。
九、redis的集群模式
- 主从模式 一主一从或一主多从读写分离,主支持读写,从只支持读
- 哨兵模式 一主多从,当主节点宕机,哨兵会推选出一个从节点升级成主节点,原主节点恢复时会变成从节点
- 集群模式 去中心化,每个节点都是一主一从,数据是分片存储在各节点上,当其中一个发生问题时,该节点上的所有数据都将无法读写