
redis
Yisnow.
这个作者很懒,什么都没留下…
展开
-
redis集群
1、节点 一个节点就是一个运行在集群模式下的redis服务器; 集群数据结构 clusterNode: 每个节点都保存着一个clusterState结构,这个结构记录了在当前节点的视角下,集群目前所处的状态:集群是在线还是下线、集群包含多少个节点、集群当前的配置纪元; cluster meet指令的实现 假如向A发送这个命令。 A为B创建一个clusterNode结构,将其添加到clusterState.nodes字典里面; A根据指令中给出的IP地址和端口号,向节点B发送一条meet消息; B为A原创 2020-10-04 10:02:26 · 414 阅读 · 0 评论 -
redis10:多机数据库之一
1、复制 通过执行slaveof让一个服务器去复制另一个服务器。 1.1、旧版复制功能的实现 分为同步和命令传播两个操作: 同步操作将从服务器数据库状态更新至主服务器当前所处的数据库状态; 命令传播操作则用于在主服务器的状态被修改时导致主从服务器的状态出现不一致时,让主从服务器数据库重新回到一致状态。 同步步骤 从服务器向主服务器发送SYNC命令; 收到SYNC命令的主服务器执行BGSAVE,在后台生成一个RDB文件,并使用一个缓冲区记录出现在开始执行的所有写命令 当主服务器的BGSAVE命令执行完毕原创 2020-10-03 20:00:34 · 270 阅读 · 0 评论 -
redis9:持久化
redis的RDB持久化功能,可以将redis在内存中的数据库状态保存到磁盘里面,避免数据意外丢失。 1、RDB文件的创建和载入 SAVE命令会阻塞服务器进程直到文件创建完毕为止,期间服务器不能执行任何命令请求。 BGSAVE会派生出一个子进程由子进程负责创建RDB文件,服务器进行继续处理命令请求。 RDB文件的载入工作是在服务器启动时自动执行的。只要检测到RDB文件的存在,会自动载入。 AOF文件的更新频率通常比RDB文件的更新频率高,所以服务器开启了AOF持久化,服务器会优先使用AOF文件还原数据库状原创 2020-10-03 13:47:44 · 188 阅读 · 0 评论 -
redis8:过期键1删除策略
1、定时删除: 在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时立即执行对键的删除操作。 对内存是友好的:通过使用定时器,可以保证过期键会尽可能快地被删除,并释放过期键占有的内存。 对CPU时间是最不友好的:在过期键比较多的情况下,删除过期键会占用相当一部分CPU时间; 如果正有大量的命令请求在等待服务器处理,服务器当前不缺少内存,那么服务器应该优先将CPU时间用在处理客户端的命令请求上面,而非删除过期键上面。 2、惰性删除: 放任键过期不管,每次从键空间中获取键时,都先检查键原创 2020-10-02 19:18:32 · 151 阅读 · 0 评论 -
redis7:对象
之前介绍的redis用到的主要数据结构如SDS、双端链表、字典、压缩列表、整数集合。Redis并没有直接使用这些数据结构实现键值对数据库,而是基于这些数据结构创建了一个对象系统,包括字符串对象、列表对象、哈希对象、集合对象、有序集合对象。每种对象都用到了至少一种前面所介绍的数据结构。 通过这五种不同类型的对象,redis在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。 redis的对象还实现了基于引用计数技术的内存回收机制,当程序不再需要某个对象的时候,这个对象占用的内粗被释原创 2020-10-02 18:11:07 · 214 阅读 · 0 评论 -
redis6:ziplist
1、介绍 ziplist体现了redis对于存储效率的追求,一个普通的双向链表,其中每一项都占用独立的一块内存,各项之间使用地址指针连接起来,这种方式会带来大量的内存碎片,而且地址指针也会占用额外的内存。而ziplist将表中每一项放在连续地址空间内,一个ziplist占用一大块内存,他是一个list而非linked list。 ziplist在细节上节省内存,对于值的存储采用了变长的编码方式,对于大的整数就多用一些字节来存储,对于小的整数就少用一些字节来存储。 2、ziplist的构成 压缩列表是原创 2020-10-02 11:30:10 · 202 阅读 · 0 评论 -
redis5:intset
1、介绍 当一个集合只包含整数值元素,且集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。 typedef struct intset { //编码方式 uint32_t encoding; //集合包含的元素数量 uint32_t length; //保存元素的数组 int8_t contents[]; } intset; contents数组是intset的底层实现:整数集合的每个元素都是contents数组的一个数组项,各个项在数组中原创 2020-10-02 10:12:03 · 123 阅读 · 0 评论 -
Redis4:跳表sliplist
skiplist是一种有序数据结构,通过在每个节点中维持多个指针指向其他指针,从而达到快速访问节点的目的; 平均查找O(NlogN),最坏O(N)的时间复杂度。 大部分情况下,skiplist效率可以跟平衡树相媲美,且实现更简单。 Redis使用skiplist作为有序集合键的底层实现之一 1、skiplist的实现 typedef struct zskiplistNode { robj *obj; double score; struct zskiplistNode *back.原创 2020-10-02 09:38:54 · 161 阅读 · 0 评论 -
Redis3:字典
1.1 哈希算法 先根据键值对的键计算出哈希值和索引值。 //根据字典设置的哈希函数计算key的哈希值 hash=dict->type->hashFunction(key); //使用哈希表的sizemask属性和哈希值,计算索引值 index=hash&dict->ht[x].sizemask; 当字典被用于数据库的底层实现,Redis使用MurmurHash2算法计算键的哈希值。 Murmur可以计算字符串的hash code,基本思想就是把key分成n组,每组4个字符,把.原创 2020-10-01 20:27:22 · 110 阅读 · 0 评论 -
Redis2:链表
Redis链表实现的特性: 双端:双向链表,获取某个节点的前置节点和后置节点都是O(1); 无环: 带表头指针和表尾指针 带链表长度计数器: 多态 typedef struct list{ //表头节点 listNode *head; //表尾节点 listNode *tail; //链表所包含的节点数量 unsigned long len; //节点值复制函数 void *(*dup)(void *ptr); //节点值释放函数.原创 2020-10-01 18:47:11 · 148 阅读 · 0 评论 -
Redis1:简单动态字符串SDS
1、SDS的定义 len:buf数组中使用字节的数量 free:buff数组中未使用字节的数量 2、SDS与C字符串的区别 2.1 获取字符串长度的复杂度 C字符串不记录自身的长度信息,为了获取C字符串的长度,程序必须遍历整个字符串。 SDS在len属性中记录了SDS本身的长度。 Redis将获取字符串长度所需的时间复杂度降低到了O(1),确保了获取字符串长度的工作不会成为Redis的性能瓶颈。 2.2 杜绝缓冲区的溢出 C字符串不记录自身长度带来的一个问题是容易造成缓冲区溢出。比如strcat函数原创 2020-10-01 17:13:14 · 105 阅读 · 0 评论 -
Redis缓存穿透、缓存击穿、缓存雪崩
1、缓存穿透 查询一个数据库一定不存在的数据。 解决方法 1、布隆过滤器 布隆过滤器是一个bit向量或者bit。对于一个key,我们要映射到布隆过滤器,使用多个不同的哈希函数生成多个哈希值,并把每个生成的哈希值指向的bit设置为1。 原理:当查询时,把key使用不同的哈希函数进行计算,若对应的bit均为1,则布隆过滤器判断该key存在。 从上图可以看到,不同的词对应的bit位置可能相同,当词比较多的时候,可能大部分bit位置都是1。布隆过滤器判断不存在的词一定不存在,判断存在的可能不存在。 2、缓存空转载 2020-09-20 13:59:03 · 157 阅读 · 0 评论