---
title: "Redis 缓存设计"
description: "一 穿透优化缓存空对象和布隆过滤器方案对比解决缓存穿透适用场景维护成本缓存空对象数据命中不高数据频繁变化实时"
date: 2020-06-15T01:14:17Z
canonical: https://xiaobox.github.io/p/2020-06-15-redis-huan-cun-she-ji/
author: 小盒子
categories: ["数据库"]
tags: ["Redis", "Cursor", "缓存"]
source: https://mp.weixin.qq.com/s/aifmvE2ZuDYvDW4CxwicLA
license: CC BY-NC-SA 4.0
license_url: https://creativecommons.org/licenses/by-nc-sa/4.0/
---

# Redis 缓存设计

## 一 穿透优化

缓存空对象和布隆过滤器方案对比

<table width="720" style="visibility: visible;"><tbody style="visibility: visible;"><tr style="visibility: visible;"><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="fde2295429c5c79212e7aca726239ba5_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;"><strong style="visibility: visible;">解决缓存穿透</strong></p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="a48b880b84de0ba7a16bb43c24ccd6ea_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;"><strong style="visibility: visible;">适用场景</strong></p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="7c3fe76d63ce929b1dcf2bb9a7d88787_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;"><strong style="visibility: visible;">维护成本</strong></p></td></tr><tr style="visibility: visible;"><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="b661fb406e6e5f18505e3f7ac13e9b3d_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">缓存空对象</p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><ul data-lake-id="c184ba27277b7dbe55a59195bd0d8ed4" lake-indent="0" style="padding-left: 23px; color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;" class="list-paddingleft-2"><li style="visibility: visible;"><p style="visibility: visible;">数据命中不高</p></li><li style="visibility: visible;"><p style="visibility: visible;">数据频繁变化实时性高</p></li></ul></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><ul data-lake-id="687822ad5fad9e57be713f213d869be7" lake-indent="0" style="padding-left: 23px; color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;" class="list-paddingleft-2"><li style="visibility: visible;"><p style="visibility: visible;">代码维护简单</p></li><li style="visibility: visible;"><p style="visibility: visible;">需要过多的缓存空间</p></li><li style="visibility: visible;"><p style="visibility: visible;">数据不一致</p></li></ul></td></tr><tr style="visibility: visible;"><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="d7af0310ac0e95f988a70e5441f44a0f_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">布隆过滤器</p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><ul data-lake-id="97e45749079eec970278cc04a24c65a5" lake-indent="0" style="padding-left: 23px; color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;" class="list-paddingleft-2"><li style="visibility: visible;"><p style="visibility: visible;">数据命中不高</p></li><li style="visibility: visible;"><p style="visibility: visible;">数据相对固定实时性低</p></li></ul></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><ul data-lake-id="24c0818cb5b94aec0d956f05b5d55e60" lake-indent="0" style="padding-left: 23px; color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;" class="list-paddingleft-2"><li style="visibility: visible;"><p style="visibility: visible;">代码维护复杂</p></li><li style="visibility: visible;"><p style="visibility: visible;">缓存空间占用少</p></li></ul></td></tr></tbody></table>

## 二 无底洞优化

四种批量操作解决方案对比

<table width="816" style="width: 768px; visibility: visible;"><tbody style="visibility: visible;"><tr style="visibility: visible;"><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="98880d2e2384a82cab2edfadb1db76e7" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">方案</p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="2150ac97fbb23fb729d99e15e549bcf2_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">优点</p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="d79f1fcb736eabc817a18c00a561849f_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">缺点</p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="17408d955d984b3c9a356c78d88c29b4_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">网络IO</p></td></tr><tr style="visibility: visible;"><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="bbec2d342490cbcfeecbd3bd5ad7bab9_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">串行命令</p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><ol start="1" data-lake-id="d3c01a2e66539eb3d6bf3cc52d3df680" lake-indent="0" style="padding-left: 23px; color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;" class="list-paddingleft-2"><li style="visibility: visible;"><p style="visibility: visible;">编程简单</p></li><li style="visibility: visible;"><p style="visibility: visible;">如果少量keys,性能可以满足要求</p></li></ol></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="a889113aa6f70a1591a40f73f7410ec2_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">大量keys请求延迟严重</p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="3db7af11047aa75725feecb9433267f8_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">O(keys)</p></td></tr><tr style="visibility: visible;"><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="b5dffc2afdcf1aef240cfa6b46e86468_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">串行IO</p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><ol start="1" data-lake-id="3723a7ec9586f85cf482e7c2f7858e54" lake-indent="0" style="padding-left: 23px; color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;" class="list-paddingleft-2"><li style="visibility: visible;"><p style="visibility: visible;">编程简单</p></li><li style="visibility: visible;"><p style="visibility: visible;">少量节点，性能满足要求</p></li></ol></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="d381f94a3aff8ef12f4116d3a1ce758e_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">大量node 延迟严重</p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="3db7af11047aa75725feecb9433267f8_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">O(nodes)</p></td></tr><tr style="visibility: visible;"><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="261c41e1cf0506c5941d072a5b2bdde6_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">并行IO</p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="6e5ffed793d47b7c2347234815329930_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">利用并行特性，延迟取决于最慢的节点</p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><ol start="1" data-lake-id="62fc8f2c07e216de5e5fc7bb87227aef" lake-indent="0" style="padding-left: 23px; color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;" class="list-paddingleft-2"><li style="visibility: visible;"><p style="visibility: visible;">编程复杂</p></li><li style="visibility: visible;"><p style="visibility: visible;">由于多线程，问题定位可能较难</p></li></ol></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="3db7af11047aa75725feecb9433267f8_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">O(max_slow(nodes))</p></td></tr><tr style="visibility: visible;"><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="4546aac156056bf7de1b20700ec90be3_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">hash_tag</p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="655a609062730fc729744dc4210116f2_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">性能最高</p></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><ol start="1" data-lake-id="db8912a31d4e0a35c69f45fc23efacb2" lake-indent="0" style="padding-left: 23px; color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;" class="list-paddingleft-2"><li style="visibility: visible;"><p style="visibility: visible;">业务维护成本较高</p></li><li style="visibility: visible;"><p style="visibility: visible;">容易出现数据倾斜</p></li></ol></td><td style="min-width: 90px; font-size: 14px; white-space: normal; border-color: rgb(217, 217, 217); padding: 4px 8px; cursor: default; visibility: visible;"><p data-lake-id="3db7af11047aa75725feecb9433267f8_p_0" style="color: rgb(38, 38, 38); line-height: 1.74; letter-spacing: 0.05em; outline-style: none; visibility: visible;">O(1)</p></td></tr></tbody></table>

