redis 问题及优化



1. redis 哨兵的作用

  1. 监控

    不断检查 master 和 slave 是否正常

    master 存活检测、master 与 slave 运行情况检测

  2. 通知 (提醒)

    当被监控的服务器出现问题时,向其它(哨兵,客户端)发送通知

  3. 自动故障转移

    断开 master 与 slave 连接,选取一个 slave 作为 master,与其它 slave 连接到新的 master,并告知客户端服务器地址

哨兵是一台 redis 服务器,只是不提供服务数据。通常哨兵配置数量为单数(决策)


2. redis 持久化

机器关闭的时候,内存数据会清空,下次开机不会存储。为了防止突发情况可以设置持久化。

  1. RDB 生成快照

    save 获取数据进行快照备份,不会消耗内存,阻塞客户端

    bgsave 会 fork 一个子进程,进行文件快照备份,会消耗内存,不会阻塞客户端

  2. AOF 写日志 (先写入缓冲区,根据策略写入AOF日志中)

    always 把每条缓冲区命令都写入磁盘中

    everysec 每秒把缓冲区命令写入磁盘中 (默认方式)

    no 根据操作系统配置

ADB 和 AOF 优缺点


3. redis 内存满了

  1. 设置内存大小
maxmemory 100mb //在Redis的配置文件redis.conf文件中,一般公司给的内存大小都在3G往上
  1. 内存淘汰

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 击穿、雪崩、穿透

  1. 穿透

    查询一个一定不存在的数据,每次请求都要到mysql中查询

    案列:如数据库 id 是从 1 开始的,结果黑客发过来的请求 id 全部都是负数

    解决:如果一个查询返回的数据为空,设置空结果进行缓存,过期时间会很短,最长不超过五分钟

  2. 雪崩

    缓存中大批量热点数据过期后系统涌入大量查询请求

    案列:服务器高峰每秒5000个请求,由于意外发生宕机

    解决:(1)可以限流,使用队列。(2)做二级缓存,或者双缓存策略。A为原始缓存,B为拷贝缓存,A失效时,可以访问B

  3. 击穿

    某个 key 非常热点,访问非常频繁,在失效的瞬间,大量的请求击穿缓存

    案例:秒杀现场,在同一时间高频访问某一数据,并且当前数据正好过期。

    解决:(1)以将热点数据设置为永远不过期。(2)实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据

posted @ 2021-03-04 11:51  linsonga  阅读(59)  评论(0编辑  收藏  举报