Redis常见问题总结
1.Redis分布式存储方案
分布式存储 | 核心特点 |
---|---|
主从(Master/Slave)模式 | 一主多从,故障时手动切换。 |
哨兵(Sentinel)模式 | 有哨兵的一主多从,主节点故障自动选择新的主节点。 |
集群(Cluster)模式 | 分节点对等集群,分slots,不同slots的信息存储到不同节点。 |
2. Redis 集群切片的常见方式
分片方案 | 分片方式 | 说明 |
---|---|---|
范围分片 | 按数据范围值来做分片 | eg: 按照订单编号分片,0~9 映射到实例A;11~20 映射到实例B |
哈希分片 | 通过对key进行hash运算分片 | 可以把数据分配到不同实例,hash(key),这个类似于取余操作,余数相同的,放在一个实例上。 |
一致性哈希分片 | 哈希分片的改进 | 利于扩展节点,可以有效解决重新分配节点带来无法命中的问题。 |
3. Redis 数据淘汰算法
淘汰范围 | 机制名 | 策略解释 |
---|---|---|
不淘汰 | noeviction | 禁止驱动数据,内存不足以容纳新入数据时,新写入操作就会报错。系统默认的一种淘汰策略。 |
设置了过期时间的键空间 | volatile-random | 随机移除某个key |
volatile-lru | 优先移除最近未使用的key[局部性原理] | |
volatile-ttl | ttl值小的key优先移除 | |
全键空间 | allkeys-random | 随机移除某个key |
allkeys-lru | 优先移除最近 未使用的key |
4. Redis 的持久化
Redis的持久化主要有两种方式 RDB和AOF
RDB(Redis DataBase):传统数据库中快照的思想。指定时间间隔数据进行快照存储。
AOF(Append-Only File):传统数据库中日志思想,把每条该表数据集的命令追加到AOF文件末尾,这样出了问题了,可以重新执行AOF文件中的命令来重建数据集
对比维度 | RDB持久化 | AOF持久化 |
---|---|---|
备份量 | 重量级的全量备份,保存整个数据库 | 轻量级增量备份,一次只保存一个修改命令 |
保存间隔时间 | 保存间隔时间长 | 保存间隔时间短,默认1秒 |
还原速度 | 数据还原速度快 | 数据还原速度慢 |
阻塞情况 | save会阻塞,但bgsave或者自动不会阻塞 | 无论是平时还是AOF重写,都不会阻塞 |
数据体积 | 同等数据体积:小 | 同等数据体积:大 |
安全性 | 数据安全性:低,容易丢数据 | 数据安全性:高,根据策略决定 |
5. Redis 常见问题
1.缓存雪崩
大部分缓存失效–>数据库崩溃
解决方案:
-
使用锁或队列: 保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。
-
为key 设置不同的缓存失效时间:在固定的一个缓存时间的基础上+随机一个时间作为缓存失效时间。
-
二级缓存: 设置一个有时间限制的缓存+一个无时间限制的缓存。避免大规模访问数据库。
2. 缓存穿透
查询无数据返回-> 直接查数据库
解决方案:
- 如果查询结果为空,直接设置一个默认值存放到缓存,这样第二次到缓存汇总获取就有值了,设置一个不超过5分钟的过期时间,以便能正常更新缓存。
- 设置布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
3. 缓存预热
系统上线后,将相关需要缓存数据直接加到缓存系统中。
解决方案:
1.直接写个缓存刷新页面,上线时手动操作
2.数据量不大时,可以在项目启动的时候自行进行加载
3.定时刷新缓存