Redis数据类型的应用业务场景分析
这篇文章主要针对Redis中不同数据类型在各种业务场景下的应用进行一个介绍,以加深我们对Redis中数据类特性和操作的概念印象。
字符串
扩展操作
业务场景
大型企业级应用中,分表操作是基本操作,使用多张表存储同类型数据,但是对应的主键id必须保证统一性,不能重复。Oracle数据库具有sequence设定,可以解决该问题,但是MySQL数据库并不具有类似的机制,那么如何解决。
解决方案
不要让数据库进行主键自增,而是由Redis来控制主键的增减操作。
创建字符串对象,并且其中存储的纯数字。
- 设置数值数据增加指定范围的值
incr key
incrby key increment
incrbyfloat
- 设置数值数据减少的指定范围的值
decr key
decrby ke increment
String作为数值操作
- string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。
- redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
- 注意:按数值进行操作的数据,如果原始数据不能转成数值,或超过了redis数值上线范围,将会报错。9223372036854775807 (java中long型数据最大值,Long.MAX_VALUE)。
数据时效性
业务场景
微信上的投票,每个微信号每4个小时只能投1票;电商商家开启热门商品推荐,热门商品不能一直处于热门期,每种商品热门期维持3天,3天后自动取消;热门新闻网站会出现热点新闻,热点新闻最大的特征是对时效性,如何自动控制热点新闻的时效性。
解决方案
- 设置数据具有指定的声明周期
setex key seconds value
psetex key milliseconds value
热点数据
业务场景
主页高频访问信息显示控制,例如微博上大V主页显示粉丝数与微博数量。
解决方案
- 在Redis中为用户设定用户信息,以用户主键和属性值作为Redis字符串的key,后台设置定时刷新策略。
- 在Redis中可以以Json格式存储用户信息,放到value中,定时刷新。(也可以用下面的哈希)
Key的设置约定
由于Redis的数据大部分和数据库有关系,所以,key的命名需要和数据库中的相关信息对应。数据库中的热点数据key命名惯例如下:
表名:主键名:主键值:字段名
order:id :123123:name
哈希
如果用字符串存储了Json数据,如果需要修改,那么就会修改整个字符串,显得十分笨重。字符串比较适用于读取的操作,如果更新操作比较多,还是用哈希。
购物车
业务场景
电商网站购物车设计与实现。
业务分析
- 仅分析购物车的redis存储模型,添加、浏览、更改数量、删除、清空。
- 购物车于数据库间持久化同步。
- 购物车和订单之间关系,提交购物车:读取数据生成订单;商家价格调整:隶属订单级别。
- 未登录用户购物车信息存储:cookie存储。
解决方案
- 将用户的id作为key,每个客户创建一个哈希存储结构对应的购物车信息。
- 商品的id作为field,数量作为value。
- 添加商品:追加全新的field与value。
- 浏览:遍历哈希。
- 更改数量:设置对应field的value。
- 删除商品:阐述field。
- 清空:删除key。
加速购物车的呈现
利用一个独立哈希结构专用于保存购物车中显示的信息,包含文字描述,图片地址,所属商家信息等
1、命名格式:商品id
2、保存数据:各类信息
查询商品信息的时候,就直接去检索这个表。
利用hsetnx操作,如果当前key存在有值,那就什么都不错,如果没有值,那就添加。
抢购
业务场景
不同商家,退出不同的商品,需要进行抢购。
解决方案
- 以商家id作为key。
- 将参与抢购的商品id作为field。
- 将对应的商品数量作为value。
- 抢购时使用降值的方式控制产品数量。
列表
时间顺序要求
业务场景
- 用户关注列表的显示顺序就是根据时间显示的。
- 新闻资讯之类的展示顺序根据发生的是新顺序。
- 企业运营过程中,系统产生大量的运营数据,如何保障多台服务器操作日志的同一输出顺序。
** 解决方案**
- 依赖list的数据具有顺序的特征对信息进行管理。
- 使用队列模型解决多路信息汇总合并的问题。
- 使用栈模型解决最新消息的问题。
集合
操作随机数据
业务场景
给用户随机推送热门视频。
业务分析
- 系统分析出各个分类的最新或最热点信息条目并组织成set集合。
- 随机挑选其中部分信息。
- 配合用户关注信息分类中的热点信息组织展示的全信息集合。
解决方案
- 随机获取集合中指定数量的数据。
srandmember key count
- 随机获取集合中某个数据并将数据移除集合
spop key
推荐系统
业务场景
- 微博的热门博主推荐。
- QQ共同好友显示,好友推荐。
- 美团的店铺推荐之类的。
解决方案
- 求两个集合的交并差集合。
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]
- 求两个集合的交并差集合并存储到指定的集合中。
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
- 将指定数据从原始集合中移动到目标集合中。
smove source destination member
权限校验
业务场景
公司具有很多员工,内部OA系统具有多种角色、业务操作和数据,每个员工也具有一个或者多个的角色,如何进行权限校验。
解决方案
- 依赖set集合数据不重复的特征,依赖set集合hash存储结构特征完成数据过滤与快速查询。
- 根据用户id获取用户所有角色。
- 根据用户所有角色获取用户所有操作权限放入set集合。
- 根据用户所有角色获取用户所有数据全选放入set集合。
网站访问量统计
业务场景
统计网站的访问量(PV)、独立访客(UV)、独立IP。
解决方案
- 利用set集合的数据去重特征,记录各种访问数据。
- 建立string类型数据,利用incr统计日访问量(PV)。
- 建立set模型,记录不同cookie数量(UV)。
- 建立set模型,记录不用IP数量(IP)。
黑白名单
业务场景
将恶意用户拉入黑名单,将可靠的用户纳入白名单。
解决方案
- 基于经营战略设定问题用户发现、鉴别规则。
- 周期性更新满足规则的用户黑名单,加入set集合。
- 用户行为信息达到后与黑名单进行比比对,确认行为去向。
- 黑名单过滤IP地址:应用于开放游客访问权限的信息源。
- 黑名单过滤设备信息:应用于限定访问设备的信息源。
- 黑名单过滤用户:应用于基于访问权限的信息源。
排序集合
排行榜
业务场景
- 各类投票排序。
- 聊天室活跃度排序。
- 好友亲密度排序。
解决方案
- 获取数据对应的索引(排名)。
zrank key member
zrevrank key member
- score 值获取与修改。
zscore key member
zincrby key increment member
基于时效性控制的任务管理
业务场景
- 例如时效性的会员机制。
- 网站定期开启投票,限时操作,逾期作废。
解决方案
- 对于基于时间线限定的任务处理,将处理时间记录为score值,利用排序功能区分处理的先后顺序。
- 记录下一个要处理的事件,当到期后处理对应的任务,移除redis中的记录,并记录下一个要处理的时间。
- 当新任务加入时,判定并更新当前下一个要处理的任务时间。
- 为提升sorted_set的性能,通常将任务根据特征存储成若干个sorted_set。例如1小时内,1天内,年度等,操作时逐渐提升,将即将操作的若干个任务纳入到1小时内处理队列中。
带有权重的任务管理
业务场景
任务队列和消息队列具有权重,根据其优先级进行不同处理。
解决方案
- 对于带有权重的任务,优先处理权重高的任务,采用score记录权重即可。