Redis那点儿事儿

一.前言

Redis可以说是当今缓存圈里的扛把子了,几乎互联网中涉及到缓存的应用都会使用Redis,所以面试缓存问题必然会遇到Redis的问题,所以今天就和大家聊一聊Redis那点儿事儿吧!

二.Redis支持的数据类型

这个是最基础的面试问题,Redis总共支持五种数据类型

String:这个是最基础类型,支持最常规的set/get操作,value可以是String也可以是数字,一般用于做些计数功能的缓存hash:这里value存放是结构化的对象,可以很方便的操作其中的字段,比如存放用户登陆的信息,设置缓存过期时间模拟session效果list:可以用于时间简单的消息队列功能,同时可以使用lrange命令实现分页,性能非常好set:一般用于实现去重功能,比如实现交集、并集、差集,比如可以用set实现共同好友功能sorted set:有序集合,其中多了一个score参数用于排序,可以实现排行榜的功能

三.Redis的过器策略

这个问题很重要,如果这个问题答不上来基本上说明你根本没有真正了解Redis,比如说你的数据已经设置过过期时间了,并且时间也到了,但是一看内存占比还是很高,有考虑过原因吗

Redis采用定期删除和惰性删除两种策略

定期删除:指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。 注意,这里可不是每隔100ms就遍历所有的设置过期时间的key,那样就是一场性能上的灾难。实际上redis是每隔100ms随机抽取一些key来检查和删除的,定期删除可能会导致很多key到了时间却没有被删除的情况惰性删除:就是在你操作key时候,redis会检查一下这个key有没有设置过期时间,如果设置了过期时间并且过期了,那么redis此时就会删除这个key,不会给你返回任何数据

四.内存淘汰机制

有如下场景:redis只能存10G的数据,你写20G,那会删除10个G的数据,怎么删的呢?考虑过这个问题吗?再比如上面的过期策略还是有问题的,大量key到期了但是redis的定期删除策略没有删掉,并且最近也没有及时去查询这些key那么会导致大量key堆积在内存中导致内存耗尽,怎么办?答案当然是:内存淘汰机制了!

如果redis的内存占用过多的时候,此时会进行内存淘汰,有如下一些策略:

noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧

allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)

allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般没人用吧

volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(这个一般不太合适)

volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key

volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除

五.Redis的线程模型

Redis 基于 Reactor 模式开发了自己的网络事件处理器-文件事件处理器,文件事件处理器采用I/O多路复用程序同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。

当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时, 与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

文件事件处理器以单线程方式运行, 但通过使用 I/O 多路复用程序来监听多个套接字, 文件事件处理器既实现了高性能的网络通信模型, 又可以很好地与 redis 服务器中其他同样以单线程方式运行的模块进行对接, 这保持了 Redis 内部单线程设计的简单性

六.为什么单线程模型的Redis效率那么高

纯内存操作单线程避免了多线程上下文切换的时间消耗Redis的核心是基于非阻塞的I/O多路复用

Redis相关内容就整理到这里了,上面的内容只是关于Redis的技术的压缩,要想真正运用的好,还是得实践,希望上面的内容对大家有帮助吧,记得关注我【不爱八阿哥】一个热技术的码农,如果觉得有用也可以转发分享给自己的朋友!