Redis

  • 1、Redis 的数据类型有哪些
  • 2、Redis 为什么设计成单线程的
  • 3、Redis 和 Memcached(买木开吃) 的区别有哪些
  • 4、缓存数据库为什么需要持久化
  • 5、Redis 为什么这么快
  • 6、Redis 中的 Zset 是怎么实现的
  • 7、请说说 Redis 的线程模型
  • 8、什么是 Redis 事务
  • 9、Redis 事务的注意点有哪些
  • 10、Redis 有几种持久化方式
  • 11、RDB 为什么要写入临时文件
  • 12、Redis 中 AOF 重写
  • 13、Redis 有几种数据过期策略
  • 14、内存淘汰机制
  • 15、什么是缓存穿透、缓存击穿、缓存雪崩
  • 16、如何保证缓存与数据库的数据一致性
  • 17、什么是主从复制
  • 18、什么是哨兵模式
  • 19、Redis Cluster 用来解决什么问题
  • 20、如何使用 Redis 实现分布式限流
  • 21、如何使用 Redis 实现消息队列
  • 22、假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,全部找出来
  • 23、对 Redis 进行性能优化,有些什么建议
  • 24、Redis 什么时候需要序列化?Redis 序列化方式有哪些
  • 25、什么是Redis的数据分片
  • 26、分布式锁

1、Redis 的数据类型有哪些

String、Hash、List、Set、Zset、Bitmaps、HyperLogLogs、Geospatial。

2、Redis 为什么设计成单线程的

纯粹的内存操作(非常快速),采用单线程,避免了不必要的上下文切换。

3、Redis 和 Memcached(买木开吃) 的区别有哪些

  1. 数据结构不同:Memcache 仅支持 key-value 结构的数据类型,Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,hash 等数据结构的存储。
  2. 持久化方式不同:Redis 支持多种持久化方式,如RDB和AOF,可以将数据持久化到磁盘上,而 Memcached 不支持持久化。
  3. 数据分片方式不同:Redis使用哈希槽分片,可以实现数据的自动分片和负载均衡,而 Memcached 只能手动分片。
  4. 处理数据的方式不同:Redis使用单线程处理数据请求,支持事务、Lua脚本等高级功能,而 Memcached 使用多线程处理数据请求,只支持基本的GET、SET操作。
  5. 协议不同:Redis使用自己的协议,支持多个数据库,可以使用密码进行认证;而Memcached使用文本协
    议,只支持一个默认数据库。

4、缓存数据库为什么需要持久化

缓存数据库的数据是存在内存中,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证在内存中的数据不会丢失,这种机制就叫缓存数据库持久化机制。

5、Redis 为什么这么快

  1. 基于内存:Redis 是一种基于内存的数据库,数据存储在内存中,数据的读写速度非常快,因为内存访问速度比硬盘访问速度快得多。
  2. 单线程模型:Redis 使用单线程模型,这意味着它的所有操作都是在一个线程内完成的,不需要进行线程切换和上下文切换。这大大提高了Redis的运行效率和响应速度。
  3. 高效的数据结构:Redis 提供了多种高效的数据结构,如哈希表、有序集合、列表等,这些数据结构都被实现得非常高效,能够在O(1)的时间复杂度内完成数据读写操作,这也是 Redis 能够快速处理数据请求的重要因素,并且对数据存储进行了一些优化,比如跳表。
  4. 异步非阻塞的网络IO模型:Redis 采用异步非阻塞的网络IO模型,能够处理大量的客户端连接请求,同时保持较低的系统负载。Rdis通过IO多路复用技术,实现了单个线程同时处理多个客户端连接的能力,从而提高了Redis的并发性能。
  5. 多线程的引入:在Redis6.0中,为了进一步提升IO的性能,引入了多线程的机制。采用多线程,使得网络处理的请求并发进行,就可以大大的提升性能。多线程除了可以减少由于网络I/O等待造成的影响,还可以充分利用CPU的多核优势。

6、Redis 中的 Zset 是怎么实现的

