Redis

Redis

基础框架:高性能(缓存...)+高可用(集群)——存(持久化)与删(删除淘汰)

基础

是什么 (定义,特点)

开源的基于内存的数据库 (内疚多缘分)

基于存:读写速度快,适用于高性能应用场景,如缓存

化:把数据存储到磁盘,方式有AOF日志,RDB快照等

数据结构:列表、哈希、集合等,灵活的应对不同场景

子性操作:支持原子性操作,维护并发环境下数据一致性

布式:提供分布式特性,数据分布多节点,提高可拓展性

为什么 (价值,意义)

高性能(缓存,读写快,降低压力,多数据结构应对场景)

高并发(缓存,原子性,降低并发压力)

单线程

  • 网络请求模块使用单线程进行处理 【2.6 4.0 6.0】
  • 速度快:基于内存、非阻塞、数据结构、I/O多路复用

数据类型与底层结构

image-20241026093913215

缓存

是什么

  • 缓存

    高速数据交换的存储器,可以更快的访问和操作数据

    • 缓存雪崩

    • 缓存击穿

    • 缓存穿透

为什么、怎么办

image-20241026094058231

集群

怎么办

主从复制

Redis 提供了主从库模式,以保证数据副本的⼀致,主从库之间采⽤的是读写分离的⽅式。

主从库同步模式:全量复制、增量复制、基于⻓连接的命令传播

主从复制同步过程:建⽴连接->主节点创建RDB快照->主节点发送RDB⽂件和AOF缓冲区内容->从节点载⼊RDB⽂件和执⾏AOF缓冲区命令->增量复制->⼼跳和命令传播

如何避免主从数据不一致:持久化和复制配置、保证⽹络稳定性、监控和报警

哨兵模式

通知监控主从服务器,并提供主从节点故障转移的功能。

工作原理:监控->故障检测->故障转移->⾃动恢复

切片集群

将数据分布在不同服务器上,以此来降低系统对单主节点的依赖

持久化

方法

AOF日志

概念:每执行一条写操作命令,就把该命令以追加方式写入文件

redis启动之初会读取该日志重构数据库以保证数据库完整

对比:redis是内存、写后日志,mysql是磁盘、写前日志

  • 写回测策略

    image-20241026211727591

  • 磁盘重写机制

    为了避免⽇志⽂件过⼤,Redis扫描数据中所有键值对,生成写操作命令并写入新的AOF日志,替换现有的AOF日志

    重写过程:⼀处拷⻉,两处⽇志

    image-20241026211803949

RDB快照

概念:将某一时刻的内存数据,以二进制的方式写入磁盘

  • RDB ⽂件的生成命令

    save 命令,在主线程⽣成 RDB ⽂件

    bgsave 命令,创建⼦进程⽣成 RDB ⽂件,避免主线程的阻塞

混合持久化

Redis4.0新方式,集成AOF与RDB的优点

过期删除

过期删除策略

  • 定时删除

    在设置 key 的过期时间时,同时创建⼀个定时事件,当时间到达时,由事件处理器⾃动执⾏ key 的删除操作。

  • 惰性删除

    不主动删除过期键,每次从数据库访问 key 时,都检测 key 是否过期,如果过期则删除该 key。

  • 定期删除

    每隔⼀段时间「随机」从数据库中取出⼀定数量的 key 进⾏检查,并删除其中的过期key。

Redis策略

「惰性删除+定期删除」

  • 惰性删除依据 expireIfNeeded 函数来实现,每次返回或者修改key之前,都会调⽤该函数检查 key 是否过期

    • 如果过期,删除该key, lazyfree_lazy_expire 参数决定是同步删除还是异步删除,然后返回 null 给 客户端

    • 如果没有过期,则返回正常的键给客户端

  • 定期删除的做法是每隔⼀段时间「随机」从数据库中取出⼀定数量的 key 进⾏检查,并删除其中的过期 key。

    • 默认每隔10s检查⼀次数据库,配置键为 hz: 10
    • 随机抽查的数量是20个key

内存淘汰

内存淘汰策略

  • 不进行数据淘汰
    • NoEviction: 如果内存不⾜以执⾏写操作,Redis将返回错误,默认的淘汰策略。
  • 进行数据淘汰
    • VolatitleLRU: 只对带有过期时间的键使⽤LRU策略,其他键使⽤NoEviction策略。
    • VolatitleLFU: 只对带有过期时间的键使⽤LFU策略,其他键使⽤NoEviction策略。
    • AllKeysLRU: 根据最近最少使⽤的原则淘汰最久未使⽤的键。
    • AllKeysLFU: 根据最少频繁使⽤的原则淘汰最少使⽤的键。

LRU与LFU区别

  • LRU(Least Recently Used)

    • 最近被访问的数据更有可能在未来被再次访问,所以选择最近最少被使⽤的对象进⾏淘 汰。
    • 在 Redis 的对象结构体中添加⼀个额外的字段,⽤于记录此数据的最后⼀次访问时间。当 Redis 进⾏内存淘汰时,会使⽤随机采样的⽅式来淘汰数据,然后淘汰最久没有使⽤的那个。
  • LFU(Least Frequently Used)

    • 使⽤频率较低的对象在未来仍然会较少被访问,所以选择使⽤频率最低的对象进⾏淘汰。
    • LFU维护⼀个使⽤计数,每当⼀个对象被访问时,其使⽤计数增加。在需要淘汰对象时,选择使⽤计数 最低的对象淘汰
posted @ 2024-10-26 09:47  MuxLz  阅读(22)  评论(0)    收藏  举报