##

##

## 三 雪崩优化

-   保证缓存层服务高可用性

-   依赖隔离组件为后端限流并降级

-   提前演练

## 四 热点key 重建优化

两种热点key 的解决方法

<table width="720"><tbody><tr><td style="min-width: 90px;font-size: 14px;white-space: normal;border-color: rgb(217, 217, 217);padding: 4px 8px;cursor: default;"><p data-lake-id="fde2295429c5c79212e7aca726239ba5_p_0" style="color: rgb(38, 38, 38);line-height: 1.74;letter-spacing: 0.05em;outline-style: none;">解决方案</p></td><td style="min-width: 90px;font-size: 14px;white-space: normal;border-color: rgb(217, 217, 217);padding: 4px 8px;cursor: default;"><p data-lake-id="2150ac97fbb23fb729d99e15e549bcf2_p_0" style="color: rgb(38, 38, 38);line-height: 1.74;letter-spacing: 0.05em;outline-style: none;">优点</p></td><td style="min-width: 90px;font-size: 14px;white-space: normal;border-color: rgb(217, 217, 217);padding: 4px 8px;cursor: default;"><p data-lake-id="d79f1fcb736eabc817a18c00a561849f_p_0" style="color: rgb(38, 38, 38);line-height: 1.74;letter-spacing: 0.05em;outline-style: none;">缺点</p></td></tr><tr><td style="min-width: 90px;font-size: 14px;white-space: normal;border-color: rgb(217, 217, 217);padding: 4px 8px;cursor: default;"><p data-lake-id="cc1711acb09e301f4656701502ff8bd0_p_0" style="color: rgb(38, 38, 38);line-height: 1.74;letter-spacing: 0.05em;outline-style: none;">简单分布式锁</p></td><td style="min-width: 90px;font-size: 14px;white-space: normal;border-color: rgb(217, 217, 217);padding: 4px 8px;cursor: default;"><ul data-lake-id="67ad9ea192a5230b8d3cd5509b9af76f" lake-indent="0" style="padding-left: 23px;color: rgb(38, 38, 38);line-height: 1.74;letter-spacing: 0.05em;outline-style: none;" class="list-paddingleft-2"><li><p>思路简单</p></li><li><p>保证一致性</p></li></ul></td><td style="min-width: 90px;font-size: 14px;white-space: normal;border-color: rgb(217, 217, 217);padding: 4px 8px;cursor: default;"><ul data-lake-id="8ba79bdcea3d0486416bfbb05e1cb304" lake-indent="0" style="padding-left: 23px;color: rgb(38, 38, 38);line-height: 1.74;letter-spacing: 0.05em;outline-style: none;" class="list-paddingleft-2"><li><p>代码复杂度增大</p></li><li><p>存在死锁的风险</p></li><li><p>存在线程池阻塞的风险</p></li></ul></td></tr><tr><td style="min-width: 90px;font-size: 14px;white-space: normal;border-color: rgb(217, 217, 217);padding: 4px 8px;cursor: default;"><p data-lake-id="313f31a63cf7002ba68f1b49fb3597b2_p_0" style="color: rgb(38, 38, 38);line-height: 1.74;letter-spacing: 0.05em;outline-style: none;">永远不过期</p></td><td style="min-width: 90px;font-size: 14px;white-space: normal;border-color: rgb(217, 217, 217);padding: 4px 8px;cursor: default;"><p data-lake-id="2657e714c64011821420ca6be6371384_p_0" style="color: rgb(38, 38, 38);line-height: 1.74;letter-spacing: 0.05em;outline-style: none;">基本杜绝热点key 问题</p></td><td style="min-width: 90px;font-size: 14px;white-space: normal;border-color: rgb(217, 217, 217);padding: 4px 8px;cursor: default;"><ul data-lake-id="cf0759c94b42243a8e3f1d49997abacb" lake-indent="0" style="padding-left: 23px;color: rgb(38, 38, 38);line-height: 1.74;letter-spacing: 0.05em;outline-style: none;" class="list-paddingleft-2"><li><p>不保证一致性</p></li><li><p>逻辑过期时间增加代码维护成本和内存成本</p></li></ul></td></tr></tbody></table>

![Image](https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2020-06-15-redis-huan-cun-she-ji/001-bf98d7fd.jpg)

关注公众号 获取更多精彩内容