Redis 中的 ZSet 在实现中,有多种结构,大类的话有两种,分别是ziplist(压缩列表)和skiplist(跳跃表),但是这只是以前,在Redis5.0中新增了一个listpack(紧凑列表)的数据结构,这种数据结构就是为了替代ziplist的,而在之后Redis7.0的发布中,在Zset的实现中,已经彻底不在使用zipList了。


当ZSet的元素数量比较少时,Redis会采用ZipList(ListPack)来存储ZSet的数据。ZipList(ListPack)是一种紧凑的列表结构,它通过连续存储元素来节约内存空间。当ZSet的元素数量增多时,Redis会自动将ZipList(ListPack)转换为SkipList,以保持元素的有序性和支持范围查询操作。

何时转换

总的来说就是,当元素数量少于128,每个元素的长度都小于64字节的时候,使用ZipList(ListPack),否则使用SkipList。

跳表

跳表也是一个有序链表,如下面这个数据结构:

在这个链表中,我们想要查找一个数,需要从头结点开始向后依次遍历和匹配,直到查到为止,这个过程是比较耗费时间的,他的时间复杂度是O(N)。

那么,怎么能提升遍历速度呢,有一个办法,那就是我们对链表进行改造,先对链表中每两个节点建立第一级索引,如下图所示:


有了我们创建的这个索引之后,我们查询元素12,我们先从一级索引6->9->17->26中查找,发现12介于9和17之间,然后,转移到下一层进行搜索,即9->12->17,即可找到12这个节点了。

可以看到,同样是查找12,原来的链表需要扁历5个元素(3、6、7、9、12),建立了一层索引之后,只需要遍历3个元素即可(6、9、12)。

有了上面的经验,我们可以继续创建二级索引、三级索引…


在这样一个链表中查找12这个元素,只需要遍历2个节点就可以了(9、12)。像上面这种带多级索引的链表,就是跳表。时间复杂度O(logN)。

7、请说说 Redis 的线程模型

多个 socket 可能并发地产生不同的操作,每个操作对应不同的事件,IO 多路复用程序会监听多个 sokcet,会将socket 放入一个队列中排队,每次从队列中取出一个 socket 给事件分派器,其是单线程的,因此 redis 才叫做单线程的模型,文件事件分派器会根据每个 socket 当前产生的事件,来选择对应的事件处理器(命令请求处理器:写数据到 redis,命令回复处理器:客户端要从 redis 读数据,连接应答处理器:客户端要连接 redis)来处理。

8、什么是 Redis 事务

Redis 事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。Redis 事务的主要作用就是串联多个命令防止别的命令插队

9、Redis 事务的注意点有哪些

  • 组队中某个命令出现了报告错误,执行时整个的所有队列都会被取消。(例如 set k1 “yang”,set “jun”)
  • 如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。(例如set k1 “yang”, incr k1)

10、Redis 有几种持久化方式

RDB

Redis 会单独创建(fork)一个子进程来进行持久化,首会将数据入到一个临时文件中,待写入过程结束了再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能。快照文件小节省磁盘空间、恢复速度快,适合大规模的数据恢复,对数据完整性和一致性要求不高更适合使用。

  • 快照保持策略
手动触发 save SAVE命令执行快照的过程会阻塞所有客户端的请求,应避免在生产环境使用此命令
手动触发 bgsave BGSAVE命令可以在后台异步进行快照操作,快照的同时服务器还可以继续响应客户端的请求,因此需要手动执行快照时推荐使用BGSAVE命令
自动触发 save m n 根据配置规则进行自动快照,如SAVE 100 10,100秒内至少有10个键被修改则进行快照

AOF

以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。备份机制更稳健,丢失数据概率更低(它有三种写回策略),但是比起 RDB 占用更多的磁盘空间。恢复备份速度要慢。

  • 写回策略

    • Always 同步写回:每个写命令执行完,立马同步地将日志写回磁盘。
    • Everysec 每秒写回:每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘。
    • No 操作系统控制的写回:每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。

11、RDB 为什么要写入临时文件

