文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
4 实践篇
内存使用策略
Redis 使用中要注意缓存穿透、缓存击穿和缓存雪崩的情形。
Redis 内存满了,怎么办?
- 增加内存
- 使用内存淘汰策略
- Redis 集群
Redis 默认设置了最大内存 maxmemory。如果超过最大内存,会触发内存淘汰策略 maxmemory-policy。如果系统内存不够,也会触发 Redis 删除部分数据以释放内存。
- LRU:least RecentlyUsed 表示最近最少使用;
- LFU:least FreqUsed 表示最不常用的。
表格 maxmemory-policy 内存淘汰策略 详细说明
规则名称 | 规则说明 |
---|---|
volatile-lru | 使用 LRU 算法删除一个键(只对设置了生存时间的键) |
allkeys-lru | 使用 LRU 算法删除一个键 |
volatile-lfu | 使用 LFU 算法删除一个键(只对设置了生存时间的键) |
allkeys-lfu | 使用 LFU 算法删除一个键 |
volatile-random | 随机删除一个键(只对设置了生存时间的键) |
allkeys-random | 随机删除一个键 |
volatile-ttl | 删除生存时间最近的一个键 |
noeviction | 拒绝策略(默认策略)。不删除键,只返回错误 |
数据类型场景
表格 23 Redis 各个数据类型应用场景
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
String (字符串) | 二进制安全 | 可以包含任何数据,比如 jpg 图片或者序列化的对象,一个键最大能存储 512M | --- |
Hash (字典) | 键值对集合,即编程语言中的 Map 类型 | 适合存储对象,并且可以像数据库中 update 一个属性一样只修改某一项属性值(Memcached 中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性 |
List (列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的 API | 1.最新消息排行等功能(比如朋友圈的时间线) 2.消息队列 |
Set (集合) | 哈希表实现,元素不重复 | 1.添加、删除,查找的复杂度都是 O(1)2.为集合提供了求交集、并集、差集等操作 | 1、共同好友 2、利用唯一性,统计访问网站的所有独立 ip 3、好友推荐时,根据 tag 求交集,大于某个阈值就可以推荐 |
Sorted Set (有序集合) | 将 Set 中的元素增加一个权重参数 score,元素按 score 有序排列 | 数据插入集合时,已经进行天然排序 | 1、排行榜,TOP N2、带权重的消息队列 |
业务场景
由于 Redis 丰富的存储结构类型,Redis 有非常广阔的业务场景,常用在缓存、电商等领域。
表格 24 Redis 的业务场景示例
分类 | 业务场景 | 详述 |
---|---|---|
WEB 应用 | cookie | 缓存 cookie,设置过期时间 |
购物车 | 同一个 session | |
网页缓存 | ||
数据行缓存 | ||
支持程序 | 记录日志 | |
计数器和统计器 | INCR/DECR/INCRBY/HMSET/ZADD, 如 INCR global:xxx | |
查找 IP 所属区域 | ||
服务发现与配置 | ||
应用程序组件 | 自动补齐 | 模式匹配查找 keys xx 或者 scan xx |
分布式锁 | ||
任务队列 | List | |
消息拉取 | List | |
基于搜索的应用 | 搜索 | 模式匹配 |
广告定向 | ||
职位搜索 | ||
构建社交网站 | 可用于用户状态、主页时间线、关注者和被关注者列表、状态消息的发布与删除 |
示例:REDIS 键模式
表格 25 REDIS 示例:信纸电商销售的 redis 键模式
键 | 值类型 | 说明 | 命令示例 |
---|---|---|---|
global:stationery | int | 用于存储计数器。每当有新的信纸时会加 1 | INCR global:stationery 1 |
stationery:{int} | 哈希 | 为每种信纸类型存储高度、宽度和颜色。 | HMSET stationery:1 color blue with '30cm' heigh '40cm' ok |
stationery:{int}:sheets | int | 用于存储每件包裹的信纸张数,如示例中一个包裹 15 张信纸。 | INCRYBY stationery:1:sheets 15 |
stationery:{int}:inventory | int | 用于存储仓库可用于销售的包裹总数 | SET stationery:1:inventory 250 |
stationery:{int}:sales | zset | 其中的每个元素以销售的 UNIX timestamp 作为分值,以销售价格作为值。 | ZADD stationery:1:sales 143861194 20.0 |
说明:一个包裹可以包含多张信纸,销售时一般以包裹为单位。 命令示例中语句单个大写单词为 REDIS 命令。
表格 26 REDIS 示例:消息队列~模板/数据更新通知
键 | 值类型 | 说明 | 命令示例 |
---|---|---|---|
tenants | set | 用于存储所有租户信息 | |
$tenant:templates | set | 用于存储租户所对应的所有模板 | |
$tenant:$template | 哈希 | 用于存储某模板信息 | 暂不用 |
xxa:xxb:rq | set | xxa:xxb 前缀用来识别服务器信息. 异步用的消息队列,不重。 | |
xxa:xxb:gq | list | 异步用的先进先出消息队列,可重。 | |
xxa:xxb:update_time | string | 模型更新的时间。 |
备注:前缀带 $
表示变量,如 $tenant
表示某租户名。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论