redis的数据类型,以及每种数据类型的使用场景
(一)String
这个其实没啥好说的,常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。
(二)hash
这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。博主在做单点登录的时候,就是用这种数据结构存储用户信息, 以cookieId作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。
(三)list
使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户 体验好。本人还用一个场景,很合适—取行情信息。就也是个生产者和消费者的场景。LIST可以很好的完成排队,先进先出的原则。
(四)set
因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能。为什么不用JVM自带的Set进行去重?因为我们的系统一般都是集群部 署,使用JVM自带的Set,比较麻烦,难道为了一个做一个全局去重,再起一个公共服务,太麻烦了。 另外,就是利用交集、并集、差集等操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能。
(五)sorted set
sorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用,取TOP N操作
内部使用了两种数据结构来实现其功能:跳表(Skip List)、哈希表
跳表本身是有序的
命令不区分大小写:set,SET.
key区分大小写
缓存淘汰策略
惰性释放 lazyfree 了解过吗?
惰性释放没有开启之前,我们主线程删除一个 key 的时候其他指令只能进行串行排队等待,如果系统中有很多 bigkey 需要删除,那么就会让阻塞时间变长,造成系统的吞吐量和 IO 处理下降;开启惰性释放后,在主线程进行删除 key 的时候,会将 key 标记为已删除,然后直接返回,释放操作由后台线程进行,实现了非阻塞异步化的删除降低阻塞等待时间;
Redis 的过期策略是怎么样的?
Redis 采用的是定时删除和惰性删除相结合的方式实现的过期策略;Redis 会没 100 ms 随机抽取部分 key 看他们是否过期;过期的话就标记为已删除然后通过惰性删除的方式释放 key
Redis 的内存淘汰策略是怎么样的?
内存淘汰策略是指当内存满了的情况下应该释放哪些 key 的策略;可以根据淘汰方式不同分为一下几类:
- 不淘汰,如果内存满了就报错
- 根据 TTL 进行淘汰;会选择过期时间最近的一个 key 进行淘汰;
- LRU:会淘汰最久没有访问的 key;
- LFU:会淘汰访问频率最低的 key;
- 随机淘汰; 他们还可以组合,比如在过期时间最近的 key 中淘汰最久未访问的 key; LRU 的缺点是可能会淘汰某些热 key,LFU 的缺点是可能某些曾经的热 key 会始终保留;