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记录权重即可。
posted @ 2021-01-03 20:25  lippon  阅读(245)  评论(0编辑  收藏  举报