在替换持久化文件之前要写入临时文件,比如同步10个数据在第8个时候中断了,如果直接同步到持久化dump文件这样是不行的,应该先同步到临时文件,这样主要为了保证 dump 文件数据的一致性完整性,也是处于数据的完全考虑,这个过程用到的就是写时复制技术

12、Redis 中 AOF 重写

因为AOF会把每个数据更改的操作指令,追加存储到AOF文件里面。所以很容易导致AOF文件出现过大,造成IO性能问题。Redis为了解决这个问题,设计了AOF重写机制,也就是说把AOF文件里面相同的指令进行压缩,只保留最新的数据指令。

简单来说,如果AOF文件里面存储了某个key的多次变更记录,但是实际上,最终在做数据恢复的时候,只需要执行最新的指令操作就行了,历史的数据就没必要存在这个文件里面占空间。

13、Redis 有几种数据过期策略

Redis的过期策略采用的是定期删除和惰性删除相结合的方式

定期删除:指的是 redis 默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果其就删除。假设 redis 里放了10万个 key,都设置了过期时间,每隔几百毫秒,就检查10万个key,那 redis 基本就挂了,cpu负载会很高,消耗在检查过期key上了。因此,实际上 redis 是每隔 100ms 随机抽取一些 key 来检查和删除的。

问题:定期删除可能导致很多过期 key 到了时间并没有被删除掉。解决:惰性删除。

惰性删除:并不是key到时间就被删除掉,而是查询这个 key 的时候,redis再懒惰地检查一下

但是这实际上还有问题,如果定期删除漏掉了很多过期key,然后也没有及时去查,也就没走惰性删除,此时大量过期 key 堆积在内存里,导致 redis 内存块耗尽了,怎么办?走内存淘汰机制

14、内存淘汰机制

如果 redis 的内存占用过多,此时会进行内存淘汰,有如下一些策略:

  1. noeviction:当内存不足以容纳新写入数据时,新写入操作会报错(默认)。
  2. allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)。
  3. allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key
  4. volatile-lru:当内存不足以容纳新写入数据时,在过期时间的键空间中,移除最近最少使用的key
  5. volatile-random:当内存不足以容纳新写入数据时,在过期时间的键空间中,随机移除某个 key
  6. volatile-ttl:当内存不足以容纳新写入数据时,在设过期时间的键空间中,有更早过期时间的key优先移除

15、什么是缓存穿透、缓存击穿、缓存雪崩

缓存穿透

缓存穿透是指缓存服务器中没有缓存数据,数据库中也没有符合条件的数据,导致业务系统每次都绕过缓存服务器
查询下游的数据库,缓存服务器完全失去了其应用的作用。

解决方案

1) 缓存空对象

当 MySQL 返回空对象时, Redis 将该对象缓存起来,同时为其设置一个过期时间。当用户再次发起相同请求时,就会从缓存中拿到一个空对象,用户的请求被阻断在了缓存层,从而保护了后端数库,最长不超过五分钟。

2) 布隆过滤器

布隆过滤器判定不存在的数据,那么该数据一定不存在,利用它的这一特点可以防止缓存穿透。

首先将用户可能会访问的热点数据存储在布隆过滤器中(也称缓存预热),当有一个用户请求到来时会先经过布隆过滤器,如果请求的数据,布隆过滤器中不存在,那么该请求将直接被拒绝,否则将继续执行查询。相较于第一种方法,用布隆过滤器方法更为高效、实用。其流程示意图如下:

缓存预热:是指系统启动时,提前将相关的数据加载到 Redis 缓存系统中。这样避免了用户请求的时再去加载数据。

缓存击穿

key 对应的数据库数据存在,但在 redis 中过期,此时若有大量并发请求过来,这些请求发现缓存过期,一般都会从后端数据库加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端数据库压垮。

解决方案

1)定时更新

在缓存处理上,同理,比如某一个热点数据的过期时间是1小时,那么每59分钟,通过定时任务去更新这个热点
key,并重新设置其过期时间。

2) 分布式锁

