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

带着这些疑问我们下面去讨论。希望各位大佬勇于补充。
Redis简介:
如大家所知道的一样,Redis是一个开源的使用ANSI 编写、支持网络、可基于亦可持久化的日志型、Key-Value数据库(区别于等关系型数据库),并提供多种语言的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使用场景:
- 排行榜
- 序列号
- 计数器
- 流水号
- 验证码
- 用户信息
- token
- 菜单
- 最新列表
- 关注列表
- 分布式锁与单线程机制
下面具体说下每个数据类型的使用场景,也好应付面试官的随机发问。
- Zset使用场景
- 数据结构:ZSET
- 关键API:zadd、zincrBy、zrevrank、zscore、zrevrangeWithScores
- 场景:金主榜、活动昨日榜、今日榜、本周榜、上周榜
- String使用场景
- 数据结构:STRING
- 关键API:incr、decr、set、get
- 场景:点赞数、验证码(过期时间)、token
- 用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。
- 数亿用户,要几个毫秒内查询到某个用户是否在线?
- 原理是:redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,下标index用来表示用户id(必须是数字),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统,上面我说的几个场景也就能够实现。
- Hash使用场景
- 数据结构:HASH
- 关键API:hget、hset、hgetall
- 存储部分变更数据如用户信息等
- SET使用场景
- 数据结构:SET
- 关键API:sadd、spop、smembers、sunion、sinter
- 场景:关注列表、粉丝列表
- 可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作。
- Set是集合,是String类型的无序集合,set是通过hashtable实现的,概念和数学中个的集合基本类似,可以交集,并集,差集等等,set中的元素是没有顺序的。
名词解释:
- 缓存穿透
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了。
业界比价普遍的一种做法,即根据key获取value值为空时,锁上,从数据库中load数据后再释放锁。若其它线程获取锁失败,则等待一段时间后重试。这里要注意,分布式环境中要使用分布式锁,单机的话。用普通的锁(synchronized、Lock)就够了。
- 缓存雪崩
缓存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。
胜象大百科








