【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

剖析 Redis 的单线程模型:了解它的优点和局限性 (剖析人性的经典著作)

用户投稿2024-04-19热门资讯12

简介

Redis 是一个流行的开源键值存储数据库,以其高性能和可扩展性而闻名。Redis 的一个关键特性是它的单线程模型,其中所有操作都由一个主线程处理。本文将深入探究 Redis 单线程模型的工作原理,探讨其优点和局限性。

单线程模型的优点

Redis 的单线程模型提供了以下优点:
  • 简单性: 单线程模型易于理解和实现,从而减少了复杂性和潜在的错误。
  • 一致性: 由于所有操作都由同一个线程处理,因此可以保证数据的完整性和一致性。
  • 低延迟

Redis和Memcached的区别

Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较:

1、Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。

2、内存使用效率对比:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。

3、性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。

具体为什么会出现上面的结论,以下为收集到的资料:

1、数据类型支持不同

与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多。最为常用的数据类型主要由五种:String、Hash、List、Set和Sorted Set。Redis内部使用一个redisObject对象来表示所有的key和value。redisObject最主要的信息如图所示:

type代表一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式,比如:type=string代表value存储的是一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际redis内部是按数值型类存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比如:”123″ “456”这样的字符串。只有打开了Redis的虚拟内存功能,vm字段字段才会真正的分配内存,该功能默认是关闭状态的。

多线程(.net)

通过设置信号来让线程停下来或让线程重新启动

AutoResetEvent 一次只唤醒一个线程,而 ManualResetEvent 可以唤醒多个线程。 () 每次只允许一个线程进入,当某个线程得到信号后, AutoResetEvent 会自动将信号设置为不发送状态, 其他调用 WaitOne 的线程只有继续等待. 当某个线程调用了() 方法后,除非手工调用 ()方法,否则 ManualResetEvent 将一直保持有信号状态,其他调用 WaitOne 的线程获得信号得以继续执行。

为多个线程共享的变量提供原子操作。 如果一条语句在底层处理器上被当作一个独立不可分割的指令,那么它本质上是原子的(atomic)。严格的原子性可以阻止任何抢占的可能。对于 32 位(或更低)的字段的简单读写总是原子的。而操作 64 位字段仅在 64 位运行时环境下是原子的,并且结合了多个读写操作的语句必然不是原子的:

应使用常量进行exchange后的对比逻辑,因为使用变量,读变量未必原子性( 使用 进行逻辑判断 Debug 与 Release 模式不一致的经验教训 )

When should the volatile keyword be used in C#? Sayonara volatile c# - Volatile keyword usage vs lockUnderstand the Impact of Low-Lock Techniques in Multithreaded Apps

双重检查锁定(延迟初始化):

剖析 Redis 的单线程模型:了解它的优点和局限性 (剖析人性的经典著作) 第1张

使用布尔值指示初始化

[参考]C# 理解 AutoResetEvent 和 ManualResetEvent ManualResetEvent volatileC# Interlocked 笔记 Interlocked 类 ReaderWriterLockSlimThreadPool 类 C# 线程安全集合 为什么 Redis 选择单线程模型 [ 注:Redis知识领域中剖析精华 ]

redis是单线程还是多线程

Redis采用的是单进程单线程模型的KV数据库,由C语言编写。

官方提供的数据是可以达到+的qps。这个数据不比采用单进程多线程的同样基于内存的KV数据库Memcached差。Redis并没有直接使用Libevent,而是自己完成了一个非常轻量级的对select、epoll、evport、kqueue这些通用的接口的实现。在不同的系统调用选用适合的接口,linux下默认是epoll。

因为Libevent比较重更通用代码量也就很庞大,拥有很多Redis用不上的功能,Redis为了追求“轻巧”并且去除依赖,就选择自己去封装了一套。

Redis单线程的优点

1、高效执行:Redis的单线程模型意味着所有的操作都在同一个线程中执行,这使得操作指令的执行速度非常快。因为线程切换和调度等开销在单线程中不存在,所以Redis在处理大量请求时,能够保持高效的执行速度。

2、简化编程模型:对于开发者来说,单线程模型使得编程和调试更为简单。由于只有一个主线程,不存在线程同步和数据一致性问题,这让开发者无需花费太多精力去处理并发问题,而可以专注于业务逻辑的实现。

3、高吞吐量:由于Redis的单线程设计,它能够高效地处理大量的请求。在处理大量读/写操作时,Redis的性能非常出色。特别是在高并发场景下,Redis可以有效地保证操作的实时性。

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

剖析 Redis 的单线程模型:了解它的优点和局限性 (剖析人性的经典著作) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
欢迎你第一次访问网站!