<返回更多

面试宝典之Redis!

2019-06-06    
加入收藏

面试疑问

写在前面,看过本文,让那些没使用过redis的也能回答上来面试官的问题,不至于陷入太尴尬的境地!因为现在好多面试官不单单只是问你,用没用过redis,而是会一直问下去,比如:你项目里面用redis做什么?里面放什么数据?什么类型?对于list类型的数据,我更改了一个如何高效率的刷新redis缓存?

面试宝典之Redis!看这一篇就够了!仅此一篇!

 

带着这些疑问我们下面去讨论。希望各位大佬勇于补充。

Redis简介:

面试宝典之Redis!看这一篇就够了!仅此一篇!

 

如大家所知道的一样,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库(区别于MySQL等关系型数据库),并提供多种语言的API调用方案。

Redis存储数据结构:

一共支持五种数据类:

string(字符串)

hash(哈希)

list(列表)

set(集合)

zset(sorted set有序集合)。

Redis内存占用情况:

测试情况:90万个键值对(键是0到899999值是字符串“hello world”)在32位操作系统的笔记本上 用了90MB,但是使用64位的操作系统的话,相对来说占用的内存会多一点,这是因为64位的系统里指针占用了8个字节,但是64位系统也能支持更大的内存,所以运行大型的redis服务还是建议使用64位服务器。

坚持一个原则:使用数据库能解决的业务场景,就不要使用REDIS。

Redis使用场景:

面试宝典之Redis!看这一篇就够了!仅此一篇!

 

下面具体说下每个数据类型的使用场景,也好应付面试官的随机发问。

  1. 数据结构:ZSET
  2. 关键API:zadd、zincrBy、zrevrank、zscore、zrevrangeWithScores
  3. 场景:金主榜、活动昨日榜、今日榜、本周榜、上周榜
  1. 数据结构:STRING
  2. 关键API:incr、decr、set、get
  3. 场景:点赞数、验证码(过期时间)、token
  4. 用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。
  5. 数亿用户,要几个毫秒内查询到某个用户是否在线?
  6. 原理是:redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,下标index用来表示用户id(必须是数字),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统,上面我说的几个场景也就能够实现。
  1. 数据结构:HASH
  2. 关键API:hget、hset、hgetall
  3. 存储部分变更数据如用户信息等
  1. 数据结构:SET
  2. 关键API:sadd、spop、smembers、sunion、sinter
  3. 场景:关注列表、粉丝列表
  4. 可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作。
  5. Set是集合,是String类型的无序集合,set是通过hashtable实现的,概念和数学中个的集合基本类似,可以交集,并集,差集等等,set中的元素是没有顺序的。

名词解释:

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了。

业界比价普遍的一种做法,即根据key获取value值为空时,锁上,从数据库中load数据后再释放锁。若其它线程获取锁失败,则等待一段时间后重试。这里要注意,分布式环境中要使用分布式锁,单机的话。用普通的锁(synchronized、Lock)就够了。

缓存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。

面试宝典之Redis!看这一篇就够了!仅此一篇!
 
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>