Redis笔记
1. Redis应用场景
- 分布式会话缓存
- 分布式锁
- 发布/订阅
- 排行榜/计数器
- 队列
- 全页缓存
- 缓存热点数据
2. 更新正确方法
先更新数据库,再删除缓存
3. 高并发引起的问题
-
缓存穿透:缓存和数据库都不存在的key,流量过高导致DB挂掉
解决方案:(常用)访问key未在DB查询到的值,也将空值写进缓存,但设置过期时间
采用布隆过滤器,不存在的key直接被过滤掉 -
缓存击穿:缓存中没有,数据库中有,直接去数据库中取数据,数据库压力过大导致挂掉(并发查询一条数据)
解决方案:设置热点数据永不过期;加互斥锁 -
缓存雪崩:缓存中数据大批量到期时间,查询的数据量大,数据库压力大导致宕机
解决方案:缓存数据过期时间随机;热点数据永不过期
4. 淘汰策略
- voltile-lru:
从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 - volatile-ttl:
从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 - volatile-random:
从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰 - allkeys-lru:
从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 - allkeys-random:
从数据集(server.db[i].dict)中任意选择数据淘汰 - no-enviction(驱逐):
禁止驱逐数据
5. 持久化
6. 高可用
- 主从备份:读写分离策略,手动调节节点晋升
- 哨兵模式:部署复杂,不能解决读写分离
- Redis集群:最少配置6个节点以上(3主3从)
7. 主从同步
- 从服务器连接主服务器,发送SYNC命令;
- 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
- 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
- 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
- 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
- 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;