面试题:Redis的应用场景核心设计,看完面试不在慌!

分布式缓存是分布式系统中的重要组件,主要解决高并发、大数据场景下,热点数据访问的性能问题,提供高性能的数据快速访问。面试

使用缓存常见场景是:项目中部分数据访问比较频繁,对下游 DB(例如 MySQL)形成服务压力,这时候可使用缓存来提升效率。下面来说BAT等一线企业中Redis各类应用场景核心设计!redis

1、经常使用指令

接下来看看每一个数据结构经常使用的指令有哪些,咱们用一张表比较清晰的展现:编程


2、场景解析

1.1string存储


1.2String 类型使用场景

场景一:商品库存数后端

从业务上,商品库存数据是热点数据,交易行为会直接影响库存。而 Redis 自身 String 类型提供了:缓存

  1. set goods_id 10; 设置 id 为 good_id 的商品的库存初始值为 10;
  2. decr goods_id; 当商品被购买时候,库存数据减 1。

依次类推的场景:商品的浏览次数,问题或者回复的点赞次数等。这种计数的场景均可以考虑利用 Redis 来实现。数据结构

场景二:时效信息存储架构

Redis 的数据存储具备自动失效能力。也就是存储的 key-value 能够设置过时时间:set(key, value, expireTime)。并发

好比,用户登陆某个 App 须要获取登陆验证码, 验证码在 30 秒内有效。那么咱们就可使用 String 类型存储验证码,同时设置 30 秒的失效时间。分布式


2.1hash存储数据


2.2Hash 类型使用场景

Redis 在存储对象(例如:用户信息)的时候须要对对象进行序列化转换而后存储。ide

还有一种形式,就是将对象数据转换为 JSON 结构数据,而后存储 JSON 的字符串到 Redis。

对于一些对象类型,还有一种比较方便的类型,那就是按照 Redis 的 Hash 类型进行存储。

例如,咱们存储一些网站用户的基本信息, 咱们可使用:

这样就存储了一个用户基本信息,存储信息有:{name : 小明, phone : “123456”,sex : “男”}

固然这种相似场景还很是多, 好比存储订单的数据,产品的数据,商家基本信息等。以淘宝购物车为主


2.3实现信息存储的优缺点

1.原生: 
  • set user: 1:name james; 
  • set user:1:age 23;
  • set user:1:sex boy;

优势:简单直观,每一个键对应一个值 

缺点:键数过多,占用内存多,用户信息过于分散,不用于生产环境 

2.将对象序列化存入

redis set user:1 serial ize (userInfo);

优势:编程简单,若使用序列化合理内存使用率高 

缺点:序列化与反序列化有必定开销,更新属性时须要把userInfo全取出来进行反序列化,更新后再序列化到redis

3.hash存储:

hmset user:1 name james age 23 sex boy 

优势:简单直观,使用合理可减小内存空间消耗 

缺点:要控制ziplist 与hashtable两种编码转换,Mhashtable会消耗更多内存。 

3.1List 类型使用场景

list 是按照插入顺序排序的字符串链表。能够在头部和尾部插入新的元素(双向链表实现,两端添加元素的时间复杂度为 O(1)) 。


场景一:消息队列实现

目前有不少专业的消息队列组件 Kafka、RabbitMQ 等。 咱们在这里仅仅是使用 list 的特征来实现消息队列的要求。在实际技术选型的过程当中,你们能够慎重思考。

list 存储就是一个队列的存储形式:

  1. lpush key value; 在 key 对应 list 的头部添加字符串元素;
  2. rpop key;移除列表的最后一个元素,返回值为移除的元素。

场景二:最新上架商品

在交易网站首页常常会有新上架产品推荐的模块, 这个模块是存储了最新上架前 100 名。

这时候使用 Redis 的 list 数据结构,来进行 TOP 100 新上架产品的存储。

Redis ltrim 指令对一个列表进行修剪(trim),这样 list 就会只包含指定范围的指定元素。

start 和 stop 都是由 0 开始计数的,这里的 0 是列表里的第一个元素(表头),1 是第二个元素。

以下伪代码演示:

4.1set 类型使用场景

set 也是存储了一个集合列表功能。和 list 不一样,set 具有去重功能。当须要存储一个列表信息,同时要求列表内的元素不能有重复,这时候使用 set 比较合适。与此同时,set 还提供的交集、并集、差集。

例如,在交易网站,咱们会存储用户感兴趣的商品信息,在进行类似用户分析的时候, 能够经过计算两个不一样用户之间感兴趣商品的数量来提供一些依据。

获取到两个用户类似的产品, 而后肯定类似产品的类目就能够进行用户分析。

相似的应用场景还有, 社交场景下共同关注好友, 类似兴趣 tag 等场景的支持。


4.2Set集合特殊的操做命令

setA={A,B,C} setB={B, C}

1)集合与集合之间的交集

sinter setA setB-->获得集合{B,C}

2) 集合与集合之间的并集

sunion setA setB -->获得集合{A,B,C}

3)集合与集合之间的差集

sdiff setA setB-->获得集合{A}

4.3Set集合特殊的操做命令应用场景

如何实现微博的微关系设计?(看视频更香)

www.bilibili.com/video/av921…


5.1 Zset有序集合

经常使用于排行榜,如视频网站须要对用户上传视频作排行榜,或点赞数与集合有联系,不能有重复的成员


5.2Zset 类型使用场景


最后

2020年面试必备的Java后端进阶面试题总结了一份将近500页的pdf文档,欢迎关注个人公众号:以Java架构赢天下,回复【2020】领取这些整理的资料!
喜欢文章记得关注我点个赞哟,感谢支持!

相关文章
相关标签/搜索