采用分布式锁的方法,重新设计缓存的使用方式,过程如下:

  • 上锁:当我们通过 key去查询数据时,首先查询缓存,如果没有,就通过分布式锁进行加锁,第一个获取锁的进程进入后端数据库查询,并将查询结果缓到Redis中。
  • 解锁:当其他进程发现锁被某个进程占用时,就进入等待状态,直至解锁后,其余进程再依次访问被缓存的 key。

缓存雪崩

缓存雪崩是指当大量缓存同时过期或缓存服务宕机,所有请求的都直接访问数据库,造成数据库高负载,影响性
能,甚至数据库宕机。

解决方案

1)将缓存失效时间分散开

比如可以在原有的失效时间基础上增加一个随机值,比如 1-5 分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

2)集群

类以的,在缓存雪崩问题防治上面,一个比较典型的技术就是采用集群方式部署,使用集群可以避免服务单点故
障。

16、如何保证缓存与数据库的数据一致性

17、什么是主从复制

一个主机多个从机,有 master 主机可执行写命令,其他 salve 从机只能只能执行读命令,这种读写分离的模式可以大大减轻 Redis 主机的数据读取压力,Redis 主机会一直将自己的数据复制给 Redis 从机,从而实现主从同步。在这个过程中,不但提高了Redis 的效率,并同时提供了多个数据备份。

主从复制原理

在 Redis的主从复制实现中,包含两个类似阶段:全量数据同步增量数据同步

  1. Slave 从服务器启动成功连接到 Master 后会发送一个 sync 命令主动进行数据同步, Master 主服务器接到命令后先进行数据的持久化,然后把持久化的文件发送给 Slave,拿到持久化文件后进行读取完成数据同步,此时称为全量复制,只要是重新连接 Master,全量复制将被自动执行。
  2. Master 继续将新的所有收集到的修改命令依次传给 Slave,完成同步,此时称为增量复制

为什么主从全量复制使用RDB而不是AOF

  • RDB文件存储的内容是经过压缩的二进制数据,文件很小。AOF文件存储的是每一次写命令通常会必RDB文件大很多。因此,传输RDB文件更节省带宽,速度也更快。
  • 使用RDB文件恢复数据,直接解析还原数据即可,不需要一条一条地执行命令,速度非常快。而AOF则需
    要依次执行每个写命令,速度非常慢。也就是说,与AOF相比,恢复大数据集的时候,RDB速度更快。

主从复制方案有什么痛点

  1. 主从复制方案下,master 发生宕机的话可以手动将某一台 slave 升级为master,Redis服务可用性提高。整个过程需要人工干预。人工干预大大增加了问题的处理时间以及出错的可能性。(解决方案 Redis Sentinel)
  2. 主从复制方案在高并发场景下能力有限。如果缓存的数据量太大或者并发量要求太高,主从复制就没办法满
    足我们的要求了。(解决 Redis Cluster)

18、什么是哨兵模式

在 Redis 主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,同时数据安全性也得不到保障,因此主从模式的可用性较低,不适用于线上生产环境。

Redis 官方推荐一种高可用方案,也就是 Redis Sentinel 哨兵模式,它弥补了主从模式的不足。Sentinel 通过监控的方式获取主机的工作状态是否正常,当主机发生故障时, Sentinel 会自动进行 Failover(即故障转移),并将其监控的从机提升主服务器(master),从而保证了系统的高可用性


Redis 的哨兵有什么功能

  1. 集群监控,监控所有redis节点(包括sentinel节点自身)的状态是否正常。
  2. 故障转移,如果 Master node 挂掉了,会自动转移到 Slave node 上,确保整个Redis系统的可用性。
  3. 消息通知,通知 slave 新的 master 连接信息,让它们执行 replicaof 成为新的 master 的 slave。.
  4. 配置提供,如果故障转移发生了,通知 Client 客户端新的 Master 地址。

Sentinel 如何检测节点是否下线

  1. 主观下线:sentinel节点认为某个Redis节点已经下线了(主观下线),但还不是很确定,需要其他sentinel节点的投票。
  2. 客观下线:法定数量(通常为过半)的sentinel节点认定某个Redis节点已经下线(客观下线),那它就算是真的下线了。

