一、redis适用场景:
- 记录某个视频的点击量, 评论数或者点击数
- 安装某个纬度对用户的数据进行排序
- 缓存热点内容
- 缓存用户行为历史,进行恶意行为过滤
- 分布式锁
- 消息队列
- 订阅发布,应用解耦 SUBSCRIBE,UNSUBSCRIBE,PUBLISH等5个命令来实现。
- 共享session
- 限速
二、redis不适用的场景:
- 冷数据
- 大规模数据
- 对一致性要求比较高的数据
三、redis时间复杂度:
-
string
string
2.list
list
3.set
set
4.zset
zset
四、redis的注意点:
Redis 是个单线程程序!这点必须铭记。
也许你会怀疑高并发的 Redis 中间件怎么可能是单线程。很抱歉,它就是单线程,你的怀疑暴露了你基础知识的不足。莫要瞧不起单线程,除了 Redis 之外,Node.js 也是单线程,Nginx 也是单线程,但是它们都是服务器高性能的典范。
Redis 单线程为什么还能这么快?
因为它所有的数据都在内存中,所有的运算都是内存级别的运算。正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些时间复杂度为 O(n) 级别的指令,一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。
Redis 单线程如何处理那么多的并发客户端连接?
有个词叫IO多路复用, select, poll , epoll
4.1 非堵塞IO
非阻塞 IO 在套接字对象上提供了一个选项Non_Blocking,当这个选项打开时,读写方法不会阻塞,而是能读多少读多少,能写多少写多少。能读多少取决于内核为套接字分配的读缓冲区内部的数据字节数,能写多少取决于内核为套接字分配的写缓冲区的空闲空间字节数。读方法和写方法都会通过返回值来告知程序实际读写了多少字节。
有了非阻塞 IO 意味着线程在读写 IO 时可以不必再阻塞了,读写可以瞬间完成然后线程可以继续干别的事了。
4.2 事件轮询(多路复用)
Redis基于Reactor模式开发了自己的网络事件处理器:这个处理器被称为文件事件处理器(file event handler): ·文件事件处理器使用I/O多路复用(multiplexing)程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。 ·当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。 虽然文件事件处理器以单线程方式运行,但通过使用I/O多路复用程序来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,又可以很好地与Redis服务器中其他同样以单线程方式运行的模块进行对接,这保持了Redis内部单线程设计的简单性。
假设一个Redis服务器正在运作,那么这个服务器的监听套接字的AE_READABLE事件应该正处于监听状态之下,而该事件所对应的处理器为连接应答处理器。 如果这时有一个Redis客户端向服务器发起连接,那么监听套接字将产生AE_READABLE事件,触发连接应答处理器执行。处理器会对客户端的连接请求进行应答,然后创建客户端套接字,以及客户端状态,并将客户端套接字的AE_READABLE事件与命令请求处理器进行关联,使得客户端可以向主服务器发送命令请求。 之后,假设客户端向主服务器发送一个命令请求,那么客户端套接字将产生AE_READABLE事件,引发命令请求处理器执行,处理器读取客户端的命令内容,然后传给相关程序去执行。 执行命令将产生相应的命令回复,为了将这些命令回复传送回客户端,服务器会将客户端套接字的AE_WRITABLE事件与命令回复处理器进行关联。当客户端尝试读取命令回复的时候,客户端套接字将产生AE_WRITABLE事件,触发命令回复处理器执行,当命令回复处理器将命令回复全部写入到套接字之后,服务器就会解除客户端套接字的AE_WRITABLE事件与命令回复处理器之间的关联。
image.png五、Redis key过期策略
5.1 Redis过期时间
Redis所有的数据结构都可以设置过期时间,当到期后,key会被自动删除。Redis会将每个设置了过期时间的key放入一个独立的字典中,会定期遍历这个字典来删除到期的key。除了定期遍历外,还会使用惰性策略来删除过期的key,即在客户端访问这个key的时候,Redis会对key的过期时间进行检查,如过期了就立即删除。
5.2 从节点过期策略
从节点不会进行过期扫描,而是被动淘汰。主节点在key到期时,会在AOF文件里增加一条del指令,同步到所有的从节点,从节点通过执行这条del指令来删除过期的key。
5.3 Redis过期策略
当Redis实例的内存超过设置的maxmemory时,会根据配置的策略(maxmemory-policy)来对key进行淘汰,可选的淘汰策略有如下几种:
noeviction:当内存使用达到阈值的时候,会堵塞所有申请内存的命令,可读,可执行del命令。
volatile-lru:当内存使用达到阈值的时候,会优先淘汰设置了过期时间且最近最少使用的key,未设置过期时间的key不会被淘汰。
volatile-ttl:当内存使用达到阈值的时候,会优先淘汰设置了过期时间且剩余过期时间ttl越小的key。
volatile-random:当内存使用达到阈值的时候,会随机淘汰设置了过期时间key。
allkeys-lru:当内存使用达到阈值的时候,针对所有的key按照最近最少使用原则进行淘汰。
allkeys-random:当内存使用达到阈值的时候,针对所有的key随机进行淘汰。
线上的所有Reids实例默认的淘汰策略为volatile-lru。
网友评论