3、数据类型案例

1、案例一

  • 业务场景:
    • 人工智能领域的语义识别与自动对话将是未来服务业机器人应答呼叫体系中的重要技术,百度自研用户评价语义识别服务,免费开放给企业试用,同时训练百度自己的模型。现对试用用户的使用行为进行限速,限制每个用户每分钟最多发起10次调用
  • 解决方案:
    • 设计计数器,记录调用次数,用于控制业务执行次数。以用户id作为key,使用次数作为value
    • 在调用钱获取次数,判断是否超过限定次数
      • 不超过次数的情况下,每次调用计数+1
      • 业务调用失败,计数-1
    • 为计数器设置生命周期为指定周期,例如1秒/分钟,自动清空周期内使用次数
# 查看用户为415的是否存在
127.0.0.1:6379> get 415
(nil)
# 创建用户为415的,过期时间为60s
127.0.0.1:6379> setex 415 60 1
OK
# 判断是否存在
127.0.0.1:6379> get 415
"1"
# 存在则+1
127.0.0.1:6379> incr 415
(integer) 2
127.0.0.1:6379> incr 415
(integer) 3
127.0.0.1:6379> incrby 415 7
(integer) 10
# 判断是否存在,获取当前415调用的次数
127.0.0.1:6379> get 415
"10"
# 如果大于10则禁止调用,等60s,自动清空后,重新处理
127.0.0.1:6379> get 415
(nil)
  • 解决方案改良:
    • 取消最大值的判断,利用incr操作超过最大值抛出异常的形式替代每次判断是否大于最大值
    • 判断是否为nil
      • 如果是,设置为max-次数
      • 如果不是,计数+1
      • 业务调用失败,计数-1
    • 遇到异常即+操作超过上限,视为使用达到上限
# 获取用户415是否存在
127.0.0.1:6379> get 415
(nil)
# 不存在创建,过期时间为60s
127.0.0.1:6379> setex 415 60 9223372036854775799
OK
# 获取415是否存在,存在则返回当前值
127.0.0.1:6379> get 415
"9223372036854775799"
# 调用成功则+1
127.0.0.1:6379> incr 415
(integer) 9223372036854775800
127.0.0.1:6379> incr 415
(integer) 9223372036854775801
127.0.0.1:6379> incr 415
(integer) 9223372036854775802
127.0.0.1:6379> incrby 415 5
(integer) 9223372036854775807
# 当调用10次后,incr操作的最大值,抛出异常,禁止访问;60s过期后,重新操作
127.0.0.1:6379> incr 415
(error) ERR increment or decrement would overflow

2、案例二

  • 业务场景:
    • 使用微信的过程中,当微信接收消息后,会默认将最近接收的消息置顶,当多个好友及关注的订阅号同时发送消息时,该排序会不停的进行交替。同时还可以将重要的会话设置为置顶。一旦用户离线后,再次打开微信时,消息该按照什么样的顺序显示?
  • 业务分析:
  • 解决方案:
    • 依赖list的数据具有顺序的特征对消息进行管理,将list结构作为栈使用
    • 对置顶与普通会话分别创建独立的list分别管理
    • 当某个list中接收到用户消息后,将消息发送方的id从list的一侧加入list(此处设置为左侧)
    • 多个相同id发出的消息反复入栈会出现问题,在入栈之前无论是否具有当前id对应的消息,先删除对应id
    • 推送消息时先推送置顶会话list,再推送普通会话list,推送完成的list清除所有list
    • 消息的数量,也就是微信用户对话数量采用计数器的思想另行记录,伴随list操作同步更新
# 都在普通会话中
# 200用户向100用户发送消息,先删除100列表中200用户的消息
127.0.0.1:6379> lrem 100 1 200
(integer) 0
# 将200用户添加到100用户列表中
127.0.0.1:6379> lpush 100 200
(integer) 1
# 300用户向100用户发送消息,先删除100列表中300用户的消息
127.0.0.1:6379> lrem 100 1 300
(integer) 0
# 将300用户添加到100用户列表中
127.0.0.1:6379> lpush 100 300
(integer) 2
# 400用户向100用户发送消息,先删除100列表中400用户的消息
127.0.0.1:6379> lrem 100 1 400
(integer) 0
# 将400用户添加到100用户列表中
127.0.0.1:6379> lpush 100 400
(integer) 3
# 200用户向100用户发送消息,先删除100列表中200用户的消息
127.0.0.1:6379> lrem 100 1 200
(integer) 1
# 将200用户添加到100用户列表中
127.0.0.1:6379> lpush 100 200
(integer) 3
# 300用户向100用户发送消息,先删除100列表中300用户的消息
127.0.0.1:6379> lrem 100 1 300
(integer) 1
# 将300用户添加到100用户列表中
127.0.0.1:6379> lpush 100 300
(integer) 3
# 查看100列表的集合
127.0.0.1:6379> lrange 100 0 -1
1) "300"
2) "200"
3) "400"
  • redis应用于基于时间顺序的数据操作,而不关注具体时间

3、解决方案列表

  • Tips 1:redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性
  • Tips 2:redis 控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
  • Tips 3:redis应用于各种结构型和非结构型高热度数据访问加速
  • Tips 4:redis 应用于购物车数据存储设计
  • Tips 5:redis 应用于抢购,限购类、限量发放优惠卷、激活码等业务的数据存储设计
  • Tips 6:redis 应用于具有操作先后顺序的数据控制
  • Tips 7:redis 应用于最新消息展示
  • Tips 8:redis 应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热卖旅游线路,应用APP推荐,大V推荐等
  • Tips 9:redis 应用于同类信息的关联搜索,二度关联搜索,深度关联搜索
  • Tips 10:redis 应用于同类型不重复数据的合并、取交集操作
  • Tips 11:redis 应用于同类型数据的快速去重
  • Tips 12:redis 应用于基于黑名单与白名单设定的服务控制
  • Tips 13:redis 应用于计数器组合排序功能对应的排名
  • Tips 14:redis 应用于定时任务执行顺序管理或任务过期管理
  • Tips 15:redis 应用于及时任务/消息队列执行管理
  • Tips 16:redis 应用于按次结算的服务控制
  • Tips 17:redis 应用于基于时间顺序的数据操作,而不关注具体时间
posted @ 2022-04-12 09:18  郭祺迦  阅读(61)  评论(0)    收藏  举报