redis(一)

导航

数据类型

  • 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 去中心化分片式集群