一、redis
1.持久化两种方式
RDB快照:fork的形式 一个共享内存页 快照
父进程修改是新的副本 而子进程不会修改共享的那个内存所以没有变化,
时机:定期或者某个时间段超过配置的修改数就 快照一次
缺点:定期快照的方式注定会丢失两个快照时间点之间的数据。
AOF:每一个收到的写命令都通过write函数追加到文件中。
三种方式同步:
appendfsync always :每次有数据修改发生时都会写入AOF文件。
appendfsync everysec :每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no :从不同步。高效但是数据不会被持久化。
数据恢复:有aof优先选择恢复。
2.过期清除策略
定期清除:
通过限制删除操作执行的总时长和总频率来限制删除操作对CPU占用时间的影响。
当前已用内存超过maxmemory限定时,触发主动清理策略。清理时会根据用户配置的maxmemory-policy策略来做适当的清理。
如下几种:
volatile-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 : 禁止驱逐(淘汰)数据。默认策略
如果Redis的使用超过了设置的最大值,策略又是默认清除策略会返回返回OOM错误,需要配置清除策略。
3.主要工作模式:单机、主从、哨兵、集群
主从模式:
当从数据库启动时,会向主数据库发送sync命令,主数据库接收到sync后开始在后台报错快照rdb,在保存快照期间受到的命名缓存起来,当快照完成时,主数据库会将快照和缓存的命令一块发送给从。复制初始化结束。之后,主每受到1个命令就同步发送给从。
哨兵:基于主从模式,但是起了监听进程,故障可以转移,系统可用性更好
主出现故障自动将从数据库转换为主数据库。
集群:cluster集群方案,采用的是虚拟槽分区,槽范围是0-16383,有16384个槽。集群中有3个主节点,每个节点大致负责5500个槽的读写,节点会维护自身负责的虚拟槽。
键所对应的哈希值通过如下公式计算:CRC16(key)%16384。目前常见的
4.缓存击穿、缓存穿透、缓存雪崩
缓存击穿:某条热点数据过期,解决:操作db时加互斥锁。
缓存穿透:缓存找不到,加大db压力,解决:设计不存在数据的格式.。
缓存雪崩:不同数据集中过期,解决:随机过期时间。
5.配置项说明:
dbfilename dump.rdb #快照保存文件
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
#如果没有save 表示没有快照持久化
maxmemory #不配置或者0,表示"无限制",单位 byte
maxmemory-policy#清理策略