redis是单线程还是多线程(redis多线程还是pipeline)
- 开发语言
- 2023-09-01
- 71
在什么情况下单线程比多线程效率高这个问题需要根据几个方面综合考虑,比如服务器配置,应用主要做什么操作。分析如下:第一,你的服务器主机是不是单核的,如果是的话,那么一般来...
在什么情况下单线程比多线程效率高
这个问题需要根据几个方面综合考虑,比如服务器配置,应用主要做什么操作。分析如下:
第一,你的服务器主机是不是单核的,如果是的话,那么一般来说单线程要比多线程要快,前提条件是你的io操作不特别耗时,如果耗时的话,那么就不一定了,因为这段时间CPU是空闲的。
第二,是计算密集还是io密集,如果是计算密集的话,单线程要比多线程快,就比如Redis就是单线程的,基本都是操作内存。但是如果任务可拆分,且主机支持多核,那仍然建议多线程
第三,服务器是多核的话,那么就要充分利用多线程的优势了,正常情况,单线程是比不上的。
希望我的回答对你有所帮助。
redis为什么是单线程
1.
redis是基于内存的,内存的读写速度非常快;
2.
redis是单线程的,省去了很多上下文切换线程的时间;
3.
redis使用多路复用技术,可以处理并发的连接。非阻塞IO内部实现采用epoll,采用了epoll+自己实现的简单的事件框架
Redis为何设计为单线程
redis的一个特点是读写速度快,这就很容易让人误以为redis是多线程的。因为大家想当然的会认为多线程的效率要比单线程高,其实不然。
BAT的一个对redis有很深了解的高级工程师曾经说过,redis就是如果所有数据都在内存里,那么单线程是效率最高的。为什么这么说呢,多线程的本质是CPU模拟出多个线程去操作,但是模拟是有代价的,学过操作系统的朋友应该知道,多线程之间切换是要切换上下文的,这也是对时间的一种消耗。所以,对于单处理器来说,当然是单线程,无切换才是最高效率的。redis就是用一块CPU绑定了一块内存,然后对数据的操作都是在这块内存上进行的,基于此,单线程的redis已经达到了效率最大化。
我们用实际数据来说明。
一次CPU内存的切换大约需要1500ns,从内存中读取1MB的数据,大概需要250us,就算我一次只读1MB的数据,读1000次之后,消耗在内存切换上这种非功能性过程上的消耗就达到了1500us,这个时间开销任谁看都是不值。
此外,基于redis的单线程,我们还可以利用它提供的setkeyfieldvalue加nx参数的方式,来实现分布式锁。众所周知,redis并不适合做数据持久层,更多的是取代memcache做缓存,做分布式架构的支撑。分布式架构势必就要面临如何实现分布式锁的问题,通过上面的接口,无论多少个分布式节点,都可以准确的获取分布式锁。
具体使用方式如下:通常来说,set函数是不管field字段是否存在,只要写入成功就会返回1,但是如果增加了NX参数,那么如果field值在redis中已经存在,就会返回空,否则才返回1。因此用这个函数来执行获取分布式锁操作,如果返回值不为空,则加锁成功,否则代表有其他线程在操作数据,当前请求需要等待。
此外,还有PX,XX参数,具体含义见如下文档。
以上是我的浅见,欢迎各位在下方与我交流沟通。
我是苏苏思量,来自BAT的Java开发工程师,每天分享科技类见闻,欢迎各位关注我,与我共同进步。
redis正常一笔访问多久
1Redis正常一笔访问的时间非常短暂,通常在数毫秒级别。2这是因为Redis是内存数据库,数据都存储在内存中,数据读写速度非常快。3此外,Redis还采用了单线程模型,避免了多线程的竞争和锁等问题,进一步提升了访问速度。因此,Redis正常一笔访问的时间非常短暂,非常适合高并发的业务场景。
单线程Redis性能为何如此之高
Redis的优势
性能高不仅跟线程模型有关,它有很多原因,主要有如下3点:
基于内存;单线程,但IO多路复用的利用率高;数据结构为高性能优化。下面分别阐述。Redis的优势:基于内存性能高低都是相对的,Redis是基于内存的数据库,相对的我们拿传统的基于磁盘的数据库进行对比,如图:
其中,Redis数据库基于内存,分场景如下:
数据查询类场景:内存中有全量的数据,可以直接从内存中取得;数据写入类场景:如果配置的是同步持久化,写入内存的同时,也会写入磁盘,性能有所降低,但是由于Redis使用的是IO多路复用,同时没有线程竞争,因此IO利用率很高。数据写入类场景:如果配置的是异步持久化,写入内存成功,即响应成功,不用等待磁盘的写入,性能很高。传统磁盘数据库,分场景如下:
数据查询类场景:从磁盘中索引数据,查询并返回响应;数据写入类场景:从将数据写入磁盘,同时更新磁盘中的索引文件。以上可以看出:Redis是基于内存的数据库,大多数操作在内存中完成,内存的IO效率比磁盘要高的多。因此,这是Redis性能高的一个原因。
Redis的优势:单线程,IO多路复用的IO利用率高Redis是单线程的,通常如果单线程处理效率不高,都开多线程处理,但是Redis这里为什么反到效率高了呢?
多线程存在线程竞争,且有锁的问题,多线程代码逻辑复杂,复杂的逻辑通常带来一定的性能损耗;Redis虽然是单线程,但是它的“I/O多路复用(multiplexing)”模型的IO利用率很高。Redis的“I/O多路复用”是采用的效率最高的epoll模式,单线程却实现了多客户端接入,以及高IO利用率。如下图:
Redis的优势:数据结构为高性能优化数据结构的优化主要有以下两点(篇幅有限,在这里就不展开了):
Redis全程采用了Hash结构,因此存取效率非常高;对于数据的存储内容也进行了压缩,节省了空间占用,也减少了io带宽。还有哪些原因导致了Redis的高性能,大家都是用的什么样的持久化策略,集群部署策略,都遇到哪些坑,Redis有哪些不足,欢迎在评论区留言讨论。我是闲谈架构,聚焦JAVA架构,持续输出,欢迎关注。jedis和redis区别
二者区别如下:
1、引用的依赖不同
2、管理jedis实例方式、操作redis服务的不同
通过org.springframework.data.redis.connection.jedis.JedisConnectionFactory来管理,即通过工厂类管理,然后通过配置的模版bean,操作redis服务,代码段中充斥大量与业务无关的模版片段代码,代码冗余,不易维护
本文链接:http://www.xinin56.com/kaifa/13410.html