Redis是什么?
Redis 是一个使用C语言编写的,高性能的非关系型数据。他的数据是存在内存中的,所以速度非常快,经常用于存热点数据。
Redis为什么这么快?
在高版本中,他使用IO多路复用来监听多个连接,提高并发能力。
使用单线程对数据库进行操作,减少上下文切换。
基于内存,离CPU更近,操作更快。
Redis 是不是单线程?
redis6.0之前数据处理和网络IO是单线程,AOF和主从同步以外是其他线程。
在redis6.0版本支持的IO多线程特性,默认情况下IO多线程只针对发送响应数据,不会以多线程处理读请求。可以通过参数 io-threads-do-reads
Redis持久化机制?
有两种方式,AOF增量备份和RDB全局备份;
AOF增量备份是对命令行进行保存,不同的facy 策略可以保证数据丢失的风险降到最低。但是他的数据恢复效率是更低一些的。
RDB全局备份,他在备份的时候主线程是不能进行IO操作,恢复数据效率较高。缺点是可能会造成数据丢失。
-> AOF 他有两个缓冲区,对应三个策略,一个是执行完后刷新到 AOF缓冲区返回,第二个是刷新到内核缓冲区,第三个是刷新到磁盘返回。
过期删除机制
有三种:
定时删除:创建一个定时器,到时间了就去删除,比较消耗cpu资源,对内存友好
惰性删除:每次需要用到的时候,去判断这个数据是否过期,过期就删除,对内存不友好,cpu友好
定期删除:每隔一段时间就对一些键值进行检查,删除其中过期的键。
redis采用的是惰性+定期
内存淘汰策略
先认识LRU 和LFU
LRU(Least Recently Used) :最近最少使用 - 会淘汰最长时间未被使用的key
LFU(Least Frequently Used) : 最少次数(频率)使用 - 会淘汰最少使用次数的key
在redis 中有8钟淘汰策略
在会过期的数据中淘汰: volatile-LRU volatile-LFU volatile-Random
在所有的数据中淘汰: allkeys-LRU allkeys-LFU allkeys-Random
还有两种特殊的
no-evicition :没有被驱逐 ,不淘汰任何数据,满了之后报错。
ttl : time to live ,存活时间,淘汰存活时间最短的键,就是淘汰最先过期的值。
Redis事务机制
一文讲透 Redis 事务 (事务模式 VS Lua 脚本) - 掘金
redis提供一个打包多个命令的方式可以实现事务,但是有个问题就是,不能真正实现原子性,因为有一个命令出错后,在它之前的命令还是被执行了,不能回滚。
一般我们使用lua脚本去实现事务,因为他可以减少网络IO,速度更快,整个脚本会被当做一个命令执行。
讲讲Redis的线程模型?
https://www.cnblogs.com/mrmirror/p/13587311.html
Redis基于Reactor开发了网络事件处理器,这个处理器被成为文本事件处理器。它的结构分为4部分:多个套接字,IO多路复用程序,文本事件分派器,事件处理器。因为文本事件分派器队列的消费是单线车的,所以Redis才叫单线程模型。
IO多路复用程序监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
集群策略
主从模式:这种模式,主数据库进行读写,从数据库进行读操作。
哨兵模式:自动选育master 主节点,解决了主从过于依赖主节点的缺点。但是不能解决容量上限的问题。
集群模式:选用分片概念,存取数据,解决了容量上线的问题,能够多主多从。
集群模式扩容原理:原来的节点算好要拿出多少的槽位给新加的节点,新加的节点准备导入的槽位,准备的前提条件就是加入集群,一切准备就绪后,主节点将划分出来的槽位分配给新节点,然后将相关槽位的数据迁移到新的节点
集群模式设计的算法: