Redis 基础和使用场景
Redis是使用内存存储的,没有磁盘IO开销,读写速度快
单线程实现(Redis6.0以前),避免了多线程之间线程的切换和锁竞争的开销
IO多路复用,使用单线程来轮询描述符,将数据库的操作都转成了事件,不在网络I/O上浪费过多的事件
高效的数据结构:redis对每种数据类型底层都做了优化,使的速度更快
Redis为什么使用单线程:
单线程可以避免过多的上下文切换开销。程序始终运行在单个线程内,没有多线程切换的场景。
避免同步机制的开销。如果redis选择多线程,需要考虑数据同步问题,则必然会引入某些同步机制,会导致在操作数据过程中带来更多的开销,增加程序复杂度的同时降低性能
实现简单,维护方便。如果使用多线程,需要考虑线程安全问题,使其变得复杂
Redis应用场景有哪些:
缓存热点数据,缓急数据库压力
利用redis原子性的自增操作,可以实现计数器的功能,比如统计用户点赞数,用户访问数等
作为简单的消息队列,实现异步操作
限度器,可用于限制某个用户访问某个接口的频率,比如秒杀场景,用于防止用户快速点击带来的不必要的压力
好友关系,利用集合的一些命令,比如交集、并集、差集等,实现共同好友、共同爱好之类的功能
Redis是如何实现消息队列的:
使用List,生产者lpush,消费者rpop
发布订阅模式。类似MQ的主题模式。
redis自带的stream消息队列
Redis主从复制的原理:
主数据库可以进行读写操作,当数据变化时会自动同步到从数据库
从数据库只可读,会接收主数据库数据进行同步
主从复制的原理:
当启动一个从节点时,会发送一个PSYNC 命令给主节点
如果从节点第一次连接到主节点,会触发一次全量复制。此时主节点会启动一个后台线程,生成一份RDB快照文件
同时还会将从客户端client新收到的所有写命令缓存在内存中。RDB文件生成后,主节点会将RDB文件发送给从节点,从节点会将RDB文件写入到本地磁盘,然后再从本地磁盘加载到内存中
接着主节点会将内存中缓存的写命令发送到从节点,开始同步数据
如果从节点跟主节点之间网络出现故障,连接断开了,会自动重连,连接之后主节点仅会将部分缺失的数据同步给从节点
Redis 过期key的删除策略:
主动删除。定期清除key,每次清理会遍历所有的DB,从db随机取出20个key,如果过期就删除,否则就继续清理下一个DB
内存不足时清理。Redis有最大内存的限制,通过maxmemory参数可以设置最大内存,当使用的内存超过了设置的最大内存,就要进行内存释放,在进行内存释放的时候,会按照配置的淘汰策略清理内存












浙公网安备 33010602011771号