<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Redis on Cloudside</title><link>https://cloudside.icyyan.com/tags/redis/</link><description>Recent content in Redis on Cloudside</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 23 May 2026 11:00:00 +0800</lastBuildDate><atom:link href="https://cloudside.icyyan.com/tags/redis/index.xml" rel="self" type="application/rss+xml"/><item><title>请不要用 Redis 做任何缓存之外的事</title><link>https://cloudside.icyyan.com/posts/redis-cache-only/</link><pubDate>Sat, 23 May 2026 11:00:00 +0800</pubDate><guid>https://cloudside.icyyan.com/posts/redis-cache-only/</guid><description>&lt;p&gt;Redis 是程序员工具箱里很容易被“过度信任”的东西。&lt;/p&gt;
&lt;p&gt;它太顺手了。&lt;/p&gt;
&lt;p&gt;想存个值，&lt;code&gt;SET&lt;/code&gt; 一下。想自动过期，&lt;code&gt;EXPIRE&lt;/code&gt; 一下。想做计数器，&lt;code&gt;INCR&lt;/code&gt; 一下。想搞队列，&lt;code&gt;LPUSH&lt;/code&gt; / &lt;code&gt;BRPOP&lt;/code&gt; 一下。想搞锁，&lt;code&gt;SET NX PX&lt;/code&gt; 一下。再看一眼 Stream，好像连消息系统也能顺手安排。&lt;/p&gt;
&lt;p&gt;于是很多系统就这么一路滑坡：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;第一天：Redis 只是缓存。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;第二天：这个状态先放 Redis 吧。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;第三天：队列也先放 Redis 吧。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;第四天：库存扣减也先放 Redis 吧。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;第五天：Redis 挂了，大家开始翻日志考古。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这篇文章想讲的观点很简单：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Redis 能做很多事，但不要让它单独拥有真相。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果一份数据不能丢、不能错、不能重复处理、不能悄悄过期、不能被内存策略淘汰，那它就不应该只待在 Redis 里。&lt;/p&gt;
&lt;p&gt;Redis 最舒服的位置是缓存。它可以让系统跑得更快，但不应该决定系统还活不活得明白。&lt;/p&gt;
&lt;h2 id="先看边界缓存可以重建事实不能只靠-redis"&gt;先看边界：缓存可以重建，事实不能只靠 Redis&lt;/h2&gt;
&lt;p&gt;先把话说在前面：这不是 Redis 不行。&lt;/p&gt;
&lt;p&gt;Redis 很强，而且越来越强。它有 RDB，有 AOF，有复制，有 Sentinel，有 Cluster，有 Streams，还有很多高级数据结构。Redis 8 之后，JSON、Search、Time Series、概率数据结构等能力也被合进 Redis Open Source。&lt;/p&gt;
&lt;p&gt;所以问题不是“Redis 能不能干更多活”。&lt;/p&gt;
&lt;p&gt;问题是：&lt;strong&gt;你把活交给 Redis 之后，能不能接受它的失败方式。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;缓存的失败方式很朴素：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Redis 没了
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -&amp;gt; 缓存 miss
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -&amp;gt; 回源数据库
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -&amp;gt; 重新写缓存
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这很烦，但不至于让业务当场失忆。&lt;/p&gt;</description></item><item><title>Redis 底层数据结构：一个 key 背后到底藏着什么</title><link>https://cloudside.icyyan.com/posts/redis-underlying-data-structures/</link><pubDate>Sat, 23 May 2026 10:00:00 +0800</pubDate><guid>https://cloudside.icyyan.com/posts/redis-underlying-data-structures/</guid><description>&lt;p&gt;很多人第一次学 Redis，记住的是五种常用类型：String、List、Hash、Set、ZSet。再往后背面试题，又会遇到 SDS、quicklist、listpack、intset、skiplist、hashtable。&lt;/p&gt;
&lt;p&gt;这些名字放在一起很容易让人迷糊：Redis 不是 key-value 数据库吗？为什么一个 &lt;code&gt;Hash&lt;/code&gt; 后面还会有 &lt;code&gt;listpack&lt;/code&gt; 和 &lt;code&gt;hashtable&lt;/code&gt; 两种实现？为什么同样是 &lt;code&gt;Set&lt;/code&gt;，有时是 &lt;code&gt;intset&lt;/code&gt;，有时又变成哈希表？&lt;/p&gt;
&lt;p&gt;真正要理解的不是“Redis 有哪些数据结构”这张清单，而是一个更具体的问题：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Redis 为什么要让同一种对外类型，在不同场景下切换不同的内部编码？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;顺着这个问题往下看，Redis 的底层数据结构会清楚很多。它不是为了把实现弄复杂，而是在内存、CPU、查询速度、扩容成本之间做了一组很工程化的取舍。&lt;/p&gt;
&lt;p&gt;本文写作和更新时的版本背景是：截至 2026 年 5 月 23 日，Redis Open Source 最新稳定版是 &lt;code&gt;8.6.3&lt;/code&gt;，这是 2026 年 5 月发布的安全修复版本；Redis GitHub releases 里还能看到 &lt;code&gt;8.8-RC1&lt;/code&gt;，但它是预发布版，官方说明不适合生产环境使用。&lt;/p&gt;
&lt;p&gt;从底层数据结构这条线看，Redis 8.6 最值得关注的不是“又多背几个结构名”，而是几类更贴近日常排查的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大 Hash 和大 ZSet 的内存占用继续被优化。&lt;/li&gt;
&lt;li&gt;Stream 增加了 &lt;code&gt;XADD IDMP&lt;/code&gt; / &lt;code&gt;IDMPAUTO&lt;/code&gt;，用于幂等写入。&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;HOTKEYS&lt;/code&gt;，能直接辅助定位热点 key。&lt;/li&gt;
&lt;li&gt;新增 key 内存大小直方图相关能力，排查 List、Set、Hash、ZSet 的规模分布更方便。&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;volatile-lrm&lt;/code&gt; 和 &lt;code&gt;allkeys-lrm&lt;/code&gt; 淘汰策略，按“最近修改时间”参与淘汰。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;旧版本里经常出现的 &lt;code&gt;ziplist&lt;/code&gt;，在 Redis 7 之后大多已经被 &lt;code&gt;listpack&lt;/code&gt; 替代，所以不要再只背“压缩列表”那套旧答案。&lt;/p&gt;</description></item></channel></rss>