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. 持久化

Redis笔记

6. 高可用

  • 主从备份:读写分离策略,手动调节节点晋升
  • 哨兵模式:部署复杂,不能解决读写分离
  • Redis集群:最少配置6个节点以上(3主3从)

7. 主从同步

  1. 从服务器连接主服务器,发送SYNC命令;
  2. 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  3. 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
  4. 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
  5. 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  6. 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

8. Redis && Memcached

Redis笔记