redis单线程不就是 发一个命令
接收了到客户端的请求
然后
计算请求(就是解析如果参数不正确就会返回错误那对的就会进行下一步),
然后
读写操作,再然后就是发送给客户端,
然后就等待
下一个命令
这个流程是由一个线程来完成的 就是主线程。
在redis启动的时就会启动
后台线程
(
后台线程
就是 当所有
前台线程
(
主线程
)都退了那么
后台线程
也会退 它是不会干扰程序的退出的,一般是用来执行一些日志(将运行日志放到文件中),定时任务(定时回收垃圾呀等等) 这些都是不会阻止前台线程)
或者说
redis 后台线程用来处理后天运行任务的 比如一些持久化的操作还有删除过期的key呀 复制(主从复制)等等操作
先说说redis 2.6版本:
redis2.6版本它是会启动两个
后台线程的
第一个是
AOF刷盘
,第二个是
处理关闭文件
AOF刷盘 : AOF
的意思就是持久化 或者 将所有写操作都存入到
AOF
文件中 可以理解为当redis重启时就会通过
AOF
来恢复数据,这有个问题要保证数据的可靠性,就会将
AOF
文件中的数据
刷盘到硬盘上
AOF刷盘有两种操作:
第一种存在一个问题 就是要等待I/O操作完成之后才能执行其他的操作
第一种:文件同步
讲AOF文件中的数据刷到硬盘上,这可以确保数据的可靠性
第二种:文件异步
将
AOF
文件中的数据异步的写入硬盘上 这种方式虽然对性能的影响很小,但是可能会导致数据的丢失 为什么呢 ? 如果
redis
突然挂了或者停电了 然后数据没来得及写入硬盘中就会导致数据丢失,就可以采用
aof-use-rdb-preamble
在 Redis中,
aof-use-rdb-preamble
默认就是
yes
这就意味着在
AOF
重写时 是否使用RDB文件作为重写的起点(意思就是如果redis重启时就会先加载RDB文件中的数据)然后再通过AOF文件来恢复数据,这种方式可以加快redis 的启动速度 ,并且减少AOF 文件的大小 ,
不过需要注意的是 如果在RDB 文件和AOF 问就直接出现故障,可能会出现数据的丢失 是需要根据实际情况来做决定的
处理关闭文件:
比如 要 操作持久化操作时 然后redis就会将数据写入到AOF文件 中 这个时候就需要打开AOF文件操作 进行写操作 操作完成之后关闭文件 以及释放资源
关闭文件就使用C语言提供的fclose函数来关闭文件 因为redis是C语言写的嘛
Redis 真的是单线程吗?
redis 4.0 版本的时候确实支持多线程但那个时候并没有发布到官网
redis6.0之前是支持多线程的
Redis 是支持多线程的
在redis6.0之后就完全支持多线程的 redis6.0之前还打算想加上个多线程