![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redis核心原理与实战
文章平均质量分 94
主要以Redis做为展开,从0到1讲解核心原理,并附有实战教程。
香农派我最爱
I'm vegetable!
展开
-
Redis集群之通信开销:限制Redis Cluster规模的关键因素
Redis集群之通信开销:限制Redis Cluster规模的关键因素引言实例通信方法和对集群规模的影响Gossip 消息大小实例间通信频率如何降低实例间的通信开销引言Redis Cluster 能保存的数据量以及支撑的吞吐量,跟集群的实例规模密切相关。Redis 官方给出了 Redis Cluster 的规模上限,就是一个集群运行 1000 个实例。为什么要限定集群规模呢?其实,这里的一个关键因素就是,实例间的通信开销会随着实例规模增加而增大,在集群超过一定规模时(比如 800 节点),集群吞吐量反原创 2021-12-15 08:56:45 · 483 阅读 · 1 评论 -
Redis集群数据分布优化:如何应对数据倾斜?
Redis集群数据分布优化:如何应对数据倾斜?引言数据量倾斜的成因和应对方法bigkey 导致倾斜Slot 分配不均衡导致倾斜Hash Tag 导致倾斜数据访问倾斜的成因和应对方法引言在切片集群中,数据会按照一定的分布规则分散到不同的实例上保存。比如,在使用Redis Cluster 或 Codis 时,数据都会先按照 CRC 算法的计算值对 Slot(逻辑槽)取模,同时,所有的 Slot 又会由运维管理员分配到不同的实例上。虽然这种方法实现起来比较简单,但是很容易导致一个问题:数据倾斜。数据倾斜有两原创 2021-12-14 00:02:53 · 3039 阅读 · 0 评论 -
Redis集群之Redis支撑秒杀场景的关键技术和实践都有哪些?
Redis集群之Redis支撑秒杀场景的关键技术和实践都有哪些?引言秒杀场景的负载特征对支撑系统的要求Redis 可以在秒杀场景的哪些环节发挥作用Redis 的哪些方法可以支撑秒杀场景基于原子操作支撑秒杀场景基于分布式锁来支撑秒杀场景引言秒杀场景的业务特点是限时限量,业务系统要处理瞬时的大量高并发请求,而 Redis就经常被用来支撑秒杀活动。秒杀场景包含了多个环节,可以分成秒杀前、秒杀中和秒杀后三个阶段,每个阶段的请求处理需求并不相同,Redis 并不能支撑秒杀场景的每一个环节。秒杀场景的负载特征对支原创 2021-12-12 22:03:05 · 865 阅读 · 0 评论 -
Redis集群之Codis VS Redis Cluster:我该选择哪一个集群方案?
Redis集群之Codis VS Redis Cluster:我该选择哪一个集群方案?Codis 的整体架构和基本流程Codis 的关键技术原理数据如何在集群里分布集群扩容和数据迁移如何进行集群客户端需要重新开发吗怎么保证集群可靠性切片集群方案选择建议Codis 的整体架构和基本流程Redis Cluster 方案正式发布前,业界已经广泛使用的 Codis。Codis 集群中包含了 4 类关键组件:codis server:这是进行了二次开发的 Redis 实例,其中增加了额外的数据结构,支持数据迁原创 2021-12-12 20:58:10 · 363 阅读 · 0 评论 -
Redis集群之脑裂:一次奇怪的数据丢失
Redis集群之脑裂:一次奇怪的数据丢失引言为什么会发生脑裂第一步:确认是不是数据同步出现了问题第二步:排查客户端的操作日志,发现脑裂现象第三步:发现是原主库假故障导致的脑裂为什么脑裂会导致数据丢失如何应对脑裂问题引言所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求。而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。而且,严重的话,脑裂会进一步导致数据丢失。为什么会发生脑裂第一步:确认是不是数据同步出现了问题在主从集群原创 2021-12-12 12:06:40 · 2397 阅读 · 0 评论 -
Redis集群之Redis主从同步与故障切换,有哪些坑?
Redis集群之Redis主从同步与故障切换,有哪些坑?主从数据不一致读取过期数据不合理配置项导致的服务挂掉protected-mode 配置项cluster-node-timeout 配置项主从数据不一致主从数据不一致,就是指客户端从从库中读取到的值和主库中的最新值并不一致。那为啥会出现这个坑呢?其实这是因为主从库间的命令复制是异步进行的。具体来说,在主从库命令传播阶段,主库收到新的写命令后,会发送给从库。但是,主库并不会等到从库实际执行完命令后,再把结果返回给客户端,而是主库自己在本地执行完命令后原创 2021-12-12 11:29:29 · 1038 阅读 · 0 评论 -
Redis锁之事务机制:Redis能实现ACID属性吗?
Redis锁之事务机制:Redis能实现ACID属性吗?引言事务 ACID 属性的要求Redis 如何实现事务Redis 的事务机制能保证哪些属性原子性一致性隔离性持久性引言所谓的事务,就是指对数据进行读写的一系列操作。事务在执行时,会提供专门的属性保证,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),也就是 ACID 属性。事务 ACID 属性的要求原子性,就是一个事务中的多个操作必须都完成,或者都不完成。一致性原创 2021-12-11 22:43:13 · 129 阅读 · 0 评论 -
Redis锁之如何使用Redis实现分布式锁?
Redis锁之如何使用Redis实现分布式锁?引言单机上的锁和分布式锁的联系与区别基于单个 Redis 节点实现分布式锁基于多个 Redis 节点实现高可靠的分布式锁引言Redis 属于分布式系统,当有多个客户端需要争抢锁时,我们必须要保证,这把锁不能是某个客户端本地的锁。否则的话,其它客户端是无法访问这把锁的,当然也就不能获取这把锁了。所以,在分布式系统中,当有多个客户端需要获取锁时,我们需要分布式锁。此时,锁是保存在一个共享存储系统中的,可以被多个客户端共享访问和获取。Redis 本身可以被多个原创 2021-12-11 22:02:32 · 112 阅读 · 0 评论 -
Redis锁之无锁的原子操作:Redis如何应对并发访问?
Redis锁之无锁的原子操作:Redis如何应对并发访问?引言并发访问中需要对什么进行控制Redis 的两种原子操作方法引言为了保证并发访问的正确性,Redis 提供了两种方法,分别是加锁和原子操作。加锁是一种常用的方法,但是,其实这里会有两个问题:一个是,如果加锁操作多,会降低系统的并发访问性能;第二个是,Redis 客户端要加锁时,需要用到分布式锁,而分布式锁实现复杂,需要用额外的存储系统来提供加解锁操作。原子操作是另一种提供并发访问控制的方法。原子操作是指执行过程保持原子性的操作,而且原子操原创 2021-12-11 21:00:14 · 497 阅读 · 0 评论 -
Redis缓存篇之缓存被污染了,该怎么办?
Redis缓存篇之缓存被污染了,该怎么办?引言如何解决缓存污染问题LRU 缓存策略LFU 缓存策略的优化引言那什么是缓存污染呢?在一些场景下,有些数据被访问的次数非常少,甚至只会被访问一次。当这些数据服务完访问请求后,如果还继续留存在缓存中的话,就只会白白占用缓存空间。当缓存污染不严重时,只有少量数据占据缓存空间,此时,对缓存系统的影响不大。但是,缓存污染一旦变得严重后,就会有大量不再访问的数据滞留在缓存中。如果这时数据占满了缓存空间,我们再往缓存中写入新数据时,就需要先把这些数据逐步淘汰出缓存,这就会原创 2021-12-11 20:24:06 · 529 阅读 · 1 评论 -
Redis缓存篇之缓存异常:如何解决缓存雪崩、击穿、穿透难题?
Redis缓存篇之缓存异常:如何解决缓存雪崩、击穿、穿透难题?缓存雪崩原因一:大量缓存过期原因二:Redis缓存实例故障宕机缓存击穿缓存穿透缓存雪崩缓存雪崩是指大量的应用请求无法在 Redis 缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。具体可能导致问题原因:原因一:大量缓存过期第一个原因是:缓存中有大量数据同时过期,导致大量请求无法得到处理。当数据保存在缓存中,并且设置了过期时间时,如果在某一个时刻,大量数据同时过期,此时,应用再访问这些数据的话,就会发生缓原创 2021-12-11 14:43:27 · 1173 阅读 · 1 评论 -
Redis缓存篇之缓存异常:如何解决缓存和数据库的数据不一致问题
Redis缓存篇之缓存异常:如何解决缓存和数据库的数据不一致问题缓存和数据库的数据不一致是如何发生的如何解决数据不一致问题情况一:先删除缓存,再更新数据库情况二:先更新数据库值,再删除缓存值缓存和数据库的数据不一致是如何发生的其实,这里的“一致性”包含了两种情况:缓存中有数据,那么,缓存的数据值需要和数据库中的值相同;缓存中本身没有数据,那么,数据库中的值必须是最新值。对于读写缓存来说,如果要对数据进行增删改,就需要在缓存中进行,同时还要根据采取的写回策略,决定是否同步写回到数据库中。同步原创 2021-12-11 11:40:43 · 1426 阅读 · 0 评论 -
Redis缓存篇之替换策略:缓存满了怎么办?
Redis缓存篇之替换策略:缓存满了怎么办?引言设置多大的缓存容量合适Redis 缓存有哪些淘汰策略如何处理被淘汰的数据引言数据访问都是有局部性的,也就是我们通常所说的“八二原理”,80% 的请求实际只访问了 20% 的数据。所以,用 1TB 的内存做缓存,并没有必要。为了保证较高的性价比,缓存的空间容量必然要小于后端数据库的数据总量。不过,内存大小毕竟有限,随着要缓存的数据量越来越大,有限的缓存空间不可避免地会被写满。即缓存数据的淘汰机制。也把它叫作缓存替换机制,简单来说,数据淘汰机制包括两步:第原创 2021-12-11 01:22:26 · 655 阅读 · 1 评论 -
Redis缓存篇之旁路缓存:Redis是如何工作的?
Redis缓存篇之旁路缓存:Redis是如何工作的?缓存的特征Redis 缓存处理请求的两种情况Redis 作为旁路缓存的使用操作缓存的类型只读缓存读写缓存缓存的特征一个系统中的不同层之间的访问速度不一样,所以我们才需要缓存,这样就可以把一些需要频繁访问的数据放在缓存中,以加快它们的访问速度。想象一下,如果每次 CPU 处理数据时,都要从 ms 级别的慢速磁盘中读取数据,然后再进行处理,那么,CPU 只能等磁盘的数据传输完成。这样一来,高速的 CPU 就被慢速的磁盘拖累了,整个计算机系统的运行速度会原创 2021-12-10 23:42:18 · 582 阅读 · 0 评论 -
Redis性能篇之缓冲区:一个可能引发“惨案”的地方
Redis性能篇之缓冲区:一个可能引发“惨案”的地方引言客户端输入和输出缓冲区如何应对输入缓冲区溢出如何应对输出缓冲区溢出主从集群中的缓冲区复制缓冲区的溢出问题复制积压缓冲区的溢出问题引言缓冲区的功能其实很简单,主要就是用一块内存空间来暂时存放命令数据,以免出现因为数据和命令的处理速度慢于发送速度而导致的数据丢失和性能问题。但因为缓冲区的内存空间有限,如果往里面写入数据的速度持续地大于从里面读取数据的速度,就会导致缓冲区需要越来越多的内存来暂存数据。当缓冲区占用的内存超出了设定的上限阈值时,就会出现缓冲原创 2021-12-09 23:58:58 · 277 阅读 · 0 评论 -
Redis性能篇之删除数据后,为什么内存占用率还是很高?
Redis性能篇之删除数据后,为什么内存占用率还是很高?引言什么是内存碎片内存碎片是如何形成的内因:内存分配器的分配策略外因:键值对大小不一样和删改操作如何判断是否有内存碎片如何清理内存碎片引言在使用 Redis 时,我们经常会遇到这样一个问题:明明做了数据删除,数据量已经不大了,为什么使用 top 命令查看时,还会发现 Redis 占用了很多内存呢?实际上,这是因为,当数据删除后,Redis 释放的内存空间会由内存分配器管理,并不会立即返回给操作系统。所以,操作系统仍然会记录着给 Redis 分配了原创 2021-12-09 09:18:06 · 290 阅读 · 0 评论 -
Redis性能篇之波动的响应延迟:如何应对变慢的Redis?
Redis性能篇之波动的响应延迟:如何应对变慢的Redis?Redis 真的变慢了吗如何应对 Redis 变慢Redis 自身操作特性的影响1. 慢查询命令2. 过期 key 操作文件系统的影响:AOF 模式操作系统的影响:swap操作系统的影响:内存大页Redis 真的变慢了吗怎么判断Redis变慢了呢?基于当前环境下的 Redis 基线性能做判断。所谓的基线性能呢,也就是一个系统在低压力、无干扰下的基本性能,这个性能只由当前的软硬件配置决定。从 2.8.7 版本开始,redis-cli 命令提供原创 2021-12-09 00:14:55 · 804 阅读 · 0 评论 -
Redis性能篇之CPU结构也会影响Redis的性能?
Redis性能篇之CPU结构也会影响Redis的性能?主流的 CPU 架构CPU 多核对 Redis 性能的影响CPU 的 NUMA 架构对 Redis 性能的影响绑核的风险和解决方案方案一:一个 Redis 实例对应绑一个物理核方案二:优化 Redis 源码主流的 CPU 架构一个 CPU 处理器中一般有多个运行核心,我们把一个运行核心称为一个物理核,每个物理核都可以运行应用程序。每个物理核都拥有私有的一级缓存(Level 1 cache,简称 L1cache),包括一级指令缓存和一级数据缓存,以及私原创 2021-12-08 00:37:31 · 281 阅读 · 0 评论 -
Redis之异步机制:如何避免单线程模型的阻塞?
Redis性能篇之异步机制:如何避免单线程模型的阻塞?引言Redis 实例有哪些阻塞点1.和客户端交互时的阻塞点2. 和磁盘交互时的阻塞点3. 主从节点交互时的阻塞点4. 切片集群实例交互时的阻塞点哪些阻塞点可以异步执行异步的子线程机制引言影响 Redis 性能的 5 大方面的潜在因素,分别是:Redis 内部的阻塞式操作;CPU 核和 NUMA 架构的影响;Redis 关键系统配置;Redis 内存碎片;Redis 缓冲区。Redis 的网络 IO 和键值对读写是由主线程完成的。那么,原创 2021-12-06 09:58:53 · 556 阅读 · 0 评论 -
Redis之消息队列的考验:Redis有哪些解决方案?
Redis之消息队列的考验:Redis有哪些解决方案?引言消息队列的消息存取需求基于 List 的消息队列解决方案基于 Streams 的消息队列解决方案引言消息队列要能支持组件通信消息的快速读写,而 Redis 本身支持数据的高速访问,正好可以满足消息队列的读写性能需求。不过,除了性能,消息队列还有其他的要求,所以,很多人都很关心一个问题:“Redis 适合做消息队列吗?”这个问题的背后,隐含着两方面的核心问题:消息队列的消息存取需求是什么?Redis 如何实现消息队列的需求?消息队列的消原创 2021-12-06 00:21:18 · 337 阅读 · 0 评论 -
Redis数据实战之如何在Redis中保存时间序列数据?
Redis数据实战之如何在Redis中保存时间序列数据?引言时间序列数据的读写特点基于 Hash 和 Sorted Set 保存时间序列数据基于 RedisTimeSeries 模块保存时间序列数据引言现在有这样一个场景:需要周期性地统计近万台设备的实时状态,包括设备 ID、压力、温度、湿度,以及对应的时间戳:DeviceID, Pressure, Temperature, Humidity, TimeStamp这些与发生时间相关的一组数据,就是时间序列数据。这些数据的特点是没有严格的关系模型,记原创 2021-12-04 22:58:54 · 1214 阅读 · 0 评论 -
Redis数据实战之GEO在LBS中应用与自定义新数据类型
Redis数据实战之GEO在LBS中应用与自定义新数据类型引言面向 LBS 应用的 GEO 数据类型GEO 的底层结构GeoHash 的编码方法如何操作 GEO 类型如何自定义数据类型Redis 的基本对象结构开发一个新的数据类型引言Redis 的 5 大基本数据类型:String、List、Hash、Set 和Sorted Set,它们可以满足大多数的数据存储需求,但是在面对海量数据统计时,它们的内存开销很大,而且对于一些特殊的场景,它们是无法支持的。所以,Redis 还提供了 3种扩展数据类型,分别原创 2021-12-04 22:19:27 · 599 阅读 · 0 评论 -
Redis数据实战之统计一亿个keys,应该用哪种集合?
Redis数据实战之统计一亿个keys,应该用哪种集合?引言聚合统计排序统计二值状态统计基数统计引言在 Web 和移动应用的业务场景中,我们经常需要保存这样一种信息:一个 key 对应了一个数据集合。我举几个例子。1.手机 App 中的每天的用户登录信息:一天对应一系列用户 ID 或移动设备 ID;2. 电商网站上商品的用户评论列表:一个商品对应了一系列的评论;3.用户在手机 App 上的签到打卡信息:一天对应一系列用户的签到记录;4.应用网站上的网页访问信息:一个网页对应一系列的访问点击。R原创 2021-12-04 21:34:31 · 250 阅读 · 0 评论 -
Redis数据实战之“万金油”的String,为什么不好用了?
Redis数据实战之“万金油”的String,为什么不好用了?引言为什么 String 类型内存开销大用什么数据结构可以节省内存如何用集合类型保存单值的键值对引言以一个项目需要为例,需要开发一个图片存储系统,要求这个系统能快速地记录图片 ID 和图片在存储系统中保存时的 ID(可以直接叫作图片存储对象 ID)。同时,还要能够根据图片 ID 快速查找到图片存储对象 ID。图片 ID 和图片存储对象 ID 正好一一对应,是典型的“键 - 单值”模式。这和 String 类型提供的“一个键对应一个值的数据”原创 2021-12-04 20:22:31 · 1032 阅读 · 0 评论 -
Redis切片集群:数据增多了,是该加内存还是加实例?
Redis切片集群:数据增多了,是该加内存还是加实例?引言如何保存更多数据数据切片和实例的对应分布关系客户端如何定位数据引言在实战中单实例数据量较大,且采用RDB做持久化时,Redis响应会变慢。这跟 Redis 的持久化机制有关系。在使用 RDB 进行持久化时,Redis 会 fork 子进程来完成,fork 操作的用时和 Redis 的数据量是正相关的,而 fork 在执行时会阻塞主线程。数据量越大,fork 操作造成的主线程阻塞的时间越长。这个时候,我们注意到了 Redis 的切片集群。虽然组建原创 2021-12-04 00:18:45 · 147 阅读 · 0 评论 -
Redis哨兵集群:哨兵挂了,主从库还能切换吗?
Redis哨兵集群:哨兵挂了,主从库还能切换吗?引言基于 pub/sub 机制的哨兵集群组成基于 pub/sub 机制的客户端事件通知由哪个哨兵执行主从切换引言实际上,一旦多个实例组成了哨兵集群,即使有哨兵实例出现故障挂掉了,其他哨兵还能继续协作完成主从库切换的工作,包括判定主库是不是处于下线状态,选择新主库,以及通知从库和客户端。在配置哨兵的信息时,我们只需要用到下面的这个配置项,设置主库的 IP 和端口,并没有配置其他哨兵的连接信息。这些哨兵实例既然都不知道彼此的地址,又是怎么组成集群的呢?se原创 2021-12-03 23:24:28 · 1411 阅读 · 0 评论 -
Redis哨兵机制:主库挂了,如何不间断服务?
Redis哨兵机制:主库挂了,如何不间断服务?引言哨兵机制的基本流程主从级联模式分担全量复制时的主库压力主从库间网络断了怎么办引言如果主库发生故障了,那就直接会影响到从库的同步,因为从库没有相应的主库可以进行数据复制操作了。如果客户端发送的都是读操作请求,那还可以由从库继续提供服务,这在纯读的业务场景下还能被接受。但是,一旦有写操作请求了,按照主从库模式下的读写分离要求,需要由主库来完成写操作。此时,也没有实例可以来服务客户端的写操作请求了。如果主库挂了,我们就需要运行一个新主库,比如说把一个从库原创 2021-12-01 00:06:12 · 1438 阅读 · 0 评论 -
Redis数据同步:主从库如何实现数据一致?
Redis数据同步:主从库如何实现数据一致?引言主从库间如何进行第一次同步?主从级联模式分担全量复制时的主库压力主从库间网络断了怎么办引言我们总说的 Redis 具有高可靠性,是什么意思呢?其实,这里有两层含义:一是数据尽量少丢失,二是服务尽量少中断。AOF 和 RDB 保证了前者,而对于后者,Redis 的做法就是增加副本冗余量,将一份数据同时保存在多个实例上。实际上,Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。读操作:主库、从库都可以接收;写操作:首原创 2021-11-30 23:41:13 · 175 阅读 · 0 评论 -
Redis持久化之内存快照:宕机后,Redis如何实现快速恢复?
Redis持久化之内存快照:宕机后,Redis如何实现快速恢复?引言给哪些内存数据做快照快照时数据能修改吗可以每秒做一次快照吗引言AOF 日志的好处,是每次执行只需要记录操作命令,需要持久化的数据量不大。但是,也正因为记录的是操作命令,而不是实际的数据,所以,用 AOF 方法进行故障恢复的时候,需要逐一把操作日志都执行一遍。如果操作日志非常多,Redis 就会恢复得很缓慢,影响到正常使用。Redis还有另一种持久化方法:内存快照。所谓内存快照,就是指内存中的数据在某一个时刻的状态记录。和 AOF 相原创 2021-11-28 22:28:39 · 1098 阅读 · 2 评论 -
Redis持久化之AOF日志:宕机了,Redis如何避免数据丢失?
Redis持久化之AOF日志:宕机了,Redis如何避免数据丢失?AOF 日志是如何实现的?三种写回策略日志文件太大了怎么办AOF 重写会阻塞主线程吗AOF 日志是如何实现的?我们比较熟悉的是数据库的写前日志(Write Ahead Log, WAL),也就是说,在实际写数据前,先把修改的数据记到日志文件中,以便故障时进行恢复。不过,AOF 日志正好相反,它是写后日志,“写后”的意思是 Redis 是先执行命令,把数据写入内存,然后才记录日志。那 AOF 为什么要先执行命令再记日志呢?传统数据库的原创 2021-11-28 21:34:07 · 1668 阅读 · 1 评论 -
Redis高性能IO模型:为什么单线程Redis能那么快?
Redis高性能IO模型:为什么单线程Redis能那么快?引言Redis 为什么用单线程单线程 Redis 为什么那么快基本 IO 模型与阻塞点非阻塞模式基于多路复用的高性能 I/O 模型引言Redis 是单线程,主要是指 Redis 的网络 IO和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。Redis 为什么用单线程对于一个多线程的系统来说,在有合理的资源分配的情况下原创 2021-11-28 20:54:33 · 654 阅读 · 0 评论 -
Redis数据结构:快速的Redis有哪些慢操作?
Redis数据结构:快速的Redis有哪些慢操作?引言键和值用什么结构组织为什么哈希表操作变慢了集合数据操作效率有哪些底层数据结构不同操作的复杂度引言它接收到一个键值对操作后,能以微秒级别的速度找到数据,并快速完成操作。一方面,它是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快。另一方面,这要归功于它的数据结构。键值对是按一定的数据结构来组织的,操作键值对最终就是对数据结构进行增删改查操作,所以高效的数据结构是 Redis 快速处理数据的基础。String 类型的底层实现只有一原创 2021-11-28 20:20:54 · 434 阅读 · 0 评论 -
Redis基本架构:你会怎么设计一个键值数据库?
基本架构:你会怎么设计一个键值数据库?可以存哪些数据可以对数据做什么操作采用什么访问模式如何定位键值对的位置不同操作的具体逻辑是怎样的如何实现重启后快速提供服务可以存哪些数据对于键值数据库而言,基本的数据模型是 key-value 模型。 例如,“hello”:“world”就是一个基本的 KV 对,其中,“hello”是 key,“world”是 value。对于实际生产环境中的键值数据库来说,value 类型还可以是复杂类型。不同键值数据库支持的 key 类型一般差异不大,而 value 类型则有较原创 2021-11-28 18:06:51 · 283 阅读 · 0 评论