缓冲
文章平均质量分 89
一个处女座-代码洁癖的程序猿
梦在翱翔 心在路上 不忘初心 砥砺前行
展开
-
一文阐述Redis 8种淘汰策略、击穿、穿透、雪崩及其解决方式
一文阐述Redis 8种淘汰策略及击穿、穿透、雪崩、对应解决方案原创 2022-04-01 10:30:33 · 2092 阅读 · 1 评论 -
Redis-快速列表原理源码分析
1、早期版本存储list集合,采用ziplist和linkedlist,但由于链表的附加空间高,prev和next就要占去16个字节,而且每个节点的内存都要单独分配,会加剧内存的碎片化,所以后面的版本对结构进行了改造,使用快速列表(quicklist)1)实例 > rpush codehole go java python (integer) 3 > de...原创 2019-01-17 10:01:18 · 234 阅读 · 2 评论 -
Redis-跳跃列表原理源码分析
1、Redis 的 zset 是一个复合结构,结构特点:1)需要通过hash 结构来存储 value 和 score 的对应关系2)要支持按照 score 来排序3)还要按照指定 score 的范围来获取 value 列表的4)要实现上诉的功能的结构,作者想到了跳跃列表5)zset的结构:通过一个hash字典加跳跃列表skiplist 2、跳跃列表结构1)基本结...原创 2019-01-17 10:02:39 · 447 阅读 · 0 评论 -
Redis-紧凑列表源码原理分析
1、Redis 5.0 增加了新的数据结构listpack,它是对ziplist结构的改进,优点是在存储空间上更加节省以及在结构上比ziplist更精简1)结构体 struct listpack<T> { int32 total_bytes; // 占用的总字节数 int16 size; // 元素个数 T[] entrie...原创 2019-01-17 10:03:50 · 439 阅读 · 0 评论 -
Redis-基树数源码原理分析
1、Rax是Redis内部比较特殊的一种数据结构,它是有序字典树,按照key进行排序,支持快速定位、插入、删除操作。它与zset排序不同,zset是按照score排序,而Rax是按照key进行排序。 集中数据结构的特点如下图所示 咱们可以将英语字典开成一棵radix tree,key是每个单词,value是对应的解释;也可以应用到时间...原创 2019-01-17 10:05:48 · 243 阅读 · 0 评论 -
Redis-LFU与LRU内部实现原理源码分析
1、LRU模式有效控制内存的大小,将冷数据从内存中淘汰出去,在Redis里引入一个新的淘汰形式LFU 1)LFU全称是Least Frequently Used 表示按最近的访问频率进行淘汰,更加准确的判断一个key别访问的热度2、Redis对象的热度Redis中所有对象结构头中都有一个24bit字段,这个字段用来记录...原创 2019-01-17 10:11:15 · 1969 阅读 · 1 评论 -
Redis-懒惰删除内部实现
异步线程在Redis内部有个特别的名称,叫作BIO(background IO),意思是后台运行的io线程,不过内存回收本身不是io操作,只是cpu计算消耗比较大。1、Redis的内部对象共享机制会阻碍异步线程的改造,原因是懒惰删除是要测底删除某个对象,不能藕断丝连,如果底层数据的共享的,就不能做到彻底删除了效果。所以为了支持懒惰删除,只能将对象共享机制彻底抛弃。2、异步删...原创 2019-01-17 10:15:42 · 1454 阅读 · 0 评论 -
Redis-字典遍历内部实现原理源码
1、遍历Redis1)Redis对象树的主干是一个字典,如果对象很多,那么这个树会很大,当我们执行keys命令时,首先它会遍历整棵树,查找出满足条件的key,其次会判断遍历出的key对应的对象是否过期,如果过期则从主干中删除掉 void keysCommand(client *c) { dictIterator *di; // 迭代器 dictEn...原创 2019-01-17 10:23:21 · 463 阅读 · 0 评论 -
Redis-HyperLogLog内部实现原理源码解析
1、HyperLogLog算法时一种非常巧妙的近似统计大量去重元素数量的算法,它内部维护了16384个桶来记录各自桶的元素数量,当一个元素过来,它会散列到其中一个桶。当元素到来时,通过 hash 算法将这个元素分派到其中的一个小集合存储,同样的元素总是会散列到同样的小集合。这样总的计数就是所有小集合大小的总和。使用这种方式精确计数除了可以增加元素外,还可以减少元素。一个HyperLogLo...原创 2019-01-17 10:30:50 · 6619 阅读 · 0 评论 -
Redis - 集群 - Codis
1、Codis是一种集群的实现方式,是使用Go语言开发的一个代理中间件,其上斜挂的的所有Redis事例构造一个Redis集群,当空间不足时,可以增加Redis事例,实现动态扩容2、Codis分片原理:它负责将特定的key转发到特定的Redis实例上,实现原理,首先将key进行crc32运算计算哈希值,再将hash后的值对1024取模得到余数,这个余数就是对应key的槽位,每个槽位会唯一映射...原创 2019-01-02 18:46:26 · 439 阅读 · 0 评论 -
Redis - 集群 - Cluster
1、Redis Cluster是去中心化的,将所有的数据划为16384个slots,比Codis的1024划分的更细,每个节点负责其中一部分槽位,槽位的信息储存在每个节点中。当Redis客户端来链接集群时,会得到一份集群槽位配置信息,当客户端要查找某个key时,可以直接定为到目标节点。2、定为key所在对槽位1)Cluster默认会对key进行 crc16算法hash运算得到一个整数值,然...原创 2019-01-02 18:49:40 · 111 阅读 · 0 评论 -
Redis - 扩展 - Stream
Redis5.0增加新数据结构Stream,是一个强大的支持多播的可持久化的消息队列,如下图所示是一个消息列表,将所有加入的消息都串起来,每个消息都有唯一的Id和对应的内容,消息持久化。Stream的唯一名称是Key,在我们首次xadd指令追加消息时自动创建。1、每个Stream可以挂多个消费组,每个消费组都有一个last_delivered_id在Stream上向前移动,代表当前消费...原创 2019-01-02 19:30:06 · 1000 阅读 · 0 评论 -
Redis - info 指令
Info 指令可以获取到Redis内部一系列运行参数,大体上分为一下几个部分:Server 服务器运行的环境参数Clients 客户端相关信息Memory 服务器运行内存统计数据Persistence 持久化信息Stats 通用统计数据Replication 主从复制相关信息CPU CPU 使用情况Cluster 集群信息KeySpace 键值...原创 2019-01-03 12:22:39 · 285 阅读 · 0 评论 -
Redis - 分布式锁
1、setnx 和 expire 组合在一起的原子指令来解决分布式锁,但这种方式是有缺陷的,不太安全的,例如Sentinel集群,当客户端向主节点申请分布式锁成功后,主节点还没来及向从节点同步时,主节点挂掉了,主从切换,某个从节点摇身一变成为主节点,第二个用户再次申请锁,是可以成功的,这样俩个用户成功申请到了2把锁,不安全因素产生了,解决该方案是通过Redlock算法。2、如果要使用redl...原创 2019-01-03 12:26:30 · 146 阅读 · 0 评论 -
Redis - 过期策略
1、Redis将所设置过期key都放到一个独立的字典中。过期key处理的方式。1)定期扫描:因为Redis将过期key都放到独立的字典中,所以可以定期扫描该字典,发现过期则删除;但是过期扫描不会扫描所有的key,而是采用贪心策略,策略如下首先从过期字典中随机 20 个 key,然后删除这 20 个 key 中已经过期的 key,最后如果过期的 key 比率超过 1/4,那就重复步骤 1。注...原创 2019-01-03 12:27:14 · 153 阅读 · 0 评论 -
Redis-压缩列表内部实现
1、Redis为了节约内存空间,zset和hash在对象比较少的时候,采用压缩列表(ziplist)来存储,可以用过debug object key 来查看结构1)ziplist的结构体 struct ziplist<T> { int32 zlbytes; // 整个压缩列表占用字节数 int32 zltail_offset; // 最后一...原创 2019-01-14 20:59:34 · 2595 阅读 · 2 评论 -
Redis-字段源码原理
1、dict是Redis服务器中出现最为频繁的复合型数据结构,用到地方很多,例如hash结构,整个Redis所有key和value组成一个全局的字典、带过期时间的key集合、zset集合汇总存储value和score直接映射关系等等1)结构体: struct RedisDb { dict* dict; // all keys key=>value ...原创 2019-01-14 21:03:49 · 333 阅读 · 0 评论 -
Redis-字符串源码原理
1、Redis的字符串结构被设计成一个[SDS]结构,字符串实际内容是被存放在一个数组中,如下表 struct SDS<T> { T capacity; // 数组容量 T len; // 数组实际长度 byte flags; // 特殊标识位,不理睬它 byte[] content; // 数组内容 } 当...原创 2019-01-15 09:19:36 · 519 阅读 · 0 评论 -
Redis-压缩列表源码原理解析
1、Redis为了节约内存空间,zset和hash在对象比较少的时候,采用压缩列表(ziplist)来存储,可以用过debug object key 来查看结构1)ziplist的结构体 struct ziplist<T> { int32 zlbytes; // 整个压缩列表占用字节数 int32 zltail_offset; // 最后一...原创 2019-01-17 10:00:03 · 371 阅读 · 0 评论 -
Redis-字典源码内部原理解析
Redis-字典源码内部原理解析 扩容、扩容条件、hash函数、缩容、Redis底层数据结构原创 2019-01-17 09:58:17 · 359 阅读 · 3 评论 -
初探消息中间件Kafka、ActiveMQ、RabbitMQ、RocketMQ的优缺点
我们在开发软件的时候,经常会用到消息队列,凭借其自身的特点,可以在满足业务需求的前提下,一定程度上系统的抗压性,但是消息队列使用不当或者是选择不当,效果可能不会那么好,所以我们有必要了解消息队列的优缺点。1、优点:解耦、异步、削峰解耦:解除俩个系统的耦合度,凭借中间层,减少俩个系统直接调用的耦合度。异步:系统直接的调用由同步变成了异步,例如系统A、B、C,系统生产的消息不仅可以提供给B...原创 2019-01-05 12:31:46 · 1591 阅读 · 0 评论 -
Redis-查询附近人
一、查询附近人:Geo指令,底层是普通的zst结构,提供7个命令1)添加指令:geoadd 指令携带集合名称以及多个经纬度名称三元组,注意这里可以加入多个三元组geoadd company 116.48105 39.996794 juejin2)计算距离:geodist 指令可以用来计算两个元素之间的距离,携带集合名称、2 个名称和距离单位geodist company juej...原创 2018-10-29 21:00:55 · 3059 阅读 · 1 评论 -
Redis-Scan命令
Scan命令Scan命令:从海量的 key 中找出满足特定前缀的 key 列表查询key为某一类型的数据可能有很多方法,例如可以通过keys*或者是keys codehole*,查询key前缀为codehole的redis缓冲数据,但是当缓...原创 2018-11-03 22:28:51 · 21480 阅读 · 3 评论 -
Redis-线程IO模型
我们都知道redis是单线程,Node.js、Nginx同样也是单线程,redis所有的数据都是基于单线程运算的,但是redis可以处理高并发。一、redis可以处理高并发的原因:1、基于多路复用(事件轮询)、非阻塞。2、非阻塞IO:非阻塞IO在套接字对象上提供一个Non_Blocking选项,打开该选项,读写不再阻塞,读写瞬间完成后,可以干别的事。能读多少取决于内核为套接字分配的读缓...原创 2018-11-03 22:39:43 · 2727 阅读 · 0 评论 -
Redis-通信协议
RESP协议: Redis 序列化协议的简写。它是一种直观的文本协议,优势在于实现异常简单,解析性能极好。将传输现已分为5种最小单元类型:每个单元类型结束时统一加上回撤换行符号\r\n,协议类型如下:1、单行字符串 以 + 符号开头。2、多行字符串 以 $ 符号开头,后跟字符串长度。3、整数值 以 : 符号开头,后跟整数的字符串形式。4、错误消息 以 - 符号开头。5、数组...原创 2018-11-03 22:51:05 · 133 阅读 · 0 评论 -
Redis-持久化快照及AOF区别
一、Redis存储在内存中,如果服务器断电或者重启,内存中的数据会被清理,所以需要对Redis持久化操作,保证数据库的完整性;二、Redis持久化的方式:快照、AOF日志;三、快照与AOF各自特点:1、快照是一次全量备份,AOF 日志是连续的增量备份2、快照是内存数据的二进制序列化形式,在存储上非常紧凑,而 AOF 日志记录的是内存数据修改的指令记录文本3、AOF 日志在长期的...原创 2018-11-03 22:54:27 · 754 阅读 · 0 评论 -
Redis- 管道(Pipeline)
下面主要总结Redis关于管道的一些内容:1、客户端对Redis进行一次操作,客户端将请求送给服务端,服务端处理完成后,将响应再回复给客户的,要花费一个网络数据包来回的时间2、如果是多条指令,如下图: 上面图经历了读->写->读->写,四个操作,执行了2条命令调整读写的顺序 写->写->读->读同样能达到效果,单只需要执行1条命令,这便是管道...原创 2018-12-13 21:01:31 · 203 阅读 · 0 评论 -
Redis-事务
1、Redis 的事务使用非常简单,也因为这种简单性,它的事务模型很不严格,这要求我们不能像使用关系数据库的事务一样来使用 Redis。2、每个事务的操作都有begin、commit 和 rollback,Redis也不例外,也包括multi/exec/discard。multi 指示事务的开始,exec 指示事务的执行,discard 指示事务的丢弃,如下图所示:3、原子性:指要么事...原创 2018-12-14 08:58:34 · 117 阅读 · 0 评论 -
Redis-主从同步
1、CAP原理:分布式系统理论基石 1)C - Consistent ,一致性,A - Availability ,可用性,P - Partition tolerance ,分区容忍性2、网络分区:网络断开的场景3、特点:网络分区发生时,一致性和可用性俩难全4、最终一致性:Redis主从数据是异步7同步的。所以分布式的Redis不满足一致性的要求,但是Redis的主节...原创 2018-12-29 18:13:52 · 116 阅读 · 0 评论 -
Redis-集群-Sentinel(哨兵)
1、如果主节点挂掉后,咋样进行主从切换,而不影响线上业务,毫无疑问是自动切换,Redis提供了一种高可用方案指出自动主从切换,即Redis Sentinel(哨兵),我们可以将Redis的集群看作是一个Zookeeper集群,它是高可用核心,一般由几个节点组成,如果个别节点挂掉后,不影响集群正常运行2、自动切换原理:Redis的哨兵负责监控主从节点的健康,若主节点挂掉后,自动选择一个最优的从节...原创 2018-12-29 18:16:44 · 151 阅读 · 0 评论 -
Redis-小对象压缩
Redis 是一个非常耗费内存的数据库,它所有的数据都放在内存里。如果我们不注意节约使用内存,Redis 就会因为我们的无节制使用出现内存不足而崩溃。1、ziplist:是一个紧凑的字节数组结构,每个元素直接都是紧挨着,数据结构如下图:1)object encoding +key :查询key属于哪种类型2)若存放hash结构,key和value会作为俩个entry相邻存在一起...原创 2018-12-29 18:37:28 · 724 阅读 · 0 评论 -
Redis - 扩展 - 分布式锁 与过期策略
一、分布锁 1、setnx 和 expire 组合在一起的原子指令来解决分布式锁,但这种方式是有缺陷的,不太安全的,例如Sentinel集群,当客户端向主节点申请分布式锁成功后,主节点还没来及向从节点同步时,主节点挂掉了,主从切换,某个从节点摇身一变成为主节点,第二个用户再次申请锁,是可以成功的,这样俩个用户成功申请到了2把锁,不安全因素产生了,解决该方案是通过Redlock算法。2、如果...原创 2019-01-05 09:29:53 · 1748 阅读 · 1 评论 -
Redis - 扩展 - LRU
1、当Redis内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换,将使Redis性能急剧下降。但是在生产上时不允许出现这样的情况的,为了限制最大的使用内存,Redis提供了配置参数maxmemory来限制内存,当实际内存超出maxmemory时,Redis提供了几种可选策略来腾出新的空间1)noeviction 不会继续服务写请求 (DEL 请求可以继续服务),读请求可以继续进行。...原创 2019-01-05 09:30:54 · 112 阅读 · 0 评论 -
Redis - 扩展 - 懒惰删除
Redis内部并不是只有一个主线程,他还有几个异步线程专门用来处理一些耗时的操作。1、Redis使用懒惰删除删除指令del会直接释放对象的内存,如果删除的key是一个非常的对象,那么删除操作旧会导致单线程卡顿,为了解决卡顿的问题,Redis在4.0中引入unlink指令,对删除指令懒处理,让后台线程来处理。2、flushRedis提供了flushdb和flushall指令,来清空数...原创 2019-01-05 09:32:40 · 1658 阅读 · 0 评论 -
Redis - 扩展 - 操作安全
1、指令安全Redis有一些非常危险的指令,这些指令会对Redis的稳定以及数据安全造成非常严重的伤害,比如keys指令会导致Redis卡顿,影响Redis正常使用,flushdb与flushall会让Redis的所有数据清空。1)Redis在配置文件中提供了rename-command,将一些指令修改成特别的名称,避免人为误操作,入 rename-command keys abckeys...原创 2019-01-05 09:33:27 · 207 阅读 · 0 评论 -
Redis - 扩展- Redis的安全通信
应用部署在A机房,存储部署在B机房,如果使用普通的tcp直接访问,因为跨机房所以传输数据会暴露在公网,不安全。但Redis本身不支持SSL安全链接,但有了SSL代理软件,我们可以让通信数据透明的得到加密,spiped就是一款官方推介的SSL代理软件。1、spiped原理如下图35所示 左边的 spiped 进程 A 负责接受来自 Redis Client...原创 2019-01-05 09:34:50 · 327 阅读 · 0 评论 -
Redis-Lua脚本详解
Redis中执行Lua脚本 SCRIPT LOAD 和 EVALSHA指令 错误处理函数pcall()与call() Script Kill 的原理原创 2019-01-05 09:39:01 · 3127 阅读 · 0 评论 -
Redis - 命令行工具
使用Redis内置的命令行工具 redis-cli一些便捷的命令:1、执行单条命令平时在访问 Redis 服务器,一般都会使用 redis-cli 进入交互模式,然后一问一答来读写服务器,这种情况下我们使用的是它的「交互模式」。还有另外一种「直接模式」,通过将命令参数直接传递给 redis-cli 来执行指令并获取输出结果。 $ redis-cli incrby foo 5...原创 2019-01-05 09:43:20 · 1338 阅读 · 0 评论 -
Redis-一些高级特征
1、HyperLogLog:高级数据结构特性,提供误差在0.81%,pfadd、pfcount,一个是增加计数,一个是获取计数,具备去重特性,可以用于统计uv(同一个用户一天访问多次,只能计数一次) 2、布隆过滤器:用来解决去重的问题,例如新闻服务端向客户端推送消息,如果已经给推送了,旧不不再推送了。某些场景下不是特别精确3、redis限流:简单限流:没看明白 漏斗限流:1、普通...原创 2018-10-29 20:39:00 · 284 阅读 · 0 评论