Redis 6.x 学习笔记

参考

正文

类型

  • 字符串(strings): 一个 key 对应一个 value
  • 散列(hashes): 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
  • 列表(lists): 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
  • 集合(sets): Set 是 string 类型的无序集合。
  • 有序集合(sorted sets) : zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。成员是唯一的,但分数(score)却可以重复。
  • bitmaps: 即位图,是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素。BitMap通过最小的单位bit来进行0|1的设置,表示某个元素的值或者状态,时间复杂度为O(1)。由于 bit 是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。
  • hyperloglogs : 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
  • 地理空间(geospatial): GeoHash是一种地址编码方法。他能够把二维的空间经纬度数据编码成一个字符串。

事务

  • Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令

  • Redis 事务语法性错误会正常执行事务的其他命令,编译性错误(语法错误)则所有命令都不执行。

  • Watch 命令,乐观锁监听缓存,缓存不一致则会导致当前事务提交失败。

持久化

  • RDB (默认开启) :
    RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。三种触发持久化机制:save、bgsave、自动化。
    性能好,但数据持久化存在间隔,可能丢失数据。

  • AOF:
    工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。持久化配置:always、everysec(默认)、no。
    数据最多丢失1s,恢复慢,如果设置为 always 则影响磁盘 io。

  • RDB+AOF 混合:
    混合持久化并不是一种全新的持久化方式,而是对已有方式的优化。混合持久化只发生于 AOF 重写过程。使用了混合持久化,重写后的新 AOF 文件前半段是 RDB 格式的全量数据,后半段是 AOF 格式的增量数据。
    优点:结合 RDB 和 AOF 的优点, 更快的重写和恢复。
    缺点:AOF 文件里面的 RDB 部分不再是 AOF 格式,可读性差。

订阅发布模式

和之前用过的 WebSocket 很像,简版 RabbitMQ。

集群

哨兵模式可以自动选举主节点,当主节点出故障时自动选举出来新主节点。

  • 建议至少3台,1主2从。
  • 支持命令配置集群(重启失效)、配置文件(一直生效)配置集群。
  • 主节点可以读写,从节点只读。
  • 从节点也包含从节点,从节点也是只读不可写的。

主从复制原理

  • 从节点首次加入或重新连接,会完整复制主节点,然后新操作会追加。

哨兵模式

哨兵是Redis的一种运行模式,它专注于对Redis实例(主节点、从节点)运行状态的监控,并能够在主节点发生故障时通过一系列的机制实现选主及主从切换,实现故障转移,确保整个Redis系统的可用性。

  • 监控(Monitoring):持续监控Redis主节点、从节点是否处于预期的工作状态。
  • 通知(Notification):哨兵可以把Redis实例的运行故障信息通过API通知监控系统或者其他应用程序。
  • 自动故障恢复(Automatic failover):当主节点运行故障时,哨兵会启动自动故障恢复流程:某个从节点会升级为主节点,其他从节点会使用新的主节点进行主从复制,通知客户端使用新的主节点进行。
  • 配置中心(Configuration provider):哨兵可以作为客户端服务发现的授权源,客户端连接到哨兵请求给定服务的Redis主节点地址。如果发生故障转移,哨兵会通知新的地址。这里要注意:哨兵并不是Redis代理,只是为客户端提供了Redis主从节点的地址信息。

穿透、雪崩和击穿

  • 雪崩:雪崩就是指缓存中大批量热点数据过期后系统涌入大量查询请求,因为大部分数据在Redis层已经失效,请求渗透到数据库层,大批量请求犹如洪水一般涌入,引起数据库压力造成查询堵塞甚至宕机。
    解决:redis 高可用,主从+哨兵;限流&降级;redis 持久化,重启快速恢复;
  • 穿透:对于系统A,假设一秒 5000 个请求,结果其中 4000 个请求是黑客发出的恶意攻击。黑客发出的那 4000 个攻击,缓存中查不到,每次你去数据库里查,也查不到。直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。
    解决:每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN。然后设置一个过期时间,这样的话,下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓存中取数据。
  • 击穿:缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。
    解决:可以将热点数据设置为永远不过期;或者基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。
posted @   夏秋初  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示