数据库同步工具
sqlserver,Mysql数据同步软件

Redis与其他数据库区别,Redis为什么速度快

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

目录

为什么Redis有效?

多个I/O复用模型

那么为什么redis是单线程

注意点

Redis和Memcached数据库之间的区别

Redis与其他数据库之间的差异


Redis使用基于内存的模型,该模型使用单进程单线程模型? KV数据库,用C语言编写的 ,官方提供的数据是一个QPS(每秒查询量),可以达到100000+。此数据并不比Memcached差,后者是一个KV数据库,它还使用单个进程和多个线程,并且基于内存!

1.它完全基于内存。绝大多数请求纯粹是内存操作,这非常快。数据存储在内存中,类似于HashMap,HashMap的优点是搜索和操作的时间复杂度为O(1);

2.数据结构简单,数据操作也简单。 Redis中的数据结构是经过特殊设计的;

3.使用单线程避免不必要的上下文切换和争用条件,没有由CPU消耗引起的多进程或多线程切换,无需考虑各种锁的问题,没有锁释放锁的操作,不会因死锁而降低性能;

4.使用多个I/O复用模型,无阻塞IO;

5.基础模型不同。与客户端通信的基础实现和应用协议不同。 Redis本身直接构建VM机制。由于一般系统调用系统功能,因此会浪费一定数量。是时候提出要求了;

6.C语言实现。一般来说,用C语言实现的程序更接近于操作系统,并且执行速度会相对更快。

多个I/O复用模型使用选择,轮询和epoll的能力来同时监视多个流的I/O事件。 空闲时,当前线程将被阻止。当有多个流中有I/O事件时,它会从阻塞状态中唤醒,因此程序将轮询所有流(epoll仅轮询那些实际发出事件的流),并且仅顺序处理就绪。这种方法避免了很多无用的操作。

这里的”多通道”是指多个网络连接,”多路复用”是指多路复用同一线程。 可以使用多个I/O多路复用技术来允许单个线程有效地处理多个连接请求(尽可能减少网络IO的时间消耗),并且Redis可以非常快地操作内存中的数据,换句话说,内存中的操作不会成为影响Redis性能的瓶颈。由于上述几点,Redis的吞吐量很高。

首先,我们必须了解,以上所有分析都是为了营造Redis氛围!官方常见问题解答指出因为Redis是基于内存的操作,所以CPU并不是Redis的瓶颈。 Redis的瓶颈很可能是机器内存或网络带宽的大小。由于单线程易于实现,并且CPU不会成为瓶颈,因此采用单线程解决方案是合乎逻辑的(毕竟,使用多线程会带来很多麻烦!)。

我们可以清楚地解释为什么Redis这么快,并且因为在单线程模式下它已经非常快,所以不需要使用多线程!

但是,我们不能使用单线程方法来实现多核CPU性能,但是可以通过在单台计算机上打开多个Redis实例来改善它!

警告1 :这里我们一直在强调单个线程,但是仅使用一个线程来处理我们的网络请求。当正式的Redis Server运行时,它必须是多个线程,这里需要每个人的明确关注!例如,持久化Redis时,它将以子进程的形式执行或子线程(具体来说,子线程或子进程供读者进行深入研究)

警告2 :Redis 4.0版将支持多线程,但仅适用于某些操作上的多线程操作!因此,本文在将来的版本中是否仍然是单线程的,需要读者进行验证!

1,我们知道Redis使用”单线程多路IO模型”来实现高性能的内存数据服务。这种机制避免了使用锁,但是与此同时,这种机制也像晒太阳一样。耗时的命令将减少Redis的并发性。因为它是一个单线程,所以同一时间仅在进行一个操作。因此,耗时的命令将导致并发性降低,不仅读取并发性降低,而且写入并发性降低。而且一个线程只能使用一个CPU内核,因此可以在同一台多核服务器中,可以启动多个实例以形成主-主或主从形式,耗时的读取命令可以完全在奴隶继续。

