![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redis
文章平均质量分 82
秀强
物有本末,事有终始。
展开
-
Redis 缓存淘汰策略 LFU VS LRU
文章目录前言LFURedis 对象的热度LRULFU为什么 Redis 要缓存系统时间戳Redis为什么在获取 lruclock 时使用原子操作如何打开 LFU 模式前言在前面的文章《Redis 限制内存大小参数 maxmemory》中,我们讲到了 Redis 的 LRU 模式,它可以有效地控制 Redis 占用内存的大小,将冷数据从内存中淘汰出去。Antirez 在 Redis4.0 里引人了一个新的淘汰策略 一 LFU模式。LFULFU 的全称是 LeastFrequently Used,表示接原创 2022-01-23 22:54:42 · 1198 阅读 · 0 评论 -
Redis5.0 基数树浅析
文章目录前言应用数据结构前言Rax 是 Redis 内部比较特殊的一个数据结构,它是一个有序字典树(基数树 Radix Tree),按照 key 的字典序排列,支持快速地定位、插入和删除操作。Redis 五大基础数据结构里面,能作为字典使用的有 hash 和 zset。hash 不具备排序功能,zset 则是按照 score 进行排序的。rax 跟 zset 的不同在于它是按照 key 进行排序的。应用你可以将一本英语字典看成一棵 radix tree,它所有的单词都是按照字典序进行排列,每个词原创 2022-01-23 21:49:49 · 1252 阅读 · 0 评论 -
Redis5.0 listpack 浅析
文章目录前言listpack 数据结构级联更新总结前言Redis 在 5.0 引入了一个新的数据结构 listpack,它是对 ziplist 结构的改进,在存储空间上会更加节省,而且结构上也比 ziplist 要精简。listpack 数据结构struct listpack<T> { int32 total_bytes;// 占用的总字节数 int16 size; // 元素个数 T[] entries; // 紧凑排列的元素列表 int8 end; // 同zlend 一样,原创 2022-01-23 20:24:34 · 260 阅读 · 0 评论 -
Redis skiplist 原理浅析
文章目录前言skiplist 基本结构查找过程随机层数插入过程删除过程更新过程极端情况元素排名前言Redis 的 zset 是一个复合结构,一方面它需要一个 hash 结构来存储 value 和 score 的对应关系,另一方面需要提供按照 score 来排序的功能,还需要能够指定 score 的范围来获取 value 列表的功能,这就需要另外一个结构「跳跃列表」。zset 的内部实现是一个 hash 字典加一个跳跃列表(skiplist)。skiplist 基本结构上图就是跳跃列表的示意图,图原创 2022-01-17 00:16:51 · 998 阅读 · 0 评论 -
Redis quicklist原理浅析
文章目录前言每个 ziplist 存多少元素?压缩深度前言Redis 早期版本存储 list 列表数据结构使用的是压缩列表 ziplist 和普通的双向链表 linkedlist,也就是元素少时用 ziplist,元素多时用 linkedlist。考虑到链表的附加空间相对太高,prev 和 next 指针就要占去 16 个字节(64bit 系统的指针是 8 个字节),另外每个节点的内存都是单独分配,会加剧内存的碎片化,影响内存管理效率。后续版本对列表数据结构进行了改造,使用 quicklist 代替了原创 2022-01-16 19:52:46 · 296 阅读 · 0 评论 -
Redis ziplist 原理浅析
文章目录前言ziplist 数据结构增加元素级联更新IntSet 小整数集合前言Redis 为了节约内存空间使用,zset 和 hash 容器对象在元素个数较少的时候,采用压缩列表(ziplist) 进行存储。压缩列表是一块连续的内存空间,元素之间紧挨着存储,没有任何冗余空隙。ziplist 数据结构struct ziplist<T> { int32 zlbytes; // 整个压缩列表占用字节数 int32 zltail_offset; // 最后一个元素距离压缩列表起始位置的偏移原创 2022-01-16 17:59:01 · 805 阅读 · 0 评论 -
Redis 字典与 Set 原理
文章目录前言dict 内部结构渐进式 rehashhash 函数hash 攻击扩容条件缩容条件Set前言dict 是 Redis 服务器中出现最为频繁的复合型数据结构,除了 hash 结构的数据会用到字典外,整个 Redis 数据库的所有 key 和 value 也组成了一个全局字典,还有带过期时间的 key 集合也是一个字典。zset 集合中存储 value 和 score 值的映射关系也是通过 dict 结构实现的。dict 内部结构dict 结构内部包含两个 hashtable,通常情况下只原创 2022-01-11 22:27:57 · 243 阅读 · 0 评论 -
Redis 「字符串」内部结构
文章目录前言SDSRedis 字符串存储方式扩容策略前言Redis 中的字符串是可以修改的字符串,在内存中它是以字节数组的形式存在的。SDSRedis 的字符串叫「SDS」,也就是 Simple Dynamic String。它的结构是一个带长度信息的字节数组。 struct SDS<T> { T capacity;// 数组容量 T len; // 数组长度 byte flags; // 特殊标识位 byte[]原创 2022-01-08 16:27:34 · 151 阅读 · 0 评论 -
Redis 安全性问题
文章目录指令安全端口安全Lua 脚本安全SSL 代理指令安全Redis 有一些非常危险的指令,这些指令会对 Redis 的稳定以及数据安全造成非常严重的影响。比如 keys 指令会导致 Redis 卡顿,flushdb 和 flushall 会让 Redis 的所有数据全部清空。如何避免人为操作失误导致这些灾难性的后果也是运维人员特别需要注意的风险点之一。Redis 在配置文件中提供了 rename-command 指令用于将某些危险的指令修改成特别的名称,用来避免人为误操作。比如在配置文件的 sec原创 2022-01-08 14:10:54 · 1414 阅读 · 0 评论 -
Redis 惰性删除
文章目录前言lazy freeflush异步队列AOF Sync更多异步删除点前言Redis 虽然是单线程的,但是其内部实际上并不是只有一个主线程,它还有几个异步线程专门用来处理一些耗时的操作。lazy free删除指令 del 会直接释放对象的内存,大部分情况下,这个指令非常快,没有明显延迟。不过如果删除的 key 是一个非常大的对象,比如一个包含了千万元素的 hash,那么删除操作就会导致单线程卡顿。Redis 为了解决这个卡顿问题,在 4.0 版本引入了 unlink 指令,它能对删除操作进原创 2022-01-06 22:45:22 · 690 阅读 · 0 评论 -
Redis 限制内存大小参数 maxmemory
文章目录前言maxmemory 参数LRU 算法Redis 中的近似 LRU 算法前言当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换(swap)。交换会让 Redis 的性能急剧下降,对于访问量比较频繁的 Redis 来说,这样龟速的存取效率基本上等于不可用。maxmemory 参数在生产环境中我们是不允许 Redis 出现交换行为的,为了限制最大使用内存,Redis 提供了配置参数 maxmemory 来限制内存超出期望大小。当实际内存超出 maxmemory 时,原创 2022-01-04 23:01:26 · 7238 阅读 · 0 评论 -
Redis key 过期策略
文章目录前言定时扫描策略缓存雪崩从库的过期策略前言在之前的文章中,我们知道 Redis 中所有的数据结构都可以设置过期时间,时间一到,就会自动删除。但是你知道 Redis 是如何删除过期的 key 么?定时扫描策略Redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。Redis 默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的key,而是采用了一种简单的贪心策略:从过期字典中随机 20 个 key;删除这 20 个 ke原创 2022-01-02 13:04:34 · 493 阅读 · 0 评论 -
Redis 集群模式 Cluster
Redis 集群模式 Cluster原创 2021-12-30 21:35:52 · 331 阅读 · 0 评论 -
Redis 集群模式 哨兵 Sentinel
Redis 哨兵原创 2021-12-29 23:25:16 · 295 阅读 · 0 评论 -
Redis 主从同步原理解析
Redis 主从同步原创 2021-12-27 20:38:46 · 497 阅读 · 0 评论 -
Redis 小对象压缩 ziplist 与内存回收机制
Redis ziplist 内存回收机制原创 2021-12-25 16:14:07 · 164 阅读 · 0 评论 -
Redis 消息多播简单介绍
Redis PubSub 简单介绍原创 2021-12-25 14:47:32 · 1091 阅读 · 0 评论 -
Redis 事务模型
Redis事务模型。原创 2021-12-25 13:12:30 · 119 阅读 · 0 评论 -
Redis 管道操作的本质
Redis 管道操作原创 2021-12-22 21:11:33 · 114 阅读 · 0 评论 -
Redis 数据持久化机制 aof 和 rdb 简介
redis 的持久化机制 aof 和 rdb原创 2021-12-20 21:01:30 · 273 阅读 · 0 评论 -
Redis 通信协议 RESP
RESP原创 2021-12-19 21:57:10 · 1129 阅读 · 0 评论 -
Redis 中的线程 IO 模型
NIO、多路复用原创 2021-12-18 14:58:38 · 222 阅读 · 0 评论 -
Redis 使用 scan 命令代替 keys
文章目录前言scan 命令简介常用命令Scan 命令原理解析扩容与缩容scan 中的渐进式 rehash前言之前在项目里用 keys 命令找出 Redis 中所有满足特定正则字符串规则的 key。但是 keys 没有 offset 和 limit 参数,也就是分页。而且 keys 的算法是遍历算法,复杂度是 O(n) ,效率太低。后来为了优化这个功能,改用了 Redis 的 scan 命令。scan 命令简介scan 相比 keys 具备以下特点。复杂度虽然也是 0(n),但它是通过游标分步进行原创 2021-12-16 21:31:09 · 2570 阅读 · 0 评论 -
Redis Geo 指令实现附近的人功能
Redis Geo 实现附近的人功能原创 2021-12-14 19:27:08 · 764 阅读 · 0 评论 -
Redis 简单限流
redis 简单限流原创 2021-12-12 15:03:21 · 113 阅读 · 0 评论 -
Redis 布隆过滤器介绍
布隆过滤器原创 2021-12-12 13:54:46 · 793 阅读 · 0 评论 -
Redis 位图数据结构介绍
文章目录前言应用场景常用命令前言位图不是特殊的数据结构,它的内容其实就是普通的字符串,也就是 byte 数组。其实就是我们在《Redis 5 种常见数据类型的应用场景与常用命令》中介绍过的 String 数据类型。我们可以使用普通的 get/set 直接获取和设置整个位图的内容,也可以使用位图操作 gitbit/setbit 等将 byte 数组看成「位数组」来处理。应用场景保存每个用户一年 365 天的签到记录。如果使用 key/value 来保存, 当用户数上亿的时候,需要的存储空间是惊人的。这原创 2021-12-08 21:55:56 · 400 阅读 · 0 评论 -
Redis HyperLogLog 用法介绍
文章目录前言应用场景常见命令前言Redis 提供的 HyperLogLog 数据结构常用来解决统计问题。HyperLogLog 提供不精确的去重计数方案,标准误差是0.81%。应用场景统计大型网站每天的 UV。来一个用户 ID,就用 pfadd 命令将用户 ID 塞进去。最后用 pfcount 直接获取计数值。常见命令pfaddpfcountredis 127.0.0.1:6379> PFADD runoobkey "redis"1) (integer) 1redis 127.原创 2021-12-08 20:47:37 · 733 阅读 · 0 评论 -
Redis 分布式锁的关键命令
Redis实现分布式锁原创 2021-12-05 21:53:30 · 969 阅读 · 0 评论 -
Redis 如何实现一个消息队列
Redis 如何实现一个消息队列?Redis 如何实现延时队列?既然 Redis 可以实现队列,为什么还需要 MQ?原创 2021-12-05 16:37:40 · 367 阅读 · 0 评论 -
Redis主从哨兵Cluster集群
文章目录redis单节点有什么问题?主备和主从区别是什么Redis集群原则主从复制搭建redis单节点有什么问题?单点故障容量有限承受压力有限主备和主从区别是什么主备:客户端只访问主,主挂了,备顶上。主从:Redis集群原则AKFCAP主从复制搭建复制配置文件到test目录修改配置文件 daemonize no / appendonly no / #logfile...原创 2020-04-19 18:06:39 · 550 阅读 · 0 评论 -
Redis 5 种常见数据类型的应用场景与常用命令
这篇文章介绍了Redis的五种常见数据类型(String,List,Set,Hash,ZSet),以及它们的应用场景和常用命令。文章通过实例代码和图解的方式,详细说明了每种数据类型的特点和操作方法。文章的目的是让读者能够在合适的缓存场景使用合适的数据类型。原创 2020-04-03 01:37:30 · 501 阅读 · 0 评论