zoukankan      html  css  js  c++  java
  • 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记录权重即可。
  • 相关阅读:
    新工作 Day24 周六
    新工作 Day23 周五
    新工作 Day22 周四
    新工作 Day21 周三
    新工作 Day20 周二
    新工作 Day19 周一
    新工作 Day18 周日
    新工作 Day17 周六
    java线程池 多线程搜索文件包含关键字所在的文件路径
    java实现搜索文件夹中所有文件包含的关键字的文件路径(递归搜索)
  • 原文地址:https://www.cnblogs.com/lippon/p/14226772.html
Copyright © 2011-2022 走看看