2,”我们不能让操作系统达到负载平衡,因为我们更了解自己的程序,因此我们可以在不消耗过多CPU的情况下为它们手动分配CPU核心,或者使我们成为关键的Process以及其他许多核心流程挤在一起。 “。
CPU是一个重要因素,因为它是单线程模型,所以Redis更喜欢大型缓存和快速CPU,而不是多核

在多核CPU服务器上,Redis的性能还取决于NUMA配置和处理器绑定位置。最明显的影响是redis-benchmark将随机使用CPU内核。为了获得准确的结果,您需要使用固定的处理器工具(可以在Linux上使用任务集)。最有效的方法是将客户端和服务器分为两个不同的CPU,以使用大学中的第三级缓存。

Redis和Memcache都是基于内存的数据存储系统。 Memcached是一种高性能的分布式内存缓存服务; Redis是一个开源键值存储系统。与Memcached相似,Redis将大多数数据存储在内存中,并且受支持的数据类型包括:字符串,哈希表,链接列表以及其他与数据类型相关的操作。

1.Redis支持服务器端数据操作:与Memcached相比,Redis具有更多的数据结构并支持更丰富的数据操作

与仅支持简单键值数据记录的Memcached不同,Redis支持多种多样的数据类型。最常用的数据类型主要由五种类型组成:字符串,哈希,列表,集合和排序集合。

通常在Memcached中,您需要将数据发送到客户端以进行类似的更改,然后再将其重新设置。这大大增加了网络IO的数量和数据量。在Redis中,这些复杂的操作通常与常规GET/SET一样高效。因此,如果您需要缓存以支持更复杂的结构和操作,则Redis将是一个不错的选择。

2.内存使用效率的比较:如果使用简单键值存储,则Memcached的内存使用率会更高。如果Redis将哈希结构用于键值存储,则由于其组合压缩,其内存利用率将高于Memcached。

在Redis中,并非所有数据都总是存储在内存中。与Memcached相比,这是最大的不同。当物理内存用完时,Redis可以将一些很长时间未使用的值交换到磁盘上。 Redis将仅缓存所有关键信息。如果Redis发现内存使用量超过某个阈值,它将触发交换操作

Redis根据”可交换性=年龄*日志(size_in_memory)”计算需要将哪个密钥对应值交换到磁盘。然后将与这些键相对应的值持久保存到磁盘并同时在内存中清除。此功能使Redis可以维护超出其计算机自身内存大小的数据。当然,机器本身的内存必须能够容纳所有密钥,毕竟这些数据将不会被交换。同时,当Redis将内存中的数据交换到磁盘时,提供服务的主线程和执行交换操作的子线程将共享这部分内存,因此,如果需要交换的数据被更新,则Redis将阻止此操作,直到子线程可以在完成交换操作之后进行修改。从Redis读取数据时,如果与读取键对应的值不在内存中,则Redis需要从交换文件中加载相应的数据,然后将其返回给请求者。 I/O线程池有问题。默认情况下,Redis将阻止,即,仅在加载所有交换文件后才会响应。当客户端数量少并且执行批处理操作时,此策略适用。但是,如果将Redis用于大型网站应用程序,则显然不能满足大量并发的情况。因此,Redis运行。我们设置I/O线程池的大小,并对需要从交换文件中加载相应数据的读取请求执行并发操作,以减少阻塞时间。

对于Redis和Memcached等基于内存的数据库系统,内存管理的效率是影响系统性能的关键因素。传统C语言中的malloc/free函数是最常用的分配和释放内存的方法,但是这种方法有很大的缺陷:首先,对于开发人员而言,不匹配的malloc和free容易导致内存泄漏;频繁的调用将导致大量内存碎片被回收和重用,从而降低了内存利用率;最后,作为系统调用,其系统开销比常规函数调用大得多。因此,为了提高内存管理效率,高效的内存管理解决方案将不会直接使用malloc/free调用。 Redis和Memcached都使用自己设计的内存管理机制,但是实现方法却大不相同。下面将介绍两者的内存管理机制。

