当前位置: 首页 > 科技观察

终于搞清楚了Redis的场景设计,需要掌握的就到这里了

时间:2023-03-18 02:30:58 科技观察

分布式缓存是分布式系统中的重要组成部分。快速数据访问以提高性能。使用缓存的一个常见场景是:项目中的某些数据被频繁访问,对下游DB(如MySQL)造成服务压力。这时候可以使用缓存来提高效率。说说Redis在BAT等一线企业的各种应用场景的核心设计!1.常用指令接下来我们看一下各个数据结构的常用指令。我们用一个表格来清楚地展示它们:2.场景分析1.1字符串存储1.2字符串类型使用场景商品库存数据是热点数据,交易行为会直接影响库存。而Redis自带的String类型规定:setgoods_id10;将id为good_id的商品的库存初始值为10;decrgoods_id;商品购买时,库存数据减1。场景类比:商品的浏览量,问题或回复的点赞数等。这种统计场景可以使用Redis来实现。场景二:时效性信息存储Redis的数据存储具有故障自动处理能力。即存储的key-value可以设置过期时间:set(key,value,expireTime)。例如,用户登录某个App需要获取登录验证码,验证码在30秒内有效。那么我们可以使用String类型来存储验证码,并设置30秒的过期时间。2.1Hash存储数据2.2Hash类型使用场景Redis在存储对象(例如:用户信息)时,需要将对象序列化,然后存储。另一种形式是将对象数据转化为JSON结构数据,然后将JSON字符串存储到Redis中。对于一些对象类型,还有一种更方便的类型,就是按照Redis的Hash类型来存储。比如我们存储一些网站用户的基本信息,我们可以使用:这样存储一个用户的基本信息,存储的信息是:{姓名:小明,电话:“123456”,性别:“男”当然,这种类似的场景还有很多,比如存储订单数据、商品数据、商家基本信息等。基于淘宝购物车2.3信息存储优缺点1.原生:setuser:1:namejames;设置用户:1:年龄23;设置用户:1:性男孩;优点:简单直观,每个key对应一个value缺点:key太多,占用内存大,用户信息太分散,生产环境用不到2.将对象序列化到redissetuser:1serialize(userInfo);优点:编程简单,如果使用序列化合理内存占用高缺点:序列化和反序列化有一定的开销。更新属性时需要取出userInfo进行反序列化,然后序列化到redis3.hash中存储:hmsetuser:1namejamesage23sexboy优点:简单直观,合理使用可以减少内存空间消耗缺点:要控制ziplist和hashtable的两次编码转换,Mhashtable会比较消耗内存。3.1List类型使用场景List是一个按插入顺序排列的字符串链表。可以在头部和尾部插入新元素(采用双向链表实现,两端添加元素的时间复杂度为O(1))。场景一:消息队列实现目前有很多专业的消息队列组件,如Kafka、RabbitMQ等。这里只是利用list的特性来实现消息队列的需求。在实际技术选择的过程中,大家可以慎重考虑。列表存储是队列的存储形式:lpushkeyvalue;在key对应的列表头部添加一个字符串元素;弹出键;移除列表的最后一个元素,返回值为被移除的元素。场景二:交易网站首页经常有新品推荐模块,推荐最新上架的商品。该模块存储前100个最新产品。此时使用Redis的list数据结构存储TOP100新上架商品。Redisltrim命令对列表进行修整,使列表只包含指定范围内的指定元素。start和stop都是从0开始计数,其中0是列表中的第一个元素(表头),1是第二个元素。以下伪代码演示:4.1集合类型使用场景集合同时存储集合列表的功能。与list不同,set具有去重功能。当需要存储一个列表的信息,同时又要求列表中的元素不能重复时,这时候使用set比较合适。同时set还提供了交、并、差。例如,在一个交易网站上,我们存储了用户感兴趣的物品信息,在分析相似用户时,我们可以通过计算两个不同用户之间感兴趣的物品数量来提供一些证据。获取两个用户相似的产品,然后确定相似产品的类别进行用户分析。类似的应用场景还包括对社交场景中好友共同关注、相似兴趣标签等场景的支持。4.2集合特殊操作命令setA={A,B,C}setB={B,C}1)集合之间的交集sintersetAsetB-->getset{B,C}集合与集合之间unionsetsunionsetAsetB-->获取集合{A,B,C}3)集合与集合的区别sdiffsetAsetB-->获取集合{A}4.3集合微博的特殊操作命令应用场景如何实现-关系设计?5.1Zset有序集合常用于排名。比如视频网站需要对用户上传的视频进行排名,或者点赞数与收藏相关,不能有重复会员。5.2Zset类型使用场景