返回介绍

4 实践篇

发布于 2024-10-03 10:16:41 字数 4835 浏览 0 评论 0 收藏 0

内存使用策略

Redis 使用中要注意缓存穿透、缓存击穿和缓存雪崩的情形。

Redis 内存满了,怎么办?

  1. 增加内存
  2. 使用内存淘汰策略
  3. 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 (列表)链表(双向链表)增删快,提供了操作某一段元素的 API1.最新消息排行等功能(比如朋友圈的时间线) 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:stationeryint用于存储计数器。每当有新的信纸时会加 1INCR global:stationery 1
stationery:{int}哈希为每种信纸类型存储高度、宽度和颜色。HMSET stationery:1 color blue with '30cm' heigh '40cm' ok
stationery:{int}:sheetsint用于存储每件包裹的信纸张数,如示例中一个包裹 15 张信纸。INCRYBY stationery:1:sheets 15
stationery:{int}:inventoryint用于存储仓库可用于销售的包裹总数SET stationery:1:inventory 250
stationery:{int}:saleszset其中的每个元素以销售的 UNIX timestamp 作为分值,以销售价格作为值。ZADD stationery:1:sales 143861194 20.0

说明:一个包裹可以包含多张信纸,销售时一般以包裹为单位。 命令示例中语句单个大写单词为 REDIS 命令。

表格 26 REDIS 示例:消息队列~模板/数据更新通知

值类型说明命令示例
tenantsset用于存储所有租户信息 
$tenant:templatesset用于存储租户所对应的所有模板 
$tenant:$template哈希用于存储某模板信息暂不用
xxa:xxb:rqsetxxa:xxb 前缀用来识别服务器信息. 异步用的消息队列,不重。 
xxa:xxb:gqlist异步用的先进先出消息队列,可重。 
xxa:xxb:update_timestring模型更新的时间。 

备注:前缀带 $ 表示变量,如 $tenant 表示某租户名。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文