默认情况下,Memcached使用Slab分配机制来管理内存。主要思想是根据预定大小将分配的内存划分为特定长度的块,以存储相应长度的键值数据记录以完全解决内存问题。碎片问题。 Slab分配机制仅用于存储外部数据,这意味着所有键值数据都存储在Slab分配系统中,而Memcached的其他内存请求则通过普通的malloc/free来应用,因为这些请求的频率决定了它们不会影响整个系统的性能。平板分配的原理非常简单。 它首先从操作系统中申请一个大内存块,将其划分为各种大小的块,然后将相同大小的块划分为Slab类组。其中,”块”是用于存储键值数据的最小单位。 启动Memcached时,可以通过制定增长因子来控制每个Slab类的大小。假设图中的增长因子为1.25。如果第一组块的大小为88字节,则第二组块的大小为112字节,依此类推。

当Memcached接收到客户端发送的数据时,它将首先根据接收到的数据的大小选择最合适的Slab类,然后查询Memcached保存的Slab类中的空闲块列表。查找可用于存储数据的块。当数据库过期或被丢弃时,记录所占用的块可以被回收并添加回空闲列表。

从以上过程中,我们可以看到Memcached的内存管理系统效率很高,不会导致内存碎片,但是其最大的缺点是会导致空间浪费。因为每个块分配有特定长度的内存空间,可变长度数据无法充分利用这些空间,如图所示,在128字节的块中缓存了100字节的数据,其余28字节被浪费了。 >

Redis内存管理主要通过源代码中的两个文件zmalloc.h和zmalloc.c实现。为了便于管理内存,Redis将在分配内存后将该内存的大小存储在内存块的头部。 如图所示,real_ptr是redis在调用malloc之后返回的指针。 Redis将存储块的大小存储在头部的大小中,由size占用的内存大小是已知的,是size_t类型的长度,然后返回ret_ptr。当需要释放内存时,ret_ptr被传递到内存管理程序。通过ret_ptr,程序可以轻松计算real_ptr的值,然后将real_ptr传递给空闲空间以释放内存。

Redis通过定义一个数组来记录所有内存分配。该数组的长度为ZMALLOC_MAX_ALLOC_STAT。数组的每个元素代表当前程序分配的存储块数,并且存储块的大小是元素的索引。 在源代码中,此数组是zmalloc_allocations。 zmalloc_allocations [16]表示已分配的16个字节的内存块数。 zmalloc.c中有一个静态变量used_memory,用于记录当前分配的内存的总大小。因此,总的来说,Redis使用打包的mallc/free,这比Memcached的内存管理方法简单得多。

3.性能比较:由于Redis仅使用单个内核,而Memcached可以使用多个内核,平均而言,当在每个内核上存储小数据时,Redis的性能要高于Memcached。在100k以上的数据中,Memcached性能要高于Redis。尽管Redis最近还优化了存储大数据的性能,但它仍然略逊于Memcached。

4.Redis和Memcached都将数据存储在内存中,并且都是内存数据库。但是Memcached也可以用于缓存其他内容,例如图片,视频等;

5.虚拟内存-当Redis的物理内存用完时,您可以将一些长时间未使用的Value交换到磁盘上。

6.设置时指定过期策略-Memcached,例如:,即永远不会过期。可以通过以下方式设置Redis:

7.Distributed-Set Memcached群集,将magent用作主从服务器; Redis可以是主服务器,也可以是从服务器。可以是一个主机和一个从机;

8.存储数据安全性– Memcached挂起后,数据不见了; Redis可以定期(永久)保存到磁盘;

9.灾难恢复-Memcached挂起后,数据无法恢复; Redis数据丢失后可以通过AOF恢复;

10.Redis支持数据备份,即主从模式下的数据备份。

11.应用场景不同:Redis不仅用作NoSQL数据库,而且还用作消息队列,数据堆栈和数据缓存。 Memcached适用于缓存SQL语句,数据集,用户临时数据以及延迟的查询数据和Session等。

未经允许不得转载:数据库同步软件|Mysql数据同步软件|sqlserver数据库同步工具|异构同步 » Redis与其他数据库区别,Redis为什么速度快

分享到:更多 ()

syncnavigator 8.6.2 企业版

联系我们联系我们