也就是说,主观下线当前的sentinel自己认为节点宕机,客观下线是sentinel整体达成一致认为节点宕机。

默认情况下,Sentinel哨兵会以每秒一次的频率向所有与它创建命令连接的实例(包括主服务器、从服务器、其他Sentinel)发送PING命令,并通过实例返回的PING命令回复来判断实例是否在线。

如果对应的节点超过规定的时间没有进行有效回复的话,就会被其认定为是主观下线(SDOWN)。注意!这里的有效回复不一定是PONG,可以是 -LOADING 或者 -MASTERDOWN。

如果被认定为主观下线的是 slave 的话,sentinel 不会做什么事情,slave下线对Redis集群的影响不大,Redis集群对外正常提供服务。但如果是master被认定为主观下线就不一样了,sentinel 整体还要对其进行进一步核实,确保 master 是真的下线了。

所有 sentinel 节点要以每秒一次的频率确认 master 的确下线了,当法定数量(通常为过半)的 sentinel 节点认定 master 已经下线,master才被判定为客观下线(ODOWN)。这样做的目的是为了防止误判,毕竟故障转移的开销还是比较大的,这也是为什么Redis官方推荐部署多个sentinel节点(哨兵集群)。

随后,sentinel 中会有一个 Leader 的角色来负责故障转移,也就是自动地从 slave 中选出一个新的 master 并执行完相关的一些工作(比如通知slave新的master连接信息,让它们执行replicaof成为新的master的slave)。

如果没有足够数量的 sentinel 节点认定 master 已经下线的话,当 master 能对 sentinel 的PlNG命令进行有效回复之后,master也就不再被认定为主观下线,回归正常。

如何从 Sentinel 集群中选择出 Leader

大部分共识算法都是基于 Paxos 算法改进而来,在 sentinel 选举 leader 这个场景下使用的是 Raft 算法

Sentinel 如何选择出新的 master

故障恢复是指主机down掉需要从机来替代它工作,故障恢复选择条件依次为

  1. 选择优先级靠前的(优先级:在 redis.conf 中默认 slave-priority 100,值越小优先级越高)。
  2. 优先级相同时,选择偏移量最大的(偏移量:指从机获得主机数据最全的概率)。
  3. 偏移量也相同时候,选择runid最小的(runid:每个 redis 实例启动后都会随机生成一个 40 位的 runid)。

19、Redis Cluster 用来解决什么问题

  1. 解决容量问题,一台服务器使用的容量是有限的,可以用集群进行扩容。
  2. 解决并发写问题,并发的请求由一台服务器压力很,可以用集群多台处理分担压力。
  3. 无中心化配置相对简单,从哪个节点都可以进入,节点不能处理会分配给其他节点进行处理。

20、如何使用 Redis 实现分布式限流

基于Redis的令牌桶算法

if ( redisTemplate.opsForList().leftPop("limit_list") != null) {System.out.println(1);
}

定时

if (redisTemplate.opsForList().size("limit_list") < 10) {redisTemplate.opsForList().rightPush("limit_list", UUID.randomUUID().toString());
}

21、如何使用 Redis 实现消息队列

Redis 的 list (列表) 数据结构常用来作为异步消息队列使用,使用 rpush/lpush 操作入队列,使用 lpop 和 rpop 来出队列。rpush 和 lpop 结合 或者 lpush 和 rpop 结合。


客户端是通过队列的 pop 操作来获取消息,然后进行处理。处理完了再接着获取消息,再进行处理。如此循环往复,这便是作为队列消费者的客户端的生命周期。

22、假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,全部找出来

使用 keys 指令可以扫出指定模式的 key 列表。但是Redis 的单线程的。keys 指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用 scan 指令,scan 指令可以无阻塞的提取出指定模式的 key 列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用 keys 指令长。

SCAN 0 遍历返回结果,使用 MATCH 参数匹配前缀

23、对 Redis 进行性能优化,有些什么建议

  • Master 最好不要做任何持久化工作,如 RDB 内存快照和 AOF 日志文件。
  • 尽量避免在压力很大的主库上增加过多的从库。
  • Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave 和 Master 最好在同一个局域网内。

