大家好,我是第三个孩子。炉渣反攻击系列继续进行。我们将在本节中获得Redis-没有人会在假期里玩,对吗?
REDIS是基于键值的NOSQL数据库。
对于数据库比平均钥匙值更强的地方,REDIS支持字符串(字符串),哈希(哈希),列表(列表),set(set),zset(有序集合),bitmaps(bitmap),hyperloglog,hyperloglog,地理(地理信息定位)和其他数据结构,因此REDIS可以符合许多应用程序方案。
而且由于Redis将所有数据存储在内存中,因此其读写性能非常好。
不仅如此,Redis还可以以快照的形式将内存数据和日志保存到硬盘。这样,当电源off或机器故障时,内存中的数据将不会“丢失”。
除上述功能外,REDIS还提供了其他功能,例如有效期,释放订阅,交易,装配线和LUA脚本。
简而言之,Redis是一种强大的性能武器。
REDIS的应用通常使用该项目询问,以E -Commerce项目的用户服务为例:
细绳
字符串的最基本数据结构。字符串类型的值实际上可以是字符串(简单的字符串,复杂的字符串(例如JSON,XML)),数字(整数,浮点数),甚至binarycan不超过512MB。
该字符串主要具有以下典型使用方案:
有
哈希类型意味着钥匙值本身是键值 - 台结构。
哈希主要具有以下典型应用程序方案:
列表
列表(列表)类型用于存储多个顺序字符串。列表是一个更灵活的数据结构,可以充当堆栈和队列的角色
该列表主要包括以下使用方案:
放
集合(SET)类型也用于保存多个字符串元素,但与列表类型不同,该元素中没有重复元素,并且集合中的元素是无序的。
该集合主要包括以下方案:
排序集
可以对有序集合中的元素进行排序。它为每个元素设置一个重量(分数)作为排序的基础。
有序收集的主要应用程序方案:
REDIS的速度通常很快,并且站着的Redis可以支持每秒超过100,000的并发。与MySQL相比,性能超过MySQL。快速速度的主要原因是:
引用Zhihu以前的答案来解释什么是我/o Multi -way Reuse。请您成为老师,让30名学生回答一个问题,然后检查学生是否正确。您有以下选项:
第一个是阻止IO模型,第三个是I/O重用模型。
有三种实现IO Multi -Way重复使用的方法:选择,民意调查和EPOLL。
例如,EPOLL方法是将与用户套接字相对应的FD注册到EPOLL中,然后EPOLL可以帮助您聆听插座具有信息要访问的信息,以避免大量无用操作。这次,在这次时,插座应采用非覆盖模式。
这样,只有在选择,民意调查和EPOLL时才会阻止整个过程。新闻和接收客户不会被阻止。整个过程或线程将被充分使用。这是事件驱动器,即SO称为反应堆模式。
官方说明:https://redis.io/topics/faq
常见问题解答官方表示,由于Redis是基于内存操作,因此CPU在Redis的瓶颈中很少见,并且Redis的瓶颈最有可能是内存或网络限制的大小。
如果您想最大程度地使用CPU,则可以在一台计算机上启动多个REDIS实例。
PS:互联网上有这样的答案。Tucao的官方解释有点敷衍。实际上,这是历史原因。开发人员认为多线程麻烦。后来,使用此CPU的问题被抛向用户。
同时,常见问题解答还提到,在Redis 4.0之后,它开始变成多线程。除主线程外,它还具有背景线程处理一些较慢的操作,例如清理肮脏的数据,无用连接的释放,大键删除等等。
redis不是说一个线程吗?6.0如何成为多线程?
REDIS6.0的多线程多线程使用多个线程来处理数据读取和协议分析,但是REDIS执行命令仍然是一个线程。
这是因为redis的性能瓶颈是?io??CPU,它启用了多线程多线程线程,以提高IO读写的效率以及REDIS的整体性能。
重新耐用的病例分为RDB和AOF。
RDB
RDB持久性是保存当前过程数据以生成快照到硬盘的过程,并且将RDB持久性过程分为手动触发器和自动触发器。
RDB是是是一个压缩的????,可以在一定时间恢复数据库状态。由于RDIS PUPA存储在硬盘上,即使Redis倒塌或退出,只要存在RDB PUPA,,它可以还原以还原数据库的状态。
手动触发器对应于保存和bgsave命令:
以下场景将自动触发RDB持久性:
AOF
AOF(仅附加文件)持久性:每次在独立日志中记录命令,然后在重新启动以实现恢复数据的目的时重新执行AOF文件中的命令。AOF的主要作用是求解真实 -数据持续时间。现在,它是重新持久性的主流方法。
AOF的工作流操作:命令写入(附加),文件同步(同步),文件重写(重写)和重新启动加载过程如下:
1)所有写作命令将添加到AOF_BUF(缓冲区)中。
2)AOF缓冲液根据相应的策略对硬盘运行。
3)随着AOF文件越来越大,有必要定期重写AOF文件以实现压缩目的。
4)当Redis服务器重新启动时,可以将AOF文件加载以进行数据恢复。
RDB |优点
RDB |缺点
AOF |优点
AOF |缺点
当Redis失败时,可以从RDB或AOF恢复数据。
恢复过程也很简单。将RDB或AOF文件复制到REDIS的数据目录。如果使用AOF恢复,请使用配置文件打开AOF,然后启动Redis-Server。
REDIS启动时加载数据的过程:
重新启动REDIS时,我们很少使用它来恢复内存状态,因为它会丢失大量数据。我们通常使用AOF日志替换,但是替换AOF日志的性能相对较慢。在这种情况下,REDIS实例很大,需要很长时间。
为了解决此问题,REDIS 4.0带来了新的持久性选项-Hybrid and Persistence。存在文件内容的内容和增加的AOF日志文件。这里的aof log不再是所有日志,而是增量的AOF AOF AOF在持续结束时期发生的日志。通常,AOF日志的这一部分很小:
因此,当Redis重新启动时,可以先加载的内容,然后替换AOF日志中的增加以完全替换了先前的AOF全部文件重播,因此重新启动效率得到了极大的提高。
有三种主要的方法可以保证重新使用重新供应:主要,轻松,哨兵和集群。
复制主和从引用REDIS服务器的数据到其他Redis服务器。前者称为主节点,后者是从节点调用的。数据的副本是一个-way,仅来自主机从node.redis master和从属复制的节点支持中间柱和同步,后者是REDIS后续版本的新功能,以减少主节点的同步负担。
主的主要角色和声音副本?
Redis的复制拓扑可以支持单层或多层次复制关系。根据拓扑复杂性,可以将其分为以下三种类型:一种主人,一个,一个主,多和树形结构。
1.一个主人,一个和奴隶结构
一个主人和一个 - 奴隶结构是拓扑的最简单副本。当主节点出现时,它用于提供来自节点的故障传输支持。2。一个主人和许多结构
主人主要来自结构(也称为星形拓扑),因此应用程序可以使用多个节点来实现读取和写作分离(请参见图6-5)。对于相对较大的阅读场景,您可以发送读取命令对主节点的压力划分主节点3。树状的主要商店结构
像树一样的main刻板结构(也称为树拓扑结构)使节点不仅可以复制主节点数据,而且还可以继续将其复制到下层,作为节点的主节点。通过引入中间层,主节点的负载可以有效减少,并且需要传输到节点的数据量。
REDIS复制的工作流可以分为以下步骤:
REDIS在2.8及以上版本中使用Psync命令来完成主要数据同步。同步过程分为:全数量和复制的一部分。
完全复制通常用于初始复制方案。REDIS在早期支持的重复函数仅完全复制。它将一次将主节点的全部数据发送到节点。当数据量为Larges费用时。
完整复制的完整操作过程如下:
复制部分的一部分主要是Redis对超高开销做出的最佳措施,以进行全面复制。它是使用psync {runid} {offset}命令实现的。主节点的请求损失将需要从节点上进行。该部分的数据直接发送到节点,以便可以维护主节点和从属节点的一致性。
尽管主和森基的复制很好,但有一些问题:
第一个问题是Redis的高可用问题。第二和第三个问题属于Redis的分布式问题。
主和从副本存在问题,并且无法完成自动故障传输。因此,我们需要一个解决方案来完成自动故障传输,即Redis Sentinel。
Redis Sentinel,由两个部分组成,哨兵节点和数据节点:
根据复制,前哨实现了自动化故障功能。以下是前哨功能的官方描述:
其中,监视和自动故障传输功能允许哨兵在时间上找到主节点故障并完成传输。配置提供商和通知功能需要反映在与客户端的互动中。
哨兵模式是通过哨兵节点完成数据节点的监视,离线和故障传输。
主观离线和客观的离线主观离线是哨兵节点认为某个节点是有问题的。离线目标是,超过一定数量的哨兵节点认为主节点是有问题的。
REDIS使用筏算法当前的领导者选举。一般过程如下:
选择新的杰作,分为这样的步骤:
如前所述,主和板的高可用性和分布存在问题。哨兵解决了高可用性的问题,群集是最终的解决方案,该解决方案解决了一口气中高可用性和分布式问题的问题。
在分布式存储中,根据分区规则将数据集映射到多个节点。有三个常见的数据分区规则:
选项1:该节点将剩余分区节点采用剩余分区。它很容易理解并使用特定数据,例如Redis或用户ID的密钥,并取下响应的残基。映射节点。
但是,该方案的最大问题是,当节点的数量变化(例如扩展或收缩节点)时,需要重新计算数据节点映射,这将导致数据重新迁移。
选项2:一致性哈希分区将整个哈希值空间组织到虚拟戒指中,然后将缓存节点的IP地址或主机名放置在此环上。当我们需要确定哪个需要进入哪个节点时,首先,对此键执行相同的哈希值,确定环上的位置,然后在顺时针方向和遇到的环中“步行”。第一个缓存节点是要访问的节点。
例如,在下图中,键1和键2将落入节点1,键3,键4将落入节点2,键5落入节点3中,键6落入节点4 middle中。
与节点相比,该方法的最大优点是,添加和删除节点仅影响哈希环中的相邻节点,这对其他节点没有影响。
但是仍然有一个问题:
选项3:根据虚拟插槽分区的一致性哈希分区,引入了虚拟节点的概念。REDIS群集使用此解决方案,称为插槽。凹槽是数据与实际节点之间的虚拟概念。每个实际节点都包含一定量的凹槽,每个插槽包含一定范围内的数据。
在插槽的一致性哈希区中,插槽是数据管理和迁移的基本单位。凹槽与实际节点之间的关系是耦合的,并且增加或删除的节点对系统的影响很小。静止不解上述。图是一个示例。系统中有一个实用节点。
如果此时删除它,则只需重新插入插槽4-7即可。例如,将插槽4-5分配给,插槽6分配给,并将插槽7分配给其他节点分布中数据的分布。
REDIS群集通过数据分区实现数据分布式存储,并通过自动故障传输实现高可用性。
创建群集时,群集创建数据分区完成。
设置节点redis簇通常由多个节点组成。节点的数量至少为6个,以确保一个完整且高可用的群集。每个节点需要打开配置群集启用的YES,以允许REDIS在群集模式下运行。节点握手节点和握手是指一组一组在集群模式下运行的节点通过八卦协议相互通信以实现彼此感知的过程。节点握手是集群相互通信的第一步。客户端发出了一个命令:群集Meet {ip} {port}。节点握手后,redis节点形成了更多节点的群集。
插槽redis群集将所有数据映射到16,384个插槽。每个节点对应于几个凹槽。只有分配节点时,您才能响应与这些插槽关联的密钥命令。节点分配插槽由cluser addslots命令分配。
REDIS群集的故障传输类似于前哨的故障传输,但是Redis群集中的所有节点都必须承担状态维护的任务。
该故障发现Redis群集中的节点通过PING/PONG消息实现节点通信。群集中的每个节点定期将ping消息发送给其他节点,并接收节点回复串消息作为响应。如果通信在cluster-node time time time of the of closessout失败,则发送节点会相信有接收节点的故障和接收节点被标记为主观离线(PFAIL)状态。当节点判断另一个节点的主观离线时,相应的节点状态将在群集中传播,并通过消息传递。通过八卦消息。,群集中的节点不断收集故障节点的离线报告。当超过一半的插槽的主节点标记有某个节点时,某个节点是主观的离线。触发客观的离线过程。
恢复
故障节点成为一个离线目标之后,如果离线节点是保存插槽的主节点,则需要从其节点中选择一个替换,以确保群集的高可用性。
部署redis群集至少几个物理节点?
在投票选举的会议中,错误的主要节点也计入了投票次数。假设群集中的节点的大小为3个主要节点和3个主节点,其中2个主节点被部署在一台计算机上。当这台机器停机时,由于倾斜,无法收集3/2+1的主要节点投票,这将导致不移动。此问题也适合发现失败。机器部署簇时,以避免单点问题。
REDIS群集提供了灵活的节点扩展和收缩解决方案。它可以在群集中添加节点以扩展群集而不会影响群集的外部服务。实际上,群集扩展和收缩的关键点是凹槽和节点之间的相应关系。扩展和收缩是新节点的一部分。
例如,下面的群集,每个节点对应于几个凹槽,每个插槽对应于某些数据。如果要在群集扩展中添加一个节点,则需要将插槽的一部分迁移并通过相关命令迁移到新节点。收缩是相似的,首先将插槽和数据迁移到其他节点,然后向下迁移相应的节点。
PS:这是旧的八岁 - 时尚的旧八个calendar,您必须理解它。
缓存在特定时间中打破了大量并发访问到期的访问,从而导致所有请求直接击中数据库。
解决方案:
在查询缓存和渗透手指的查询缓存和数据库中不存在的数据,因此每个请求都直接击中数据库,就好像不存在缓存一样。
缓存渗透将导致不存在的数据到达存储层以查询每次,从而失去缓存保护的后端存储的含义。
缓存渗透可能会增加后端的存储负载。如果发现大量存储层撞击,则可能会出现缓存渗透问题。
缓存渗透的原因可能有两个:
它有两个主要解决方案:
一种方法是在未点击数据库后将空对象或默认值保存到缓存中,然后访问该数据以从保护数据库的缓存中获取。
缓存空缺有两个主要问题:
如果数据保存在BLOOM过滤器中,则无法判断数据,将无法访问该存储。
始终始终使用缓存缓存缓存缓存故障,例如缓存服务停机时间,大量键同时到期。这种结果是,数量的要求直接向数据库,这可能导致整个系统崩溃。称为雪崩。
雪崩是三个主要的缓存问题中最严重的。让我们看看如何预防和处理它。
Bloom过滤器,它是一个连续的数据结构,每个存储都存储在一个中,也就是说,以确定数据是否存在。
存储数据时,请使用不同的哈希函数将此变量映射到位列表的k点,然后将其放置为1。
我们判断缓存密钥是否存在。同样,k哈希函数映射到位列表上的k点,以确定它是否为1:
Bloom过滤器有一些缺点:
根据CAP理论,不可能确保在确保分区的可用性和容错性的前提下保持一致性。因此,缓存和数据库的绝对一致性是不可能的。它只能节省尽可能多的缓存和数据库的最终一致性。
选择正确的缓存更新策略1.删除缓存而不是更新缓存
当在缓存键上写线程时,如果其他线程读取数据库,则会读取肮脏的数据并导致数据不一致的问题。
相比之下,删除缓存的速度比更新缓存的速度要快得多,使用的时间相对较小,并且读取脏数据的可能性要少得多。
更新数据,时间消耗了高速缓存的100倍以上。缓存中没有相应的键,当数据库未完成时,如果伤口线程进来读取数据并将其写入缓存,则在更新之后将其写入缓存。成功,此密钥是一个肮脏的数据。
毫无疑问,首先将其删除,然后再删除更多数据库。缓存中不存在密钥的时间更长,并且可能会生成脏数据的可能性更大。
目前,最受欢迎的缓存读写策略缓存 - 质图案使用了更多数据库,然后删除存款。
如果缓存不一致,如果不是并发,则非常高度依赖于缓存。实际上,与某些程序不一致是可以接受的。
但是,如果一致性要求相对较高,则必须找到一种方法来确保缓存与数据库中的数据一致。
缓存和数据库数据有两个共同的原因:
消息队列确保删除密钥以引入消息队列。删除键以删除消息队列的键,使用消息队列的试用机制删除相应的键。
该方案看起来不错,缺点是它具有一定的商业代码入侵。
数据库订阅+消息队列确保删除密钥,您可以使用服务(例如Ali运河)来监视数据库的Binlog,以获取需要操作的数据。
然后使用公共服务从订阅程序中获取用于缓存删除操作的信息。此方法减少了业务的入侵,但实际上,整个系统的复杂性得到了改善,适用于改进基础设施的大型工厂。
还有另一种延迟双重缺失的情况,可以防止脏数据。当缓存不存在时,编写了肮脏的数据。首先删除这种情况,然后数据库的缓存更新策略更为多。删除。
简而言之,在第一段时间后,第一次删除缓存后,将再次删除缓存。
此方法的延迟时间设置需要仔细考虑和测试。
设置缓存到期时间
这是一种简单但有用的方法,可以为缓存设置合理的到期时间。即使存在不一致的缓存数据问题,也永远不会一致。当缓存到期时,它自然会恢复。
PS:这个问题很少被问到,但是在实际工作中非常普遍。
在日常开发中,我们经常使用两个级别的缓存:本地缓存+分布式缓存。
SO值的本地缓存将与服务器的内存缓存相对应。例如,咖啡因,分布式缓存基本上使用redis。
因此,问题是,如何使数据与本地缓存和分布式缓存保持一致?redis缓存,数据库已更新,并且可以直接删除缓存键,因为对于应用程序系统,它是集中式缓存。
但是,本地缓存是非中央化的,分散在分布式服务的各个节点上,并且无法通过客户端的请求删除本地缓存密钥。
您可以使用消息队列方法:
什么是热键?如此称呼的热键是访问频率的钥匙。
例如,流行的新闻事件或产品,此类关键通常具有较大的流量访问,这对于存储此类信息的Redis来说并不小。
如果部署了REDIS群集,则热键可能会导致整体流量的不均匀性。单个节点的操作太大,热点键甚至会超过Redis本身可以承受的操作。
如何处理热键?
热门钥匙的处理最重要的是监视热点钥匙。您可以从这些目的监视热点键:
只要将其监视到热键,就可以简单地处理热键:
SO称为的缓存热情是将数据库中的数据提前刷到缓存中。通常有这些方法:
1.直接编写缓存刷新页面或界面,并在上网时手动操作
2.数据量不大,您可以在项目启动时自动加载
3.正时任务刷新缓存。
在开发过程中,通常使用“缓存+过期时间”的策略来加速数据的读取并确保定期更新数据。该模型基本上可以满足大多数需求。
但是,如果有两个问题,如果同时存在两个问题,可能会有一个大问题:
如何处理?
要解决这个问题,这不是很复杂。解决问题的重点是:
因此,通常采用以下方式:
什么是无底问题?
2010年,Facebook的Memcache节点达到了3,000,载有TB级缓存数据。但是,开发,操作和维护人员发现了一个问题,可以满足业务需求,以添加大量新的memcache节点,但发现该性能并非只有没有改善,但减少了。当时,这种现象被称为“缓存的“无底孔”现象。
那么,为什么这种现象引起这种现象?
一般来说,添加节点使memcache簇变得更强大,但事实并非如此。密钥值数据库通常映射到各种节点,因为哈希函数通常用于使用哈希函数,从而导致键的分布没有任何内容,使其没有任何内容。与业务合作。但是,由于数据和访问的持续增长,需要添加大量节点作为水平扩展,从而导致关键值的分布,无论是Memcache的分布式类型还是REDIS,都需要进行批处理操作。通常需要从不同的节点获得。与单个机器批处理操作相比,仅涉及一个网络操作,分布式批处理操作涉及多个网络时间。
如何在没有问题的情况下优化问题?
让我们分析毫无疑问的问题:
常见的优化想法如下:
有几种处理REDIS内存的方法:
Redis有两个过期的数据回收策略:
惰性删除
惰性删除是指我们查询密钥时的键测试。如果它达到到期时间,它将被删除。显然,如果没有访问这些过期的钥匙,他会被直立和直立删除,并且他被记忆直接占据。
定期删除
定期删除是指数据库的数据库检查一段时间,并删除??的过期键。由于无法删除所有密钥旋转查询,REDIS每次都会随机进行检查并删除。
当Redis使用的内存到达最大值上限时,将触发相应的溢出控制策略。REDIS支持六种策略:
REDIS被阻止,可以从以下方面进行检查:
CPU饱和问题
单个线程REDIS处理命令只能使用一个CPU。CPU饱和度是指使用Redis单核CPU达到近100%。
对于这种情况,处理步骤通常如下:
持续相关的阻塞
对于启动持久功能的重新启用节点,您需要检查它是否是由持久性引起的障碍。
在使用Redis期间,有时会发生大钥匙,例如:
大钥匙有什么问题?
如何找到大钥匙?
如何处理大钥匙?
我们知道Redis支持许多结构化数据,因此如何将Redis用作异步队列?通常有几种方法:
这样,消费者的死周期RPOP会从队列中消耗掉。但是,即使队列中没有新闻,也将执行RPOP,这将导致REDIS CPU消耗。但这将延迟。
-a使用列表作为队列,LPUSH生产消息,BRPOP消耗消息
BRPOP是RPOP的阻止版本。当列表为空时,它将始终被阻止,直到列表中有一个值或超时为止。
此方法只能实现一个 - 到一个消息队列。
发布/订阅模式可以发布/订阅为1:N。发布者将消息发布到指定的频道(频道),并且订阅相应频道的客户端可以接收消息。
但是这种方法不是可靠的。它不能保证订户可以接收消息并且不会存储消息。
因此,将平均异步队列的实现留给了专业消息队列。
您可以使用ZSET的结构将设置时间戳作为得分排序,并使用ZADD Score1 Value1 ....命令始终可以向内存产生消息。通过循环的队列任务。
REDIS提供了简单的交易,但其对酸的支持尚未完成。
多命令代表事务,EXEC命令表示事务的末尾,它们之间的命令由Atom Order执行:
REDIS事务的原则是,所有指令在EXEC之前并不执行,而是在服务器的事务队列中执行。服务器收到EXEC指令后,将执行整个事务队列。
因为REDIS执行命令是一个线程,所以此命令集按顺序执行,并且不会被其他线程中断。
REDIS交易的关注是什么?
您需要注意:
Redis事务为什么不支持回滚?
Redis的事务不支持回滚。
如果执行命令有语法错误,REDIS将执行故障,并且可以从程序级别捕获并解决这些问题。但是,如果发生其他问题,则其余命令将继续。
这样做的原因是,有必要增加大量工作,因为滚动可以保持简单而快速的特征而无需支持。
REDIS的交易功能相对简单。在通常的开发中,您可以使用LUA脚本来增强Redis的命令。
LUA脚本可以为开发人员带来这些好处:
例如,本段的尖峰系统(腐烂)(大)经典(街道)使用LUA扣除Redis库存的脚本:
REDIS提供了三种包装客户端多个命令并将其发送到服务器执行的方法:
管道(管道),交易(交易)和LUA脚本(LUA脚本)。
管道(管道)
REDIS管道是三个中最简单的管道。当客户端需要执行多个redis命令时,可以通过多个命令将其发送到服务器,以通过管道执行。例如,性能的影响,我们使用NC命令将两个指令发送到Redis服务器。
REDIS服务器接收到管道发送的多个命令后,将始终保留该命令并缓存命令的执行结果,直到执行最后一个命令为止。所有命令的执行结果一次返回客户端。
管道的优势
在性能方面,管道式有以下两个优点:
REDIS是分布式锁定的目标,基本上是在Redis中进行“坑”。当其他过程也被占据时,他们发现有人蹲在那里,因此他们必须放弃或以后再试。
Pitchus通常使用setnx(如果不存在的话)指令,这仅允许客户端占据坑。先先来首先使用,然后使用它,然后调用DEL指令以释放坑。
但是,有一个问题。如果逻辑在中间执行异常,则可能导致DEL指令不被调用,因此它将陷入僵局,锁将永远不会释放。
因此,在获得锁后,将锁定时间添加到锁(例如5s),以便即使中间存在异常,它也可以确保5秒钟后自动释放锁。
但是上述逻辑仍然存在问题。如果服务器进程在setNX和到期之间突然挂起,则可能是因为机器被关闭或人为地杀死,这将导致过期无法执行并导致死锁。
此问题的根本原因是SETNX和过期是两个指令,而不是原子指令。如果可以一起执行这两个说明,则不会有任何问题。
此问题已在Redis 2.8版本中解决。此版本添加了集合指令的扩展参数,因此可以一起执行SETNX和Expire指令。
上述说明是原子说明与setNX结合并过期。这是一个相对完整的分布式锁。
当然,在实际开发中,没有人会自己写出分布式锁的顺序,因为有专业的轮子 - 雷森森。
这部分更深。如果没有写在简历上,则不应询问。
REDIS具有动态字符串(SD),链接列表(列表),字典(HT),Skiplist,Integer Set(Intset),压缩列表(Ziplist)和其他基础数据结构。
REDIS不使用这些数据结构直接实现数据库的关键值。相反,它基于这些数据结构来创建一个对象系统,以表示所有键值。
与我们常用的数据类型和编码相对应的映射关系:
简要介绍一下基础数据结构。如果您对数据结构有很好的掌握,那么理解这些结构并不难:
C语言使用具有长度的字符数组来表示字符串,并且字符数组的最后一个元素始终是。这个简单的字符串代表了在安全性,效率和函数方面的安全性,效率和功能功能方面的重新定义方式。
C语言字符串有什么问题?
如此简单的数据结构可能会导致以下问题:
如何解决Redis?优势?
简而言之,如何解决Redis:
词典是Redis服务器中最常见的复合数据结构。在哈希结构的数据外,所有REDIS数据库还形成了一个全局词典,以及带有过期时间的字典(存储在Redisdb数据结构中,)
什么是字典结构?
REDIS中的字典等同于Java中的哈希图,并且内部实现几乎相似。它使用哈希计算招标位置;通过“数组+链接列表”的链接地址方法来解决哈希冲突。同时,该结构也被吸收了两种不同数据结构的优势。
字典如何扩展?
词典结构包含两个哈希词。通常,只有一个哈希表HT [0]。扩展时,ht [0]中的价值是将ht [1]重新归还给ht [1],然后渐进的rehash -so -so -call渐进式逐渐重新指的是指此rehash的行动,并未以一次性和集中式的方式完成,但是它已完成多次和逐渐。
搬迁结束后,H [1]替换H [0]存储元素。
PS:跳台是一个更常见的结构。
Skiplist是一种有序的数据结构,可维护每个节点中其他节点的多个指针,以实现快速访问节点的目的。
为什么要使用跳台?
首先,由于ZSET需要支持随机插入和删除,因此使用数组来实现它是不合适的。关于分类问题,我们也很容易想到树木结构,例如红树/平衡树。REDIS为什么使用此类结构?
基于上述一些考虑,Redis使用基于William Pugh纸的结构来制作诸如跳桌之类的结构。
本质是解决发现问题。
如何实现跳台?
跳跃表节点中有这些元素:
压缩列表是Redis使用的数据结构来保存内存。它是一个顺序数据结构,由一系列连续内存的特殊代码组成。
一个压缩列表可以包含任何多个节点(条目),每个节点可以保存字节数组或整数值。
压缩列表由几个部分组成:
列表列表数据结构的早期版本使用压缩列表ziplist和普通的两条链接列表linkedlist,这意味着当元素小时使用该元素时,该元素时,元素与linkedlist一起使用。
但是,考虑到链接列表的额外空间相对较高,指针将占据字节(64位操作系统占据字节)。另外,每个节点的内存分开分布。记忆管理效率。
后来,新版本的Redis(3.2)改变了列表数据结构并取代了和平。QuickList是由时间效率和空间效率引入的一种新型数据结构。
QuickList由列表和Ziplist组合在一起,这是Ziplist充当节点的两条链接列表。
使用指令扫描钥匙列表的指定模型。恢复。这次,可以使用说明。该指令可以在不阻止的情况下提取指定模式的列表,但是会有一定的重复概率。只需在客户端上一次,但总时间将比直接指令更长。
参考:
[1]。“重新开发和实际战斗” [2]。“重新设计和实施” [3]。“ Redis in -Depth Adventure” [4]。Ai Xiaoxian“我想进入大型工厂” [5]。第二侧的Meituan:如何保证Redis和MySQL的一致性?[7]。妈妈不再担心我的采访,而Redis要求绿色[8]。访调员:如何解决缓存一致性的问题?[9]。在高并发场景中,是更新缓存还是首先更新数据库?[10]。[REDIS休息的道路] 3:Redis单线架构[11]。REDIS官方网站[12]。解决了Redis Big Key的问题,同事称赞他的Cowhide [13]。这篇文章就足够了,请遵循进步的[14]。“ REDIS5设计和源代码分析”
矿渣反击系列的第一个公共帐户:三分,欢迎关注!