首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏浪浪山下那个村

    Redis源码Redis 6 ACL源码详解

    简介 本文主要是讲解Redis 6的ACL的实现原理。基本使用详见:Redis 6.0新特性——ACLs,以及Redis启动过程分析。 启动初始化 初始化默认用户 ACL子模块在Redis启动过程中初始化,下面代码主要是初始化ACL的结构: /* * 初始化ACL子系统 * */ void ACLInit(void) { Redis ACL配置信息主要有两种方式: 在redis.conf文件中通过user 配置项配置的ACL信息。 比如:user worker +@list +@connection ~jobs:* on >ffa9203c493aa99 在redis.conf中配置aclfile所配置的文件中。 格式如下图所示: 通过user方式 通过加载redis.conf配置文件中读取user配置项加载ACL信息。

    80730编辑于 2022-08-26
  • 来自专栏C++小白

    Redis使用及源码剖析-5.Redis跳跃表-2021-1-19

    文章目录 前言 一、跳表节点实现 二、跳表实现 三、跳表API 1、随机生成层数 2、创建跳表节点 3、创建跳表 4、计算节点排位 5、插入新节点 6、删除节点 总结 前言 跳跃表是Redis的底层数据结构之一 Redis跳表实现涉及redis.h 中的 zskiplist 结构和 zskiplistNode 结构, 以及 t_zset.c 中所有以 zsl 开头的函数, 比如 zslCreate 、 zslInsert 、 zslDeleteNode ,本文将详细分析Redis跳表的实现。 一、跳表节点实现 Redis跳跃表节点实现代码如下: /* * 跳跃表节点 */ typedef struct zskiplistNode { // 成员对象 robj *obj; equalStringObjects(x->obj,o)) { return rank; } } // 没找到 return 0; } 5

    60840编辑于 2022-02-22
  • 来自专栏浪浪山下那个村

    Redis源码Redis事件监听

    简介 Redis服务器是典型的事件驱动程序,而事件又分为文件事件(socket的可读可写事件)与时间事件(定时任务)两大类。 有多个定时任务,因此理论上应该有多个时间事件,多个时间事件形成链表, timeEventHead即为时间事件链表头节点;Redis服务器需要阻塞等待文件事件的发生,进程阻塞之前会调用beforesleep Redis底层可以使用4种I/O多路复用模型(kqueue、epoll等), apidata是对这4种模型的进一步封装。 文件监听事件 Redis客户端通过TCP socket与服务端交互,文件事件指的就是socket的可读可写事件。socket读写操作有阻塞与非阻塞之分。 Redis创建时间事件节点的函数为aeCreateTimeEvent,内部实现非常简单,只是创建时间事件并添加到时间事件链表。

    82130编辑于 2022-08-26
  • 来自专栏歪歪梯Club

    Redis源码阅读

    zipmap redis旧版小hash使用的数据结构,紧密数组存储结构 用1字节存储总节点数(如果1字节满了,代表需要遍历到底才知道有多少节点) 每个节点存储自己占用的内存空间,修改删除后,标记为闲置空间 adlist 环形双端链表,没啥好说的 dict 这里比较特别的是一个字典里会有最多两个hash表同时存在,目的是rehash的时候可以做渐进式hash table的结构是个数组,每个元素是一条链表,redis bucket时,把缩容一次后会聚拢到该bucket的bucket也遍历了,也就是idx与(idx + size/2) % size 比如size是8,缩容后就是4,所以对size为8的遍历就是 0->4 1->5 2->6 3->7 基于idx与idx + size/2这个公式得到的bucket 源码里把这用一个数学公式体现(反序+1后再反序) //每次从高位进1 000 0 -》 100 4 001 1 -》 101 5 010 2 -》 110 6 011 3- 》 111 7

    56920发布于 2021-10-11
  • 来自专栏编程从踩坑到跳坑

    源码-调试Redis

    # 源码-调试Redis 在阅读源码的时候,通过debug调试的方式逐行去理解代码的意思,不免是一个好的方式。 第一步: 在src目录下新建一个文件learn.h,在这里面定义入口 #ifndef REDIS_LEARN_H #define REDIS_LEARN_H int learn(); #endif */ unsigned char *zl = ziplistNew(); char *s = "dhbh"; zl = ziplistPush(zl, (void *) s, 5, quicklistPushHead(list, "hello", 6); // quicklistPushHead(list, "xxx", 4); // quicklistPushHead(list, "xxxx", 5) = NULL) redis_check_rdb_main(argc,argv,NULL); else if (strstr(argv[0],"redis-check-aof")

    42020编辑于 2023-10-21
  • 来自专栏用户6296428的专栏

    Redis源码解析

    redis的底层实现是十分简单的,核心源码也仅有几万行。本文就带大家来领略,小小的redis是如何实现这些复杂功能的。 *注:本文介绍的源码redis 5.0.14版本 * 二、字符串 C语言存储字符串的问题: 二进制安全 C语言中表示字符串结尾的符号是'\0',如果字符串本身就具有'\0'字符,就会被截断,即非二进制安全 即多浪费了30%的空间,redis的跳表使用了较低的空间成本,实现了时间复杂度的大减少 3.3.3 插入节点 插入节点总的来说一共四步 查找插入位置 调整高度 插入节点 调整backward 源码如下 源码注解的例子。 工作中我们也常常使用redis进行各种逻辑的处理,而了解其源码可以避免踩很多坑。

    2K20编辑于 2022-04-06
  • 来自专栏技术博文

    redis源码安装

    bin的目录,里面包括了以下文件: redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server redis-server :Redis服务器的daemon启动程序 redis-cli:Redis命令行操作工具。 redis #将报以下错误: redis服务不支持chkconfig #为此,我们需要更改redis脚本。 /redis/bin/redis-cli #将redis配置文件拷贝到/etc/redis/${REDISPORT}.conf mkdir /etc/redis cp /data/tgz/redis -3.0.7/redis.conf /etc/redis/6379.conf cp /data/tgz/redis-3.0.7/redis.conf /data/apps/redis/bin/redis.conf

    1.1K60发布于 2018-04-16
  • 来自专栏全栈程序员必看

    redis源码 -ziplist

    * 前一个条目的长度这样编码:如果长度小于254bytes,只用一个字节表示长度;如果长度大于等于254, 需要用5个字节。 When the length is greater than or * equal to 254, it will consume 5 bytes. entry的数量 ZIPLIST_LENGTH(zl) = 0; // 结束字节 zl[bytes-1] = ZIP_END; return zl; } resize的源码 要插入节点的长度需要5个字节,此时next节点的需要从1 byte增加到5 byte。增加字节是简单的, 但是增加prevlen字节后,next节点的长度也发生了变化。 那就将p-4后面的数据偏移到p+reqlen nextdiff == -4:原先p节点需要5个字节来存储上一个节点的长度,现在只需要1个字节。

    39420编辑于 2022-07-25
  • 来自专栏浪浪山下那个村

    Redis源码Redis命令执行过程

    简介 需要了解Redis命令执行过程,请先了解Redis启动过程和Redis事件监听。 Redis启动过程分析 Redis事件监听 在Redis事件监听中我们了解到在创建文件监听事件的时候 acceptTcpHandler就是的执行函数。 创建Redis连接。 listLength(server.ready_keys)) handleClientsBlockedOnKeys(); } return C_OK; } 命令表详见:《Redis

    57120编辑于 2022-08-26
  • 来自专栏浪浪山下那个村

    Redis源码Redis Set命令详解

    我们知道,Redis在解析命令行参数时,会将各个参数解析成robj类型,当expire值不为NULL则表示需要设置key的超时时间。 它由下列5个值来表示不同的含义: #define OBJ_SET_NO_FLAGS 0 #define OBJ_SET_NX (1<<0) //标识key没有被设置过 #define OBJ_SET_XX 通过以上5个步骤,我们来看一下set key1100现在的第2个参数的 数据库添加key-value 当将value值优化好之后,调用setGenericCommand函数将keyvalue设置到数据库 Redis将所有含有超时时间的key存储到redisDb的expire字典内,ttl命令可以快速确定key的超时秒数,就是通过查找这个字典实现的。 通过以上4个步骤已经成功地将一个key-value设置到Redis的数据库中。

    1.9K20编辑于 2022-08-26
  • 来自专栏Golang开发

    Redis(5)——set

    spo" 2) "it" sunion 集合的并集 127.0.0.1:6379> sunion user_1 user_2 1) "mus" 2) "spo" 3) "his" 4) "news" 5) user_1 user_2 (integer) 6 127.0.0.1:6379> smembers user_union1_2 1) "mus" 2) "spo" 3) "his" 4) "news" 5) ) "his" 2) "mus" 内部编码 集合类型的内部编码有2种: intset 整数集合:当集合类型元素都是整数且个数小于list-max-intlist-entries配置(默认512个),redis hashtable哈希表当集合类型无法满足intset的条件是,redis会使用hashtable作为列表的内部实现。

    44620发布于 2019-05-29
  • 来自专栏同步文章

    5.redis

    安装redis需要c语言的编译环境。如果没有gcc需要在线安装。yuminstall gcc-c++ 安装步骤: 第一步:redis源码包上传到linux系统。 第二步:解压缩redis。 进入redis源码目录。make 第四步:安装。makeinstall PREFIX=/usr/local/redis PREFIX参数指定redis的安装目录。 rpush list1 1 2 3 4 (integer) 8 192.168.25.153:6379> lrange list1 0 -1 1) "d" 2) "c" 3) "b" 4) "a" 5) 5.有序集合类型SortedSet(zset): 有顺序,不能重复 192.168.25.153:6379> zadd zset1 2 a 5 b1 c 6 d (integer) 4 192.168.25.153 5) "d" 6) "6" 192.168.25.153:6379> zrevrange zset1 0-1 withscores 1) "d" 2) "6" 3) "b" 4) "5" 5) "c"

    28940编辑于 2023-10-12
  • 来自专栏兜兜毛毛

    Redis ZSet (5

    a (integer) 4 # 获取数据是有序的 127.0.0.1:6379> zrange lzset 0 -1 withscores 1) "a" 2) "1" 3) "b" 4) "10" 5) redis.conf配置 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 超过阈值之后,使用skiplist+dict存储。 在插入一个数据的时候,决定要放到那一层,取决于一个算法(在redis中t_zset.c有一个zslRandomLevel这个方法)。 现在当我们想查找数据的时候,可以先沿着这个新链表进行查找。 *最大的层数*/ } zskiplist; typedef struct zset { dict *dict; zskiplist *zsl; } zset; 随机获取层数的函数:(源码

    49930发布于 2020-03-19
  • 来自专栏技术杂记

    Redis 复制5

    OKkeys * *6$1d$1c$19$1b$1a$18master 上也多了一个 dump.rdb 文件127.0.0.1:6379> keys * 1) "b"2) "a"3) "c"4) "8"5) > 127.0.0.1:6379> quit[root@m1 ~]# lsanaconda-ks.cfg Downloads install.log.syslog Pictures redis -3.0.0.tar.gz redis-new.conf tmpDesktop dump.rdb log Public redis.conf redis_slave_on_m1.conf VideosDocuments install.log Music redis -3.0.0 redis.log Templates[root@m1 ~]#

    35220编辑于 2022-07-09
  • 来自专栏浪浪山下那个村

    Redis源码Redis 启动过程分析

    简介 由于本人目前是华为FusionInsight HD 中Redis组件的Owner,所以要对Redis进行深入的了解,这对于C语言水平不咋地的我来讲还是有点难度的,于是我决定先从Redis的启动开始看 配置初始化 Redis服务启动首先做的第一步就是初始化配置。Redis初始化配置主要包括初始化命令表和加载配置两部分。 初始化ACL 权限信息 主要是通过加载redis.conf配置文件里面的配置信息,用于控制登录用户执行命令的权限,仔细详见:Redis 6 ACL源码详解 初始化命令表 在函数populateCommandTable ()/redis_check_aof_main()检查RDB/AOF文件的完整性。 这个设计就是以Redis启动时多消耗一些时间为代价,换取运行的更小的延迟。

    81150编辑于 2022-08-26
  • 来自专栏CSDN搜“看,未来”

    redis源码分析】redis cluster 集群实现

    文章目录 redis集群概述 客户端重定向 槽位迁移 redis cluster 的运行流程 redis集群概述 哨兵、主从、集群,一串下来。 所以本文的重心也就很明确了:redis集群是如何实现通信及数据分片、流量分发的 关于实操:【redis】闲得无聊,来聊聊当下爆火的 redis集群,顺便搭一个玩玩呗 客户端重定向 如果cluster中的某个节点收到客户端请求 return; } } /* Sanity check */ if (getLongFromObjectOrReply(c,c->argv[5] 5 : 4)); if (server.cluster_enabled) serverAssertWithInfo(c,NULL, 1、节点启动 2、节点握手,参见主从握手 3、指派槽位 4、建立主从关系 5、节点通信:Gossip算法 6、故障转移,故障转移机制与哨兵基本一致

    73230编辑于 2022-01-10
  • 来自专栏浪浪山下那个村

    Redis源码】setrange命令

    与append命令一样,原key在Redis中不存在时,Redis会创建一个robj对象,并将robj先设置到数据库;当key在Redis中存在时,会要求原值必须为string类型,并且由于Redis的限制

    44120编辑于 2022-08-26
  • 来自专栏XINDOO的专栏

    Redis源码剖析开篇

    我的目标定位,这个项目是资深程序猿阅读和理解redis源码最优质的中文材料。 我这个项目预期做到 源码+中文注释+系列博文 三位一体,全方位帮大家深入理解redis的原理。 另外github上我源码库不是redis的copy,而是直接fork出来的,所以会定期和redis当前源码保持一致,时更时新。 这里放上相关链接,欢迎关注 Redis中文注解版仓库:https://github.com/xindoo/redis Redis源码剖析专栏:https://blog.csdn.net/xindoo 基础 [ ] 初识Redis [ ] redis的日常使用 [ ] 搭建redis源码环境(单步调试) [ ] 了解redis的启动过程 各种数据结构 [ ] SDS(simple dynamic

    57420发布于 2021-01-22
  • 来自专栏浪浪山下那个村

    Redis源码】setbit命令

    如图11-1所示,二进制串“abc”在内存中是以011000010110001001100011来表示的,现在字符串第9比特位的值为1,如果想设置此值为0,需要经过以下步骤。

    50630编辑于 2022-08-26
  • 来自专栏CSDN搜“看,未来”

    redis源码学习】redisObject

    使用的是redis6.0.6版本,因为我第一次接触 redis 时它就是这个最新稳定版。 文章目录 robj 数据类型 编码类型 随机应变的对象编码 回到robj robj redis中的数据对象 server.h/redisObject 是redis内部存储的数据定义的抽象类型。 数据类型 /* A redis object, that is a type able to hold a string / list / set */ /* The actual Redis Object dispatch the loading to the right module, plus a 10 bits * encoding version. */ #define OBJ_MODULE 5 不再使用*/ #define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist 压缩列表*/ #define OBJ_ENCODING_INTSET 6 /*

    36630编辑于 2021-12-20
领券