24、Redis 什么时候需要序列化?Redis 序列化方式有哪些

Redis 在进行数据持久化(RDB 和 AOF)以及进行数据传输时都需要对数据进行序列化和反序列化。因此,一般来说,在使用 Redis 存储对象类型的数据时,需要进行序列化操作。

Redis 支持多种数据格式的序列化,包括以下几种:

  • String 序列化:Redis 使用二进制安全协议,因此可以直接将 Java 对象序列化成二进制形式存储在 Redis 的 String 数据结构中,常用的序列化方式包括 JDK 自带的序列化方式、Kryo 等。
  • JSON 序列化:JSON 是一种轻量级的数据交换格式,易于理解和生成,Redis 可以使用各种 JSON 库(如 Jackson、Gson 等)将 Java 对象序列化为 JSON 字符串后存储在 Redis 中。
  • XML 序列化:XML 也是一种通用的数据格式,Redis 可以使用 JAXP 标准库或者其他第三方库(如 XStream 等)将 Java 对象序列化为 XML 字符串后存储在 Redis 中。
  • Protobuf 序列化:Protobuf 是 Google 开发的一种高效的二进制序列化库,可以将 Java 对象序列化为紧凑的二进制格式,并支持跨语言的数据传输和兼容性。

在选择序列化方式时,需要考虑序列化效率、数据大小、可读性、兼容性等因素。同时,也需要注意在进行序列化和反序列化时可能会出现的异常和安全问题。

25、什么是Redis的数据分片

Redis的数据分片是一种将一个Redis数据集分割成多个部分,分别存储在不同的Redis节点上的技术。它可以用于将一个单独的Redis数据库扩展到多个物理机器上,从而提高Redis集群的性能和可扩展性。

在Redis的Cluster集群模式中,使用哈希槽的方式来进行数据分片

