redis 问题及优化
1. redis 哨兵的作用
-
监控
不断检查 master 和 slave 是否正常
master 存活检测、master 与 slave 运行情况检测 -
通知 (提醒)
当被监控的服务器出现问题时,向其它(哨兵,客户端)发送通知
-
自动故障转移
断开 master 与 slave 连接,选取一个 slave 作为 master,与其它 slave 连接到新的 master,并告知客户端服务器地址
哨兵是一台 redis 服务器,只是不提供服务数据。通常哨兵配置数量为单数(决策)
2. redis 持久化
机器关闭的时候,内存数据会清空,下次开机不会存储。为了防止突发情况可以设置持久化。
-
RDB 生成快照
save 获取数据进行快照备份,不会消耗内存,阻塞客户端
bgsave 会 fork 一个子进程,进行文件快照备份,会消耗内存,不会阻塞客户端
-
AOF 写日志 (先写入缓冲区,根据策略写入AOF日志中)
always 把每条缓冲区命令都写入磁盘中
everysec 每秒把缓冲区命令写入磁盘中 (默认方式)
no 根据操作系统配置
ADB 和 AOF 优缺点
3. redis 内存满了
- 设置内存大小
maxmemory 100mb //在Redis的配置文件redis.conf文件中,一般公司给的内存大小都在3G往上
- 内存淘汰
LRU(Least Recently Used)即表示 最近时间使用最少的key进行淘汰
可以在配置文件中设置key的个数
maxmemory-samples 5 // 个数
- noeviction(默认策略):若是内存的大小达到阀值的时候,所有申请内存的指令都会报错。
- allkeys-lru:所有key都是使用LRU算法进行淘汰。
- volatile-lru:所有设置过期时间的key使用LRU算法进行淘汰。
- allkeys-random:所有的key使用随机淘汰的方式进行淘汰。
- volatile-random:所有设置了过期时间的key使用随机淘汰的方式进行淘汰。
- volatile-ttl:所有设置了过期时间的key根据过期时间进行淘汰,越早过期就越快被淘汰。
3. redis 击穿、雪崩、穿透
-
穿透
查询一个一定不存在的数据,每次请求都要到mysql中查询
案列:如数据库 id 是从 1 开始的,结果黑客发过来的请求 id 全部都是负数
解决:如果一个查询返回的数据为空,设置空结果进行缓存,过期时间会很短,最长不超过五分钟
-
雪崩
缓存中大批量热点数据过期后系统涌入大量查询请求
案列:服务器高峰每秒5000个请求,由于意外发生宕机
解决:(1)可以限流,使用队列。(2)做二级缓存,或者双缓存策略。A为原始缓存,B为拷贝缓存,A失效时,可以访问B
-
击穿
某个 key 非常热点,访问非常频繁,在失效的瞬间,大量的请求击穿缓存
案例:秒杀现场,在同一时间高频访问某一数据,并且当前数据正好过期。
解决:(1)以将热点数据设置为永远不过期。(2)实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据