简介 本文主要是讲解Redis 6的ACL的实现原理。基本使用详见:Redis 6.0新特性——ACLs,以及Redis启动过程分析。 启动初始化 初始化默认用户 ACL子模块在Redis启动过程中初始化,下面代码主要是初始化ACL的结构: /* * 初始化ACL子系统 * */ void ACLInit(void) { 6当中默认用户的权限就相当于操作系统的管理员一样,拥有很大的权限,要限制远程使用默认用户连接。 Redis ACL配置信息主要有两种方式: 在redis.conf文件中通过user 配置项配置的ACL信息。 格式如下图所示: 通过user方式 通过加载redis.conf配置文件中读取user配置项加载ACL信息。
redis的事件分为:文件事件和时间事件。文件事件是基于I/O的事务处理,时间事件则是基于时间点的事务处理。 redis事件支持的多路复用包含四个实现:ae_epoll.c,ae_evport.c,ae_kqueue.c,ae_select.c 基本处理流程如下,源代码解析参见: ae.c和ae.h以及ae_epoll.c
redis对象作为redis存储的基本单元,对应redisDb->dict 中的dictEntry->key和dictEntry->val。 ? 更全面的图谱 ? 源码解析参见:object.c
redis使用sds(simple dynamic string)实现了字符串的存储。sds实际上就是TLV格式的数据结构。
redis使用sds(simple dynamic string)实现了字符串的存储。sds实际上就是TLV格式的数据结构。
redis的事件分为:文件事件和时间事件。文件事件是基于I/O的事务处理,时间事件则是基于时间点的事务处理。 redis事件支持的多路复用包含四个实现:ae_epoll.c,ae_evport.c,ae_kqueue.c,ae_select.c 基本处理流程如下,源代码解析参见ae.c和ae.h以及ae_epoll.c
举例如下: * |00pppppp| - 1 byte * 字符串的长度小于或等于63字节(6 bits). * "pppppp" 表示6bit长度的无符号整数. ssssssss|tttttttt| - 5 bytes * 字符串的长度大于或等于16384字节,只使用第1个字节之后的4个字节表示长度,最大为32^2-1,第一个 * 字节的低6位没有使用 [0f 00 00 00] [0c 00 00 00] [02 00] [00 f3] [02 f6] [ff] | | | | f6"的编码与前一个相同,去除前4个bit,并减去1,得到entry的值为5;最后的"ff"表示ziplist的结束(zlend)。 [02] [0b] [48 65 6c 6c 6f 20 57 6f 72 6c 64] 源码解析参见:ziplist.c
edis源码的dict.c主要实现了基于hash表的操作,如增删改查,对哈希表大小的扩容和缩容,以及对哈希表的rehash和增量rehash等。 在源码的dictScan函数中,非常巧妙精美地实现了对哈希表的迭代查找,非常建议去看一下。 ? 源码解析地址:dict.c dict.h
redis源码的dict.c主要实现了基于hash表的操作,如增删改查,对哈希表大小的扩容和缩容,以及对哈希表的rehash和增量rehash等。 在源码的dictScan函数中,非常巧妙精美地实现了对哈希表的迭代查找,非常建议去看一下。 image.png 源码地址:dict.cdict.h
文章目录 前言 一、整数集合实现 二、intset api 1.根据值确认编码方式 2.根据值确认编码方式 3.获取指定索引的元素 4.设置指定索引的元素 5.在集合中查找指定元素的位置 6.集合编码方式升级 7.集合元素移动 8.集合元素增加删除 总结 前言 整数集合(intset)是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现 整数集合涉及的文件是intset.h和intset.c 一、整数集合实现 整数集合(intset)是 Redis 用于保存整数值的集合抽象数据结构, 它可以保存类型为 int16_t 、 int32_t ) *pos = mid; return 1; } else { if (pos) *pos = min; return 0; } } 6.
本文将讲解 hooks 的执行过程以及常用的 hooks 的源码。 总结所以我们总结一下 renderWithHooks 这个函数,它所做的事情如下: 图片hooks 源码前面 hooks 的执行入口我们都找到了,现在我们看一下常用的一些 hooks 源码。 updateReducer 的源码如下:function updateReducer<S, I, A>( reducer: (S, A) => S, initialArg: I, init? useCallback & useMemouseCallback 和 useMemo 也是一样,源码结构上十分相似,所以也放在一起来讲。 其他 hook 平时用的比较少,就不在这里展开讲了,但通过上面几个 hook 的源码讲解,其他 hook 看源码你应该也能看得懂。
Centos7源码部署Redis3.2.9 一.环境准备 [Redis-Server] 主机名 = host-1 系统 = centos-7.3 地址 = 1.1.1.1 软件 = redis- 3.2.9 6379 二.安装 1.yum依赖 yum -y install gcc 2.编译安装Redis wget http://download.redis.io/releases/redis-3.2.9 .tar.gz tar xzf redis-3.2.9.tar.gz cd redis-3.2.9 3.Redis 的编译,只将命令文件编译,将会在当前目录生成bin目录 make && make install 4.返回上一级并移动到/usr/local下 cd .. mv redis-3.2.9 /usr/local/redis 5.创建环境变量 echo 'PATH=$PATH':/usr/local/redis
8.noarch2.rpm my.cnf.leopard redis-3.0.0mha4mysql-manager-0.53-0.el6.noarch.rpm my.cnf.leopard.bak redis-3.0.0.tar.gzmha4mysql-manager-0.53.tar.gz my.cnfrrrccc redis.confmha4mysql-node redis.confmha4mysql-manager-0.53-0.el6.noarch.rpm my.cnf.leopard percona-release-0.1-3.noarch.rpm -0.53-0.el6.noarch.rpm my.cnfrrrccc redis-3.0.0.tar.gz[root@m2 tmp]# redis-server redisnew.conf 8.noarch2.rpm my.cnf.leopard redis-3.0.0mha4mysql-manager-0.53-0.el6.noarch.rpm my.cnf.leopard.bak
简介 Redis服务器是典型的事件驱动程序,而事件又分为文件事件(socket的可读可写事件)与时间事件(定时任务)两大类。 有多个定时任务,因此理论上应该有多个时间事件,多个时间事件形成链表, timeEventHead即为时间事件链表头节点;Redis服务器需要阻塞等待文件事件的发生,进程阻塞之前会调用beforesleep Redis底层可以使用4种I/O多路复用模型(kqueue、epoll等), apidata是对这4种模型的进一步封装。 文件监听事件 Redis客户端通过TCP socket与服务端交互,文件事件指的就是socket的可读可写事件。socket读写操作有阻塞与非阻塞之分。 Redis创建时间事件节点的函数为aeCreateTimeEvent,内部实现非常简单,只是创建时间事件并添加到时间事件链表。
1、介绍 Jedis是java开发的操作redis的工具包。 2、Jedis的用法 2.1、引入maven依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId > <version>4.2.1</version> </dependency> 2.2、使用redis的api操作redis 案例代码如下,重点在于 Jedis 工具类,这个类中包含了操作redis import org.junit.After; import org.junit.Before; import org.junit.Test; import redis.clients.jedis.Jedis ; import java.util.concurrent.TimeUnit; /** * @className JedisDemo * @date 2022/6/21 **/ public class
管理Redis 1.1 config 指令 除了通过 redis.conf 文件对 Redis 进行配置外,我们还可以通过 config set 命令来个别值进行设置 config set slowlog-log-slower-than 通过使用 requirepass 设置 (用 redis.conf 文件或者 config set 命令)。 1.3 复制 ( Replication ) Redis 支持复制,意思是说,当你把数据写到一个 Redis 实例(主服务)上的时候,一个或者多个实例(从服务)将会保持和主服务同步更新。 1.4 备份(Backups) 备份 Redis 只需要简单的将 Redis 的快照拷贝到你想要的地方。默认的,Redis 把它的快照保存在名为 dump.rdb 的文件中。 1.5 扩展和 Redis 集群(Scaling and Redis Cluster) 复制是那些负荷高速成长的网站用到的第一个工具。
# 源码-调试Redis 在阅读源码的时候,通过debug调试的方式逐行去理解代码的意思,不免是一个好的方式。 第一步: 在src目录下新建一个文件learn.h,在这里面定义入口 #ifndef REDIS_LEARN_H #define REDIS_LEARN_H int learn(); #endif learn_quicklist() { quicklist *list = quicklistCreate(); // quicklistPushHead(list, "hello", 6) 紧凑链表的出现是为了解决压缩链表中更新链表的时候会出现级联更新的问题 * */ void learn_listpack() { unsigned char *lp = lpNew(32); lp = lpAppend(lp, "hello", 6) ; lpLast(lp); lp = lpAppend(lp, "world", 6); uint32_t len = lpLength(lp); printf("len
zipmap redis旧版小hash使用的数据结构,紧密数组存储结构 用1字节存储总节点数(如果1字节满了,代表需要遍历到底才知道有多少节点) 每个节点存储自己占用的内存空间,修改删除后,标记为闲置空间 adlist 环形双端链表,没啥好说的 dict 这里比较特别的是一个字典里会有最多两个hash表同时存在,目的是rehash的时候可以做渐进式hash table的结构是个数组,每个元素是一条链表,redis 把缩容一次后会聚拢到该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
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
而redis的底层实现是十分简单的,核心源码也仅有几万行。本文就带大家来领略,小小的redis是如何实现这些复杂功能的。 *注:本文介绍的源码为redis 5.0.14版本 * 二、字符串 C语言存储字符串的问题: 二进制安全 C语言中表示字符串结尾的符号是'\0',如果字符串本身就具有'\0'字符,就会被截断,即非二进制安全 即多浪费了30%的空间,redis的跳表使用了较低的空间成本,实现了时间复杂度的大减少 3.3.3 插入节点 插入节点总的来说一共四步 查找插入位置 调整高度 插入节点 调整backward 源码如下 源码注解的例子。 工作中我们也常常使用redis进行各种逻辑的处理,而了解其源码可以避免踩很多坑。