简介
本篇主要结合 IO 模型,聊聊redis,同时对redis的 顺序性 说说自己的见解,以及,顺序性所解决的问题,简单描述:多线程的情况下,如何结合 顺序性,保证数据一致性;
带着问题看
redis是单线程还是多线程?
单线程单进程有什么好处?
redis真的只有一个线程一个进程吗?
结合IO模型 聊聊Redis
之前在linux 专栏有简单介绍过IO模型,本节,我打算把学到的理论运用到实际场景中;
正常 redis有很多的 客户端,即有很多的socket连接进来,可能一个客户端准备了一个tomcat,它有一个线程池,他连着多台机子,分布式的,很多台去连得一个 redis的,不管怎么样,最终站在redis所在的机器来说,就是进的socket很多,全部打在了linux 的内核上了,linux 里redis是个进程,进程会调我们epoll ,然后来遍历,寻找这是哪个客户端socket信息发过来了,然后这个时候 redis是单进程,单线程来进行用户的数据的处理,或者说redis就一个线程一个进程吗?不是的,处理用户的对数据的操作,是他里面的一个线程来完成的,但是它可能还有别的线程在做别的事,但是那个事和数据没有关系,所以我们一般就直接说,redis是单进程,单线程来处理我们用户的请求;
单进程单线程有什么好处?
单进程单线程具有"顺序性",在分布式情况下,数据一致性是很重要并且是比较头疼的问题,而redis中的"顺序"性 则可以保证每连接内的命令顺序,即每个连接里面的命令是顺序到达的;
举个实例:
redis 存储一个 主键 “K1” 客户端 1,发送一个K1相关指令,同时 客户端2也发送一个K1 指令,对于内核来说没法确定谁先谁后的问题,但是,如果只有一个客户端,并且里面是线性,而且没有使用多线程,即线程安全,只要客户端能正常走,那后面数据就是能直接保证的,如果客户端里面就是多线程,在线程不是安全的情况下就不知道谁跑前面,谁跑后面的问题;
结尾
若有遗漏,欢迎指正,感谢~