Redis 6.x 版本之后可以使用 docker 镜像部署集群模式,因而可以在 WSL2 中使用 docker compose 部署三主三从的 Redis 集群用以实战。 PS: docker compose 的相关资料可以参见: Docker Compose | 菜鸟教程 在部署的过程中发现,由于 WSL2 的网络设置问题,使用 docker host 模式部署存在问题,因而这次是在 brige 模式下部署的。因此,造成了一个问题——无法在子网外进行访问。 此次,WSL2 中的镜像为 Ubuntu,并且已经安装…

2022年2月18日 1条评论 1008点热度 0人点赞 agedcat_xuanzai 阅读全文

字典也被称为映射(map),经常作为一种数据结构内置在很多高级编程语言里面。但是Redis所使用的C语言并没有内置这种数据结构,因此Redis构建了自己的字典实现。 字典在Redis中的应用相当广泛,比如Redis的数据库就是使用字典来作为底层实现的,对数据库的增删改查也是构建在对字典的操作之上的。字典还是哈希键的底层实现之一。当一个哈希键包含的键值对比较多,又或者键值对中的元素都是比较长的字符串时,Redis就会使用字典作为哈希键的底层实现。 字典的实现 Redis 的字典使用哈希表作为底层实现, 一个哈希表里面…

2021年10月18日 0条评论 658点热度 1人点赞 agedcat_xuanzai 阅读全文

整数集合(Intset)是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现。 整数集合的实现 整数集合(intset)是 Redis 用于保存整数值的集合抽象数据结构, 它可以保存类型为 int16_t 、 int32_t 或者 int64_t 的整数值, 并且保证集合中不会出现重复元素。 每个 intset.h/intset 结构表示一个整数集合: typedef struct intset { // 编码方式 uint32_t…

2021年10月18日 0条评论 960点热度 1人点赞 agedcat_xuanzai 阅读全文

压缩列表(ziplist)是列表键和哈希键的底层实现之一。 当一个列表键只包含少量列表项, 并且每个列表项要么就是小整数值, 要么就是长度比较短的字符串, 那么 Redis 就会使用压缩列表来做列表键的底层实现。 另外, 当一个哈希键只包含少量键值对, 并且每个键值对的键和值要么就是小整数值, 要么就是长度比较短的字符串, 那么 Redis 就会使用压缩列表来做哈希键的底层实现。 压缩列表的实现 压缩列表是 Redis 为了节约内存而开发的, 由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构…

2021年10月18日 0条评论 1212点热度 1人点赞 agedcat_xuanzai 阅读全文

跳跃表是基于链表实现的有序列表,将查询的时间复杂度优化到了$O(logn)$。 Redis使用跳跃表作为有序集合键的底层实现之一。如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现。 实际上,Redis只在两个地方用到了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构。 跳跃表的实现 Redis 的跳跃表由 redis.h/zskiplistNode 和 redis.h/zskiplist 两个结构定义, 其中 z…

2021年10月18日 0条评论 544点热度 1人点赞 agedcat_xuanzai 阅读全文

Redis是内存数据库,它所有的数据都保存在内存里面。如果服务器宕机,服务器中的数据就会丢失。为了解决这个问题,Redis提供了持久化的功能,可以将Redis在内存中的数据库状态保存到磁盘里面,避免数据意外丢失。 Redis的持久化方法分为RDB持久化和AOF持久化两种。 RDB持久化 redis中的RDB持久化方法是以数据快照的方式将某个时间点上的数据库状态保存到一个RDB文件中。 持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过这个文件可以还原生成RDB文件时的数据库状态。 这两个过程如下图: 创建…

2021年9月14日 0条评论 938点热度 3人点赞 agedcat_xuanzai 阅读全文

链表是一种常用的数据结构,因为Redis使用的C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现。 链表在Redis中的应用非常广泛,比如列表键的底层实现之一就是链表。 链表的实现 每个链表节点使用一个 adlist.h/listNode 结构来表示: typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value; } listNode; 多个 li…

2021年9月7日 0条评论 1104点热度 1人点赞 agedcat_xuanzai 阅读全文

Redis中的字符串的底层实现并没有简单的使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串的数据结构来表示字符串。 SDS的作用主要有两个:其一是用来保存数据库中的字符串值;其二是被用作缓冲区,比如AOF模块中的AOF缓冲区以及客户端状态中的输入缓冲区。 SDS的定义 SDS结构的定义如下: struct sdshdr{ //记录buf数组中已经使用字节的数量 //等于SDS所保存字符串的长度 int len; //记录buf数组中未使用字节的数量 int free; //字节数组,用于保存字符串 …

2021年9月7日 2条评论 1062点热度 3人点赞 agedcat_xuanzai 阅读全文