一个 Redis 集群包含 16384 个插槽(hash slot),数据库中的每个键都属于这 16384 个插槽的其中一个。集群使用公式 CRC16 (key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16 (key) 语句用于计算键 key 的 CRC16 校验和 。

集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:

  • 节点 A 负责处理 0 号至 5460 号插槽。
  • 节点 B 负责处理 5461 号至 10922 号插槽。
  • 节点 C 负责处理 10923 号至 16383 号插槽。

其实作用就是将我们 set 的 key 通过计算平均分配到不同的主机上。

做一个举例:

在集权部署下,使用 set key yang 增加 key 值,他会返回

127.0.0.1:6379>set key yang
Redirected to slot [12706]located at 192.168.44.168:6381

这个 12706 就是用来确定 这个 key 应该存在的节点,因为每个节点的范围不一样,这样这个数据就由节点 C 处理了,这也是无中心化集集群的一个特点,不管从哪里进入,如果不能处理会提交给其他节点,就像是这个例子12706 的插槽是在6379主机执行的,但是它范围是0 号至 5460 号插是不能够处理,它就会分配给到 B,B不能处理就给C。

用批量入值会有什么问题?举例:

192.168.44.168:6379>mset name lucy age 20 address china
(error)CROSSSLOT Keys in request don't hash to the same slot

但是我就想加入多个值我们应该加入组才行,让它们归属到一个组就行了:

192.168.44.168:6379>mset name{user} lucy age{user} 20

为什么是 16384 呢?

16384 是 Redis 中哈希槽数量的默认值,这个数字并没有什么特殊的含义,而是一个经验值。

26、分布式锁

【Redis】面试题总结相关推荐

  1. 110道 Redis面试题及答案(最新整理)

    最新Redis面试题及答案[附答案解析]Redis面试题及答案,Redis最新面试题及答案,Redis面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的.这些答案难免会存 ...

  2. 史上最全Redis面试题及答案。

    花了大量时间整理了这套Redis面试题 首发50题,绝无仅有,从入门到精通 从基础,高级知识点,再到集群,运维,方案- 弄明白了这些题可以说可以成为面霸了 面试官都得折服,Redis学得怎么样,都来检 ...

  3. 10000字超全Redis面试题,再也不怕被问住了!

    Redis 在当今的计算机行业,可以说是使用的最为广泛的内存数据库,几乎所有的后端技术面试都会涉及到 Redis 相关的知识,正所谓知己知彼,百战百胜.小白今天精心整理的超全的 Redis 面试题,希 ...

  4. Web前端求职时都会被问到的Redis面试题分享

    Web前端人员怎么求职?Redis面试题有哪些?Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的 ...

  5. Redis面试题相关知识整理

    Redis面试题相关知识整理 1.Redis的应用场景 2.Redis的特点 3.Redis对各种数据类型的操作 4.Redis的持久化机制 5.Redis的缓存穿透/缓存击穿/缓存雪崩问题 6.Re ...

  6. 这几道 Redis 面试题都不懂,怎么拿 Offer?

    转载自  这几道 Redis 面试题都不懂,怎么拿 Offer? 缓存雪崩 缓存穿透 缓存与数据库双写一致 最后 随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点.而缓存的使用成为一个 ...

  7. 史上最全Redis面试题

    转载自 史上最全Redis面试题及答案. 1.什么是Redis? 2.Redis相比memcached有哪些优势? 3.Redis支持哪几种数据类型? 4.Redis主要消耗什么物理资源? 5.Red ...

  8. java redis 面试题_Java开发人员怎么面试 常见Redis面试题有哪些

    Java开发人员怎么面试?常见Redis面试题有哪些?Redis是目前各大企业都在使用的人们技术,也是企业选拔人才时考核的一个难题.有很多同学只是简单了解Redis的应用,但对于为什么要用Redis以 ...

  9. 史上最全Redis面试题(2020最新版)

    导读:2020 年最新版 68 道Redis面试题,两万字干货,整理分享至此,希望对大家有帮助!文末有PDF文档下载方式,可按需下载. 概述 1. 什么是Redis? Redis(Remote Dic ...

  10. Redis面试题及分布式集群

    Redis面试题及分布式集群 Reference: http://blog.csdn.net/yajlv/article/details/73467865 1. 使用Redis有哪些好处? (1) 速 ...

最新文章

  1. iOS系统 越狱系统还原(平刷)
  2. Python实现Newton和lagrange插值
  3. Scala入门到精通——第九节 继承与组合
  4. Java高并发编程详解系列-线程池原理自定义线程池
  5. 项目管理文档_项目管理和团队协同的轻量级工具——PMS,来了
  6. ftp 访问mysql6,RedHat6.5开启ftp访问已有目录方法
  7. clickhouse语句_Siem落地方案:初识clickhouse
  8. 自定义UINavigationController push和pop动画
  9. 信号与系统matlab实践实验二,信号与系统matlab实验课后习题答案
  10. QT 基于Libvlc的视频播放器
  11. Windows 注册表(Registry) 学习
  12. 如何把无限循环小数转换成分数形式
  13. java的datasource_JAVA创建DataSource
  14. TIA protal与SCL从入门到精通(4)——软件单元使用
  15. 基本概念学习(7002)---网络流量控制
  16. IDA Pro与x64dbg联动调试记录
  17. 学海无涯!腾讯、网易必问的20道题Android面试题,已拿offer入职
  18. vue与C#实现自定义表单审批流程构建-后端
  19. MATLAB绘图基础01—复杂网络工具箱命令
  20. 無襯線體(Sans-serif)

热门文章

  1. nCode:DesignLife案例教程十五
  2. 一起学时序分析之基础时序参数
  3. 使用swiper实现视频和图片混合轮播
  4. 《如何白手起家挣到一百万?》学习笔记
  5. 图片转文字在电脑上怎样转?
  6. MSYS2显著简化Kafka在windows C++下的使用门槛
  7. linux系统在云骑士上能下载吗,云骑士离线重装系统教程
  8. 装机大师如何用U盘重装原版win7系统
  9. h700整列卡直通配置_dell raid h700 perc h800阵列卡配置完全手册图解.doc
  10. 运营日记:App推广牢记的点