Redis线程模型
问:redis是单线程还是多线程?
答:不同的版本有区别,6.x版本之前是真正意义上的单线程:处理客户端连接和执行操作的命令都是由一个线程执行的。
6.x之后的版本引入了多线程,处理客户端请求由专门的线程处理,执行命令还是单线程
问:为什么单线程模式速度非常快?
答:1.数据存储在内存中,读取速度快,CPU不是性能瓶颈
2.结构简单,key-value底层是哈希结构,查询操作速度是O(1)
3.采用IO多路复用,非阻塞IO模型,提高链接访问率
4.单线程执行命令,不存在线程切换,节省开销,而且线程安全
Redis序列化
IO对象序列化,对象反序列化,对象信息持续保存在硬盘上
mybatis是一个Javad的数据持久层框架
Redis数据是存储在内存中的,内存数据是临时保存
Redis直持数据持久化到硬盘
问:Redis是如何将数据持久化到硬盘的?
答:RDB(Redis DataBase)和AOF(Append Only File)。RDB和AOF这两种方式都可以在redis.conf文件中可以配置
Redis默认使用RDB方式:直接将内存的快照(k-v)存储起来
问:如何配置触发持久化的机制?
答:1.save m n|save 多少秒内 多少键
2.flushall命令,触发rdb规则
3.退出
RDB
RDB持久化是在指定的时间间隔内将数据集快照写入磁盘。也是默认的持久化方式,这种方式就是把内存中数据以快照的方式写入二进制文件中,默认文件为dump.rdb
AOF
以日志的方式将命令存储到文件中 set name jim
还原时将命令逐个还原为数据
默认是不开启的
appendonly on
同步机制:
appendfsync always 每次set记录一次
appendfsync everysec 每秒记录一次
Redis事务
Redis在执行单条命令时,是原子性(单线程的一次只能有一条线程执行命令)
问:有时候,一次操作需要执行多条命令,如何保证多条命令整体执行
答:可以通过Redis事务实现:
开启事务:multi
添加命令。。。命令添加进来不会立刻执行,添加到一个队列
执行exc命令时,才会将队列中多条命令依次执行,执行一个事务中多条命令时,其他客户端会被隔离,不会交替执行
但是事务不保证多条命令执行的原子性(加入执行了3条命令,其中有一条语法出错,那么会将其他两条正确的语法继续执行)
主从复制
主从——主机和从机——集群架构
问:为什么用集群?
答:如果有一台Redis服务,万一宕机,所有的请求都传到MYSQL导致MySQL宕机
可以搭建多台redis服务器,如果其中有一台故障,那么其他服务也可以继续
主机负责写数据,将数据同步到从机,一般的读数据从从机查询
实现读写分离,写命令由主机执行,读命令从从机执行
哨兵机制
有一个单独线程,对集群中的多态服务进行监听,给每个服务发请求,如果没有响应,说明出现故障
比如主机宕机,会在从机中选出一个充当主机,当原主机恢复后,又可以当作主机使用
key的过期策略
当key设置过期时间,那么时间到了后redis将如何处理过期的key
1.立刻删除:到期立刻执行回调函数,立刻释放内存,对redis性能有影响
2.惰性删除:到期后不会立即删除,而是到下次调用该键时,根据状态(设置是会记录的)来决定是否删除还是继续使用,占用内存
3.定期删除:每隔一段时间对所有到期的键统一进行删除(类似于java的垃圾回收机制)