
Redis
文章平均质量分 89
pcj_888
这个作者很懒,什么都没留下…
展开
-
Redis源码分析 —— 发布与订阅
Redis源码分析 —— 发布订阅的实现原理前言通过阅读Redis源码,配合GDB和抓包等调试手段,分析Redis发布订阅的实现原理,思考相关问题。源码版本:Redis 6.0.10思考问题发布订阅基本概念介绍订阅频道 —— SUBSCRIBE命令的实现退订频道 —— USUBSCRIBE命令的实现订阅模式 —— PSUBSCRIBE命令的实现退订模式 —— PUNSUBSCRIBE命令的实现发送消息 —— PUBLISH命令的实现Redis发布订阅的特点为什么设计pubsub_原创 2022-01-29 23:05:28 · 4339 阅读 · 1 评论 -
Redis源码分析(四)—— ziplist的设计与实现
背景ziplist是一种为节约内存而开发的数据结构,本质是一个字节数组。ziplist是列表键和哈希键的底层实现之一,也用于quicklist的实现。问题思考双向链表结构,在存储数据本身长度远小于链表节点大小的场景下,有严重的内存浪费问题。针对这种情况,Redis设计了ziplist这种节约内存的数据结构。以下给出ziplist相关的思考问题,了解ziplist的实现原理和设计思路。ziplist的数据结构ziplist节点构成为什么要设计ziplistziplist相关操作查找指定节原创 2021-12-30 00:33:27 · 1959 阅读 · 0 评论 -
Redis源码分析(三)—— 字典的设计与实现
前言字典是一种用于保存键值对的数据结构,Redis数据库使用字典做为底层实现,字典也是哈希键的底层实现之一。C语言中并没有内置字典这个数据结构,Redis自己实现了字典。以下结合源码分析Redis字典的设计与实现,源码版本:Redis 6.0.10问题思考C语言中如何设计一个通用的字典和哈希表?字典的设计与实现哈希表和哈希表节点的设计字典的数据结构设计如何设计多态字典哈希算法为什么数组长度设计为2的n次方如何解决键冲突rehash操作为什么要rehash原创 2021-12-21 00:40:21 · 980 阅读 · 0 评论 -
Redis源码分析(二)—— 链表的设计与实现
前言链表在Redis中的应用非常广泛,链表是列表键的底层实现之一,发布订阅,慢查询,监视器等功能也用到了链表。以下给出Redis中链表相关的一些思考问题,通过源码分析,给出问题的答案,掌握链表的底层实现原理和设计思路。源码版本:Redis 6.0.10问题思考C语言中如何设计一个通用的泛型链表?Redis中的链表和链表节点的实现节点值的类型是void *,这样设计有什么好处?仅使用多个listNode也能组成链表,为什么还要额外用一个list结构去持有链表?为什么用双向链表,不用单链原创 2021-12-12 16:33:51 · 1346 阅读 · 0 评论 -
Redis源码分析(一)—— 简单动态字符串
前言Redis是用C语言开发的,但并没有直接使用C语言数组去表示字符串,而是使用简单动态字符串(Simple dynamic String,简称SDS)作为字符串的底层实现。以下给出SDS相关的一些常见问题,通过源码分析和实际验证,思考这些问题的答案,了解实现原理。源码版本:Redis 3.0.0Redis 6.0.10思考问题SDS的数据结构,字符串如何表示的SDS结构体各成员的作用创建给定C字符串的SDS场景,sdshdr结构体各成员初值是多少SDS相较于C风格字符串的优点原创 2021-12-11 21:20:01 · 935 阅读 · 0 评论 -
Redis学习笔记(九):AOF持久化
目录简介1. AOF持久化的实现1.1 命令追加1.2 文件写入和同步1.3 AOF重写1.4 AOF后台重写1.5 如何通过AOF文件还原数据库2. AOF配置选项3. AOF和RDB比较参考资料简介Redis提供了AOF(append only file)持久化功能,通过保存服务器执行的写命令的方式记录数据库状态。本文介绍如下内容:AOF持久化的实现 (命令追加、文件写入、AOF重写、AOF后台重写)如何通过AOF文件还原数据库AOF持久化的配置选项AOF和RDB两种持久化方式的比较1原创 2021-03-20 15:16:26 · 361 阅读 · 0 评论 -
Redis学习笔记(八):RDB持久化
目录简介RDB持久化1. RDB文件如何创建1.1 save, bgsave命令1.2 定期触发1.2.1 保存条件怎么设置1.2.2 实现细节2. RDB文件如何加载3. RDB文件结构和解析方法参考资料简介Redis是基于内存的数据库,服务器进程退出后,内存中的数据会丢失。为了解决这个问题,Redis提供了RDB持久化机制,将内存中的数据保存到硬盘,从而避免数据意外丢失。RDB持久化RDB持久化将某个时间点上的数据库状态保存到一个RDB文件,这个RDB文件是一个经过压缩的二进制文件,Redis服原创 2021-03-14 14:30:58 · 925 阅读 · 0 评论 -
Redis学习笔记(七):数据库
文章目录前言1. 服务器中的数据库2. 客户端切换数据库3. 数据库键空间、增删改查操作查询键的实现增加键的实现删除键的实现更新键的实现其他对键空间的操作4. 键的生存时间如何设置键的生存时间?TIME命令介绍redis如何保存过期时间?redis如何移除过期时间?怎么判断一个key是否过期5. 过期键删除策略Redis使用的过期键删除策略惰性删除定期删除参考资料前言详细介绍Redis数据库的实现,解答以下几个问题:Redis服务器是怎么保存数据库的?客户端又是怎么切换数据库的?数据库的增、删、改原创 2021-03-13 22:18:57 · 165 阅读 · 0 评论 -
Redis学习笔记(六):对象系统
前言Redis没有直接使用基础数据结构来实现数据库,而是基于这些数据结构创建了一个对象系统。这个系统包含字符串对象、列表对象、哈希对象、集合对象、有序集合对象。Redis3.0中的6种基础数据结构数据结构应用场景简单动态字符串保存字符串值链表列表键,发布与订阅,慢查询,监视器字典哈希键,数据库键空间跳跃表有序集合键整数集合集合键压缩列表列表键、哈希键对象的类型和编码Redis使用对象表示数据库中的键和值,每次在Redis新建一个键值原创 2021-01-23 16:55:22 · 152 阅读 · 0 评论 -
Redis学习笔记(五):整数集合
前言Redis中,整数集合是集合键的底层之一。当一个集合只包含整数元素,且这个集合中元素个数不多的情况下,Redis就会使用整数集合作为集合键的底层实现。整数集合的实现0. 数据结构设计以Redis6.0源码为例,整数集合由intset.c/intset结构定义,数据结构设计如下:typedef struct intset { uint32_t encoding; // 编码方式 uint32_t length; // 集合中的元素个数 int8_t conten原创 2020-12-06 16:18:36 · 291 阅读 · 0 评论 -
Redis学习笔记(四):跳跃表
前言跳跃表是一种以O(log N)期望时间支持查找、插入、删除操作的、有序的数据结构。Redis使用跳跃表作为有序集合键的底层实现之一。跳表的基本实现原理参考:《Skip lists: a probabilistic alternative to balanced trees》Redis中的跳表实现Redis的跳表由zskiplistNode, zskiplist两个数据结构定义。跳跃表节点的实现如下,由redis.h/zskiplistNode定义:/* ZSETs use a specia原创 2021-01-23 16:46:24 · 227 阅读 · 0 评论 -
hiredis查询失败时出现key丢失问题定位
问题描述hiredis查询key失败后,出现key丢失的问题。REDIS版本及源码:6.0.10hiredis版本及源码:v1.0.2案例描述:REDIS中预先写入1个字符串键"hello",客户端代码基于hiredis,创建100个读线程和100个写线程,每个线程里发起一次短连接读写key,代码参考:#include <assert.h>#include <stdio.h>#include <string.h>#include <unistd.h原创 2021-11-30 01:00:32 · 912 阅读 · 0 评论 -
Redis抓包分析案例一则
问题描述业务背景: 有一台由多个Docker容器组成的仿真设备环境,1个Docker部署Redis服务端,剩余每个Docker都作为Redis客户端,用于模拟一块单板。问题: 仿真设备启动中,概率出现Redis的某个字符串键被不符合预期地改写成空串,导致客户端Docker从Redis获取的数据有问题。需要定位是哪个Docker上的哪个进程改写了Redis数据库。定位思路先尝试排查客户端代码。但此案例中涉及业务代码过多(200w+行代码),且Redis客户端的形式也很多(有goredis, redi原创 2021-11-06 12:25:10 · 1633 阅读 · 0 评论 -
Redis查看订阅的模式串详细内容
问题描述pubsub channels可以查看Redis中被订阅的频道(channel):pubsub numpat可以查看被订阅的模式(pattern)数量:# redis-cli pubsub numpat(integer) 3问题:除了查看被订阅模式的数量,我还需要获取每个订阅模式字符串的内容,怎么做 ?解决方法google没搜到现成的命令,决定自己修改redis-server源码,打印模式链表的内容,用时3~5分钟,需要了解:Redis源码编译方法,参考官网或本人的博客原创 2021-11-21 14:14:53 · 1999 阅读 · 0 评论