Redis
文章平均质量分 60
NoSQL经典
酱油瓶啤酒杯
这个作者很懒,什么都没留下…
展开
-
Redis-在千万/亿级别数据中筛选数据-场景分析
1、问题描述假如 Redis 里面有 1 亿个 key ,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如何将它们全部找出来?2、 解决方式使用Keys指令扫描出指定模式的key列表。3、问题升级这个Redis正在给线上的业务提供服务,采取2的keys指令会带来什么问题?如何解决这个新的问题?4、深入分析Redis是单线程的,keys指令执行的时候会阻塞线程一段时间,这时候Redis对线上业务的服务就会暂停,直至keys指令执行完毕瑷珲恢复。使用scan指令规避以原创 2021-01-26 23:09:39 · 1273 阅读 · 1 评论 -
Redis-分布式锁-明了清晰
1、什么是Redis分布式锁Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。所谓的占坑,就是一般使用 setnx(set if not exists)指令,只允许被一个程序占有,使用完调用 del 释放锁;也可以配合EXPIRE key seconds自动释放锁;设置key的生存时间,当key过期时(生存时间为0) ,会被自动删除2、Redis分布式锁的缺陷Redis 分布式锁不能解决超时的问题,分布式锁有一个原创 2021-01-26 23:00:04 · 167 阅读 · 0 评论 -
Redis-集群中有多少个节点-极限分析
1、结论Redis集群最多有16384个节点。2、分析要知道每个Redis哈希槽都要有一个节点相对应,哈希槽的数量是16384,所有极限情况是每个哈希槽对应的节点都不同,所以此时Redis集群最多有16384个节点。3、拓展每个 key 通过 CRC16 算法计算的结果,对 16384 取模后放到对应的编号在 0-16383 之间的哈希槽...原创 2021-01-26 22:52:22 · 2647 阅读 · 0 评论 -
Redis-集群节点如何组成-从数据机构入手
1、背景集群中的每个节点都需要专门的数据结构来存储集群的状态和自身信息。分为clusterNode和 clusterState结构:–clusterNode记录了集群中的单个节点的状态– clusterState记录集群所有节点作为一个整体的状态2、clusterNode结构typedef struct clusterNode { //节点创建时间 mstime_t ctime; //节点id char name[REDIS_CLUSTER_NAMELEN];原创 2021-01-26 22:47:52 · 192 阅读 · 0 评论 -
Redis-集群节点间的五种消息类型-区分
1、消息类型划分节点间发送的消息主要分为 5 种:meet 消息、ping 消息、pong 消息、fail 消息、publish 消息。不同的消息类型,通信协议、发送的频率和时机、接收节点的选择等是不同的:2、特点介绍MEET 消息: 在节点握手阶段,当节点收到客户端的 CLUSTER MEET 命令时,会向新加入的节点发送 MEET 消息,请求新节点加入到当前集群;新节点收到 MEET 消息后会回复一个 PONG 消息。PING 消息: 集群里每个节点每秒钟会选择部分节点发送 PING 消息,接原创 2021-01-26 22:39:31 · 563 阅读 · 0 评论 -
Redis-[压缩列表]数据结构-深入了解
1、什么是压缩列表压缩列表是列表键和哈希键的底层实现之一:1)当一个列表键只包含少量列表项,且都是小整数值或者较短的字符串时;2)当哈希键只包含少量键值对,且键值对的键和值都是小整数值或者较短的字符串时。压缩列表是为了节约内存而开发的2、压缩列表的构成一个压缩列表可以包含任意多个节点/entry,每个节点可以保存一个字节数组或整数值。可以看到以上就是压缩列表的组成,分为zlbytes、zltail、zllen、entryX、zlend几个部分,下边分别介绍1)zlbytes:记录整个压原创 2021-01-14 21:23:33 · 153 阅读 · 0 评论 -
Redis-[整数集合]数据结构-深入解析
1、什么是整数集合整数集合/intset是集合键的底层实现之一:当一个集合只包含整数值元素,并且整个集合的元素数量不多 的时候使用。是Redis用来保存整数值的集合抽象数据结构,可以保存int16_t,int32_t,int64_t类型的整数值2、如何实现整数集合typedef struct intset{ uint32_t encoding;//编码方式 unit32_t length;//元素数量 int8_t contents[];//保存元素的数组}contents数组是整原创 2021-01-14 16:15:22 · 99 阅读 · 0 评论 -
Redis-[跳跃表]数据机构-深入解析
1、跳跃表是什么?跳跃表/skiplist是一种有序数据结构,通过在每个节点上维持多个指向其它节点的指针,达到快速访问节点的目的。节点查找平均复杂度O(logN),最坏情况是O(N),还可以通过顺序性操作来批量处理节点。效率可以和平衡树媲美,在Redis中被应用。在Redis中使用跳跃表作为有序集合键的底层实现之一:1)有序集合见包含的元素数量较多时 2)有序集合键的元素的成员是比较长的字符串时。Redis只在两个地方用到跳跃表:1)实现有序集合键 2)在集群节点中用作内部数据结构。2、有序集原创 2021-01-14 15:32:57 · 126 阅读 · 0 评论 -
Redis-字典数据结构-源码深入解析
1.Redis的字典是什么?Redis字典,又叫符号表/关联数组/映射,是一种用于保存键值对的抽象数据结构。还可以作为Redis数据库的底层,哈希键的底层等。2.如何实现Redis字典自顶向下来实现一个Redis字典,使用Redis的实现语言-C语言1)字典typedef struct dict{ dicType *type;//类型特定函数 void *privdata;//私有数据 dictht ht[2];//哈希表 int trehashidx;//rehash索引,当rehash原创 2021-01-14 12:53:17 · 130 阅读 · 0 评论 -
Redis-链表数据结构-深入分析
1.Redis的链表是什么?我们学数据结构的时候,学完数组应该就会开始链表的学习,链表的思想学习之后才会往下学二叉树这些复杂的数据结构.但已知Redis是用C语言实现的,C语言的API中没有现成的链表结构,需要我们自己写一下...原创 2021-01-13 20:57:05 · 112 阅读 · 0 评论 -
Redis-如何减少修改字符串带来的内存分配过程消耗-深入理解
1、Redis字符串的特点已知Redis的键值对的键是字符串对象,值也可以是字符串对象,值还可以是列表对象、哈希对象、集合对象、有序集合对象总共这五种对象。Redis的底层实现语言是经典的C语言,Redis的字符串定义与C语言的字符串定义有一些区别– 1、C语言的字符串对象是以空字符结尾的字符类型数组,有多少个字符该数组就是多大的– 2、Redis使用的是简单动态字符串(SDS, simple dynamic string)的抽象类型,SDS除了用来保存Redis的字符串对象之外,还可以用作缓冲区原创 2021-01-13 17:43:43 · 332 阅读 · 0 评论