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之前还打算想加上个多线程