导航
数据类型
- string,list,set,softed set,hash
- bitmaps,hyperloglogs,地理空间 geospatial,消息 streams
- 底层结构:简单动态字符串,链表,字典,跳表,整数集合和压缩链表
配置文件
- network:redis 服务器地址,端口以及超时时间等
- general:日志文件的路径和日志级别等进行配置
- snapshotting:持久化配置等
- replication:集群配置等
- memory management:内存管理,包括数据过期删除策略信息的设置
- append only mode:持久化方式信息配置
缓存问题
- 缓存雪崩
- 缓存同一时间大面积失效,请求全部打到 db 上
- 给缓存设置不同的缓存时间
- 更新数据使用互斥锁或双缓存
- 缓存击穿
- 缓存的热点数据过期
- 互斥锁,只让一个请求去 load db,成功后写缓存;其余请求重新获取缓存数据
- 缓存穿透
- 故意请求缓存中不存在的数据
- 使用互斥锁或无论是否有结果都存入缓存
- 布隆过滤器
- 双写一致性
- 双删延时:先删除缓存,再更新数据库,最后再隔固定的时间再次删除缓存
- 更新数据库产生的 binlog 订阅(使用 canal)。将有变化的 key 记录下来,并且尝试去不断的去删除缓存(如果上次删除缓存失败)
内存淘汰策略
- maxmemory-policy:配置淘汰策略
maxmemory:限制内存大小
volatile-lru:已设置过期时间的数据集中挑选最近最少使用的
- volatile-ttl:已设置过期时间的数据集中将要过期的
- volatile-random:已设置过期时间的数据集中随机
- volatile-lfu:已设置过期时间的数据集中使用频率最低的
- allkeys-lru
- allkeys-ttl
- allkeys-random
- no-enviction:默认,新写入操作报错
删除策略
- 定时删除:设置键过期时间的同时设置定时器,过期时立即删除
- 惰性删除
- 定期删除:默认每 100ms 随机抽取一些设置过期时间的监测
- 默认采用定期+惰性删除
持久化方式
- rdb(全量)
- 手动
- save:阻塞,直至 rdb 完成
- bgsave:进行 fork 操作创建子进程,由子进程生成 rdb 文件
- 自动
- save 900 2:900s 内存在 2 个写操作
- 手动
- aof(增量)
- 三种策略
- appendfsync always:每次数据更改就追加
- appendfsync everysec:每秒
- appendfsync no:并不直接调用文件同步,而是交给操作系统来处理,操作系统可以根据 buffer 填充情况/通道空闲时间等择机触发同步;这是一种普通的文件操作方式。性能较好,在物理服务器故障时,数据丢失量会因 OS 配置有关
- 重写:首先读取数据库中现有的键值对状态,然后根据类型使用一条命令来替代前面对键值对操作的多条命令
- 重写缓冲区
- redis 服务器设置了一个 AOF 重写缓冲区。这个缓冲区在创建子进程后开始使用,当 redis 服务器执行一个客户端的写请求命令,之后将这个写命令也发送到 AOF 重写缓冲区。
- 当子进程完成 AOF 日志重写之后,给父进程发送信号,父进程接收此信号后,将 AOF 重写缓冲区的内容写到新的 AOF 文件中,保持数据的一致性。
- 三种策略
- 重启后先判断有无 aof 文件,有则加载,无则判断是否有 rdb 文件,有则加载
- 4.0 后新增混合模式,将 RDB 文件的内容和增量的 AOF 日志文件存在一起。这里的 AOF 日志不再是全量的日志,而是自持久化开始到持久化结束的这段时间发生的增量 AOF 日志,通常这部分 AOF 日志很小。Redis 重启的时候,可以先加载 RDB 的内容,然后再重放增量 AOF 日志,就可以完全替代之前的 AOF 全量文件重放,恢复效率因此大幅得到提升。
事务
- multi:开始
- discard:取消
- exec:执行所有事务块内命令
- unwatch:取消 watch 命令对所有 key 的监视
- watch key[…]:监视一或多个 key,如果事务执行前 key 被修改,那么事务将被打断
高可用
- 主从模式
- 可以将数据同步到多台不同机器,在主节点宕机时仍然对外提供服务
- 读写分离
- 一般线上搭建主从环境时,为了保证数据的一致性,从节点不允许写
- 一台主,其他都为从节点
- 哨兵机制
- 功能
- 监控:不断检查主从服务器是否正常运行
- 通知:当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知
- 自动故障迁移:当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
- 功能
- Redis-cluster 去中心化分片式集群