求阙厅

春有百花秋有月,夏有凉风冬有雪。若无闲事挂心头,便是人间好时节。

Redis 系列 基数树

开启 redis 探索新篇章

Rax 是 Redis 内部比较特殊的一个数据结构,它是一个有序字典树 (基数树 Radix Tree),按照 key 的字典序排列,支持快速地定位、插入和删除操作。Redis 五大基础数据结构里面,能作为字典使用的有 hash 和 zset。hash 不具备排序功能,zset 则是按照 score 进行排序的。rax 跟 zset 的不同在于它是按照 key 进行排序的。Redis 作者认...

Redis 系列 压缩列表

开启 redis 探索新篇章

压缩列表(ziplist)是列表(List)和散列(Hash)、有序集合(zset)的底层实现之一。 概述 压缩列表是 Redis 为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构。一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值。 数据结构 1 2 3 4 5 6 7 struct zi...

Redis 系列 位图

开启 redis 探索新篇章

Redis 提供了位图数据结构。 位图不是特殊的数据结构,它的内容其实就是普通的字符串,也就是 byte 数组。可以使用普通的 get/set 直接获取和设置整个位图的内容,也可以使用位图操作 getbit/setbit 等将 byte 数组看成「位数组」来处理。 使用方法 Redis 的位数组是自动扩展,如果设置了某个偏移位置超出了现有的内容范围,就会自动将位数组进行零扩充。

Redis 系列 线程 IO 模型

开启 redis 探索新篇章

RESP(Redis Serialization Protocol) 是 Redis 序列化协议的简写。它是一种直观的文本协议,优势在于实现异常简单,解析性能极好。 Redis 协议里有大量冗余的回车换行符,但是这不影响它成为互联网技术领域非常受欢迎的一个文本协议。有很多开源项目使用 RESP 作为它的通讯协议。在技术领域性能并不总是一切,还有简单性、易理解性和易实现性,这些都需...

Redis 系列 线程模型

开启 redis 探索新篇章

Redis 将所有数据都放在内存,用一个单线程对外提供服务,单个节点在跑满一个 CPU 核心的情况下可以达到了 10w/s 的超高 QPS。 Redis线程模型 Redis 内部使用文件事件处理器file event handler,这个文件事件处理器是单线程的,所以才称 Redis 为单线程模型。它采用 IO 多路复用机制同时监听多个 socket,将产生事件的 socket ...

Redis 系列 游标查询(scan)

开启 redis 探索新篇章

暴力 Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key。 存在问题 没有 offset、limit 参数,一次性吐出所有满足条件的 key keys 算法是遍历算法,复杂度是 O(n),如果实例中有千万级以上的 key,这个指令就会导致 Redis 服务卡顿,所有读写 Redis 的其它的指令都会被延后甚至会超时报错,因为 Redi...

Redis 系列 消息队列

开启 redis 探索新篇章

对于只有一组消费者的消息队列,使用 Redis 就可以非常轻松的搞定。Redis 的消息队列不是专业的消息队列,它没有非常多的高级特性,没有 ack 保证,如果对消息的可靠性有着极致的追求,那么它就不适合使用。 异步队列 Redis 的 list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列,使用lpop 和 rpop来出队列。 队列空等待...

Redis 系列 哨兵(HA组件)

哨兵 是 Redis 早期提供的高可用方案来抵抗节点故障,当故障发生时可自动进行从主切换。

早期的 Redis 多组 Master-Slave 之间 是没有交互的(相对独立),而故障检测和转移的动作则由哨兵(Sentinel)集群 完成,架构如下图: 可将 Redis Sentinel 集群看成一个 ZooKeeper 集群,它是集群高可用的心脏,它一般是由 3~5 个节点组成。这样挂了个别节点后,集群还可以正常运转。 它负责持续监控主从节点的健康,当主...

Redis 系列 分布式锁

开启 redis 探索新篇章

锁要解决的就是 资源竞争的问题,也就是要把执行的指令顺序化。 分布式锁本质上要实现的目标就是在 Redis 里面占资源,占资源一般是使用 setnx(set if not exists) 指令,只允许被一个客户端占用。先来先占, 用完了,再调用 del 指令释放。 所谓原子操作是指不会被线程调度机制打断的操作。这种操作一旦开始,就一直运行到结束,中间不会有任何 contex...

Redis 系列 内存淘汰

开启 redis 探索新篇章

当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap)。交换会让 Redis 的性能急剧下降。 内存淘汰策略: noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键。 allkeys-lru:首先通过 LRU 算法驱逐最久没有使用的键。 volatile-lru:首先从设置了过期时间的键集合中驱逐最久没有使用的...