Redis

    Redis 基础

1.什么是 Redis?(快,高并发,功能全)

是一个基于 C 语言开发的开源 NoSQL 数据库,Redis 的数据是保存在内存中的(内存数据库,支持持久化),因此读写速度非常快,被广泛应用于分布式缓存方向。并且,Redis 存储的是 KV 键值对数据。

2.Redis 为什么这么快?

  1. 基于内存的数据存储,内存的访问速度远超硬盘,这是 Redis 读写速度快的根本原因。
  2. 单线程模型,避免了线程切换和锁竞争带来的消耗。
  3. 高效的数据结构,(String)、(List)、(Set)、(Sorted Set)等
  4. IO 多路复⽤,该机制允许内核中同时存在多个监听套接字和已连接套接字,内核会一直监听这些套接字上的连接请求或者数据请求,一旦有请求到达,就会交给 Redis 处理,就实现了所谓的 Redis 单个线程处理多个 IO 读写的请求。

3.Redis 除了做缓存,还能做什么?

        1.分布式锁

        2.排行榜/计数器 :

                可以对 String 进行自增自减运算,从而实现计数器功能。Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。

        3.限流

        4.消息队列:Redis 自带的 List 数据结构可以作为一个简单的队列使用。

        5.延时队列

4.Redis 常用的数据类型

- string:字符串数据类型:String 更适合存储对象数据,尤其是当对象结构简单且整体读写是主要操作时。

  • 缓存功能
  • 计数
  • 共享 Session
  • 限速

- hash:类似于对象,map的形式:需要频繁操作对象的部分字段或节省内存,Hash 可能是更好的选择。

  • 缓存用户信息
  • 缓存对象

- list:表示一种线性数据结构,队列或栈

  • 消息队列
  • 文章列表

- set:无序不可重复集合:文章点赞、动态点赞等等。多个数据源交集、并集和差集的场景:共同好友(交集)、共同粉丝(交集)

  • 标签(tag)
  • 共同关注

- zset:有序不可重复集合

  • 用户点赞统计
  • 用户排序

Redis持久化机制详解

RDB(Redis DataBase)持久化和 AOF(Append Only File)持久化。这两种方式可以单独使用,也可以同时使用。

5.什么是 RDB 持久化?

持久化也就是将内存中的数据写入到硬盘中

RDB 持久化通过创建数据集的快照来工作,是 Redis 默认采用的持久化方式,在指定的时间间隔内将 Redis 在某一时刻的数据状态保存到磁盘的一个 RDB 文件中。Redis 提供了两个命令来生成 RDB 快照文件:

  • Save: 同步保存操作,会阻塞 Redis 主线程;
  • Bgsave: fork 出一个子进程,子进程执行,不会阻塞 Redis 主线程,默认选项。

6.什么是 AOF 持久化?

开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入到 AOF 缓冲区 server.aof_buf 中,然后再写入到 AOF 文件中(此时还在系统内核缓存区未同步到磁盘),最后再根据持久化方式( fsync策略)的配置来决定何时将系统内核缓存区的数据同步到硬盘中的。

7.RDB 和 AOF 各自有什么优缺点?

RDB 是一个非常紧凑的单文件(二进制文件 dump.rdb),代表了 Redis 在某个时间点上的数据快照。非常适合用于备份数据,比如在夜间进行备份,然后将 RDB 文件复制到远程服务器。但可能会丢失最后一次持久化后的数据。缺点是数据安全性较低。

AOF 的最大优点是灵活,实时性好,可以设置不同的 fsync 策略,如每秒同步一次,每次写入命令就同步,或者完全由操作系统来决定何时同步。但 AOF 文件往往比较大,恢复速度慢,因为它记录了每个写操作。

8.Redis 给缓存数据设置过期时间有什么用?

内存是有限且珍贵的,如果不对缓存数据设置过期时间,那内存占用就会一直增长,最终可能会导致 OOM 问题。通过设置合理的过期时间,Redis 会自动删除暂时不需要的数据,为新的缓存数据腾出空间。

9.Redis 是如何判断数据是否过期的呢?

Redis 通过一个叫做过期字典来保存数据过期的时间。过期字典的键指向 Redis 数据库中的某个 key,过期字典的值是一个 long long 的整数,这个整数保存了 key 所指向的数据库键的过期时间。


Redis 内存管理

10.Redis报内存不足怎么处理?

Redis 内存不足有这么几种处理方式:

  • 修改配置文件的 maxmemory 参数,增加 Redis 可用内存
  • 也可以通过命令 set maxmemory 动态设置内存上限
  • 修改内存淘汰策略,及时释放内存空间
  • 使用 Redis 集群模式,进行横向扩容。

11.大 key 问题了解吗?

大 key 指的是存储了大量数据的键,比如:

  • 单个简单的 key 存储的 value 很大,size 超过 10KB

hash,set,zset,list 中存储过多的元素(以万为单位)

        大 key 会造成什么问题呢?

  • 客户端耗时增加,甚至超时
  • 对大 key 进行 IO 操作时,会严重占用带宽和 CPU
  • 造成 Redis 集群中数据倾斜
  • 主动删除、被动删等,可能会导致阻塞
                如何处理大 key?

                        ①、删除大 key

                        ②、压缩和拆分 key

12.Redis 阻塞?怎么解决?

API 或数据结构使用不合理:慢查询

  1. 发现慢查询: slowlog get{n}命令可以获取最近 的 n 条慢查询命令;
  2. 发现慢查询后,可以从两个方向去优化慢查询: 1)修改为低算法复杂度的命令,如 hgetall 改为 hmget 等,禁用 keys、sort 等命 令 2)调整大对象:缩减大对象数据或把大对象拆分为多个小对象,防止一次命令操作过多的数据。

CPU 饱和的问题:CPU 饱和是指 Redis 单核 CPU 使用率跑到接近 100%。

  1. 判断当前 Redis 并发量是否已经达到极限,可以使用统计命令 redis-cli-h{ip}-p{port}--stat 获取当前 Redis 使用情况
  2. 如果 Redis 的请求几万+,那么大概就是 Redis 的 OPS 已经到了极限,应该做集群化水品扩展来分摊 OPS 压力
  3. 如果只有几百几千,那么就得排查命令和内存的使用

持久化相关的阻塞

13. Redis的过期键的删除策略

过期策略通常有以下三种:
        定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可 以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响 缓存的响应时间和吞吐量。
        惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化 地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而 不会被清除,占用大量内存。
        定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。Redis中同时使用了惰性过期和定期过期两种过期策略。

14. Redis key的过期时间和永久有效分别怎么设置?

expire和persist命令。

15. 我们知道通过expire来设置key 的过期时间,那么对过期的数据怎么处理呢?

1、定时去清理过期的缓存;
2、当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。
两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,大家可以根据自己的应用场景来权衡。

16. MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都 是热点数据

redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

17. Redis的内存淘汰策略有哪些

Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。

全局的键空间选择性移除

        noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。

        allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这

个是最常用的)

        allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。设置过期时间的键空间选择性移除

        volatile-lru(最近最少使用):当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。

        volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。

        volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

总结

        Redis的内存淘汰策略的选取并不会影响过期的key的处理。内存淘汰策略用于处理内存不足时的需要申请额外空间的数据;过期策略用于处理过期的缓存数据。

18. Redis主要消耗什么物理资源?

内存。

19. Redis的内存用完了会发生什么?

如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可

以配置内存淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。

20. Redis如何做内存优化?

        可以好好利用Hash,list,sorted set,set等集合类型数据,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起。尽可能使用散列表(hashes),散列表里面存储的数 使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的 web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应 该把这个用户的所有信息存储到一张散列表里面


21. Redis线程模型

        Redis 基于 Reactor 模式设计开发了一套高效的事件处理模型

22.既然是单线程,那怎么监听大量的客户端连接呢?

        I/O 多路复用技术的使用让 Redis 不需要额外创建多余的线程来监听客户端的大量连接,降低了资源的消耗

文件事件处理器(file event handler)主要是包含 4 个部分:

  • 多个 socket(客户端连接)
  • IO 多路复用程序(支持多个客户端连接的关键)
  • 文件事件分派器(将 socket 关联到相应的事件处理器)
  • 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

23.为什么不使用多线程

  1. 使用单线程模型能带来更好的可维护性,方便开发和调试;
  2. 使用单线程模型也能并发的处理客户端的请求;
  3. Redis 服务中运行的绝大多数操作的性能瓶颈都不是 CPU,主要在内存和网络

事务

24.Redis事务的概念

        Redis事务功能是通过MULTI开始、EXEC执行、DISCARD取消和WATCH 监听四个原语实现的。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,

25.Redis 事务支持原子性吗?

        Redis 事务在运行错误的情况下,除了执行过程中出现错误的命令外,其他命令都能正常执行。并且,Redis 事务是不支持回滚操作的。因此,Redis 事务其实是不满足原子性的。

26.Redis事务支持隔离性吗

Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完

所有事务队列中的命令为止。因此,Redis 的事务是总是带有隔离性的。


高可用

Redis 除了单机部署外,还可以通过主从复制、哨兵模式和集群模式来实现高可用。

主从复制(Master-Slave Replication):允许一个 Redis 服务器(主节点)将数据复制到一个或多个 Redis 服务器(从节点)。这种方式可以实现读写分离,适合读多写少的场景。

哨兵模式(Sentinel):用于监控主节点和从节点的状态,实现自动故障转移和系统消息通知。如果主节点发生故障,哨兵可以自动将一个从节点升级为新的主节点,保证系统的可用性。

集群模式(Cluster):Redis 集群通过分片的方式存储数据,每个节点存储数据的一部分,用户请求可以并行处理。集群模式支持自动分区、故障转移,并且可以在不停机的情况下进行节点增加或删除。

28.主从复制了解吗

主从复制(Master-Slave Replication)是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点(master),后者称为从节点(slave)。且数据的复制是单向的,只能由主节点到从节点。主负责写,节点负责读

29.主从复制主要的作用是什么?

①、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

②、故障恢复:如果主节点挂掉了,可以将一个从节点提升为主节点,从而实现故障的快速恢复。

③、负载均衡:主节点提供写服务,由从节点提供读服务,尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高 Redis 服务器的并发量。

④、高可用基石:主从复制还是哨兵和集群能够实施的 基础

30.Redis 主从有几种常见的拓扑结构?

1.一主一从结构

2.一主多从结构

3.树状主从结构

31.Redis 的主从复制原理了解吗?

  1. 保存主节点        (master)信息 这一步只是保存主节点信息,保存主节点的 ip 和 port。
  2. 主从建立连接       从节点(slave)发现新的主节点后,会尝试和主节点建立网络连接。
  3. 发送 ping 命令    连接建立成功后从节点发送 ping 请求进行首次通信,主要是检测主从之间网络套接字是否可用、主节点当前是否可接受处理命令。
  4. 权限验证              如果主节点要求密码验证,从节点必须正确的密码才能通过验证。
  5. 同步数据集          主从复制连接正常通信后,主节点会把持有的数据全部发送给从节点。
  6. 命令持续复制      接下来主节点会持续地把写命令发送给从节点,保证主从数据一致性。

32.主从复制存在哪些问题呢?

主从复制虽好,但也存在一些问题:

  • 一旦主节点出现故障,需要手动将一个从节点晋升为主节点,同时需要修改应用方的主节点地址,还需要命令其他从节点去复制新的主节点,整个过程都需要人工干预。
  • 主节点的写能力受到单机的限制。
  • 主节点的存储能力受到单机的限制。

33.Redis 哨兵了解吗?sentinel

用于监控 Redis 的主从复制,以自动完成故障转移和通知管理员。

34.哨兵的主要功能:

  • 监控(Monitoring): 哨兵 Sentinel 会不断检查主节点和从节点是否正常工作。

  • 通知(Notification): Sentinel 可以向管理员或其他应用程序发送通知,告知 Redis 实例的状态变化。

  • 自动故障转移(Automatic failover):当 Sentinel 检测到主节点不可用时,会自动将一个从节点提升为新的主节点,并让其他从节点开始复制新的主节点。

  • 配置提供者(Configuration provider):如果故障转移发生了,通知 client 客户端新的 master 地址。

35.Redis 哨兵实现原理知道吗?

1.定时监控

2.主观下线和客观下线:主观下线就是哨兵节点认为某个节点有问题,客观下线就是超过一定数量的哨兵节点认为主节点有问题。

3.领导者 Sentinel 节点选举:Redis 使用了 Raft 算法实现领导者选举。

4.故障转移:领导者选举出的 Sentinel 节点负责故障转移

36.哨兵的核心知识

        1.哨兵至少需要 3 个实例,来保证自己的健壮性。

        2.哨兵 + redis 主从的部署架构,是不保证数据零丢失的,只能保证 redis 集群的高可用性。

        3.对于哨兵 + redis 主从这种复杂的部署架构,尽量在测试环境和生产环境,都进行充足的测试和演练。

37.Sentinel 如何选择出新的 master(选举机制)?

  • ①、每个在线的 Sentinel 节点都有资格成为领导者,当它确认主节点下线时候,会向其他哨兵节点发送命令,表明希望由自己来执行主从切换,并让所有其他哨兵进行投票。

    这个投票过程称为“Leader 选举”。候选者会给自己先投 1 票,然后向其他 Sentinel 节点发送投票的请求。

    ②、收到请求的 Sentinel 节点会进行判断,如果候选者的日志与自己的日志一样新,任期号也小于自己,且之前没有投票过,就会同意投票,回复 Y。否则回复 N。

    ③、候选者收到投票后会统计支持自己的得票数,如果候选者获得了集群中超过半数节点的投票支持(即多数原则),它将成为新的主节点。

    新的主节点在确立后,会向其他从节点发送心跳信号,告诉它们自己已经成为主节点,并将其他节点的状态重置为从节点。

    ④、如果多个节点同时成为候选者,并且都有可能获得足够的票数,这种情况下可能会出现选票分裂。也就是没有候选者获得超过半数的选票,那么这次选举就会失败,所有候选者都会再次发起选举。

38.新的主节点是怎么选举的

  1. 过滤:“不健康”(主观下线、断线)、5 秒内没有回复过 Sentinel 节 点 ping 响应、与主节点失联超过 down-after-milliseconds*10 秒。
  2. 选择 slave-priority(从节点优先级)最高的从节点列表,如果存在则返回,不存在则继续。
  3. 选择复制偏移量最大的从节点(复制的最完整),如果存在则返回,不存在则继续。
  4. 选择 runid 最小的从节点。

38.Redis 集群了解吗?

        前面说到了主从存在高可用和分布式的问题,哨兵解决了高可用的问题,而集群就是终极方案,一举解决高可用和分布式问题。

  1. 数据分区: 数据分区 (或称数据分片) 是集群最核心的功能。集群将数据分散到多个节点,一方面 突破了 Redis 单机内存大小的限制,存储容量大大增加另一方面 每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力

  2. 高可用: 集群支持主从复制和主节点的 自动故障转移 (与哨兵类似),当任一节点发生故障时,集群仍然可以对外提供服务。

39.为什么需要Redis Cluster?解决了什么问题?

  • 数据存储容量和内存限制问题

    单个Redis实例的内存是有限的,如果数据量不断增长,最终会超出单个实例的内存容量。Redis Cluster通过将数据分片存储在多个节点上,解决了数据存储容量的限制问题。
  • 高可用性和容错性问题

    单一的Redis节点存在单点故障风险,如果该节点出现故障,可能导致整个服务不可用。Redis Cluster通过多个节点组成集群,当部分节点出现故障时,其他节点仍然可以提供服务,提高了系统的高可用性和容错性。

40.有什么优势?

  • 可扩展性:可以方便地添加或删除节点来扩展或收缩集群规模,以适应不同的数据量和负载需求。

  • 高可用性:部分节点故障不会影响整个集群的正常运行,提供了更好的容错能力。

  • 负载均衡:数据均匀地分布在各个节点上,避免了单个节点数据过载的情况。

  • 数据分片:在Cluster模式下,Redis集群可以将数据分散在不同的节点上,从而突破单节点内存限制,实现更大规模的数据存储。

41.Redis Cluster是如何分片的?

  • Redis Cluster使用哈希槽(Hash Slot)来进行分片。

  • 整个哈希空间被划分为16384个哈希槽(0 - 16384)。

  • 当向Redis Cluster中插入一个键(key)时,通过对键进行CRC16算法计算,然后对16384取模,得到该键对应的哈希槽编号,从而确定该键应该存储在哪个节点上。

42.为什么Redis Cluster的哈希槽是16384 (2^15)个?

(1)如果槽位为65536,发送心跳信息的消息头达8k,发送的心跳包过于庞大。

(2)redis的集群主节点数量基本不可能超过1000个。

43.能说说 Redis 集群的原理吗?

Redis 集群通过数据分区来实现数据的分布式存储,通过自动故障转移实现高可用。


缓存

44.缓存穿透

缓存穿透是指查询不存在的数据,由于缓存没有命中,请求每次都会穿过缓存去查询数据库。如果这种查询非常频繁,就会给数据库造成很大的压力。

        解决办法:

①、缓存空值/默认值

在数据库无法命中之后,把一个空对象或者默认值保存到缓存,之后再访问这个数据,就会从缓存中获取,这样就保护了数据库。针对这类数据设置一个较短的过期时间,让其自动剔除。

②、布隆过滤器

除了缓存空对象,我们还可以在存储和缓存之前,加一个布隆过滤器,做一层过滤。

布隆过滤器里会保存数据是否存在,如果判断数据不存在,直接返回请求参数错误信息给客户端,就不会访问存储。

        Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1(代表 false 或者 true),这也是 Bloom Filter 节省内存的核心所在。

45.缓存击穿

缓存击穿是指某一个或少数几个数据被高频访问,当这些数据在缓存中过期的那一刻,大量请求就会直接到达数据库,导致数据库瞬间压力过大。

        解决⽅案:

①、加锁更新,⽐如请求查询 A,发现缓存中没有,对 A 这个 key 加锁,同时去数据库查询数据,写⼊缓存,再返回给⽤户,这样后⾯的请求就可以从缓存中拿到数据了。

②、将过期时间组合写在 value 中,通过异步的⽅式不断的刷新过期时间,防⽌此类现象。

46.缓存雪崩

缓存在同一时间大面积的失效,导致大量的请求都直接落到了数据库上,对数据库造成了巨大的压力。

针对大量缓存同时失效的情况:

  1. 设置随机失效时间(可选):为缓存设置随机的失效时间,这样可以避免大量缓存同时到期,从而减少缓存雪崩的风险。

  2. 提前预热(推荐):针对热点数据提前预热,将其存入缓存中并设置合理的过期时间。

  3. 持久缓存策略(看情况):虽然一般不推荐设置缓存永不过期,但对于某些关键性和变化不频繁的数据,可以考虑这种策略。

  4. 提高缓存可用性,可以利用 Redis Cluster。

  5. 限流和降级,控制访问流量,防止在缓存失效时数据库被打垮。;

47.能说说布隆过滤器吗?

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于快速检查一个元素是否存在于一个集合中。

布隆过滤器由一个长度为 m 的位数组和 k 个哈希函数组成。

  • 开始时,布隆过滤器的每个位都被设置为 0。
  • 当一个元素被添加到过滤器中时,它会被 k 个哈希函数分别计算得到 k 个位置,然后将位数组中对应的位设置为 1。
  • 当检查一个元素是否存在于过滤器中时,同样使用 k 个哈希函数计算位置,如果任一位置的位为 0,则该元素肯定不在过滤器中;如果所有位置的位都为 1,则该元素可能在过滤器中。

48.缓存预热如何实现?

常见的缓存预热方式有两种:

使用定时任务,来定时触发缓存预热的逻辑,将数据库中的热点数据查询出来并存入缓存中。

使用消息队列,来异步地进行缓存预热,将数据库中的热点数据的主键或者 ID 发送到消息队列中,然后由缓存服务消费消息队列中的数据,根据主键或者 ID 查询数据库并更新缓存。

49.如何保证缓存和数据库的数据⼀致性?

  1. 先更新数据库,再删除缓存(推荐)
    • 优点
      • 这种策略是相对最优的选择。在更新数据库成功后,删除缓存,即使删除缓存失败,下一次读取数据时,由于缓存中的数据是旧数据,会从数据库中获取最新数据更新缓存。例如在内容管理系统中,文章内容的更新采用这种方式,可以较好地保证内容数据在缓存和数据库中的一致性。
    • 缺点
      • 可能会出现缓存穿透的问题。如果在高并发场景下,大量请求同时访问不存在于缓存中的数据(因为缓存刚刚被删除),这些请求会直接穿透到数据库,可能会对数据库造成较大的压力。

50.那假如是先删除缓存,再更新数据库,就会造成这样的情况:

缓存中不存在,数据库又没有完成更新,此时有请求进来读取数据,并写入到缓存,那么在更新完缓存后,缓存中这个 key 就成了一个脏数据。

51.那假如对一致性要求很高,该怎么办呢?

缓存和数据库数据不一致的原因,常见的有两种:

  • 缓存删除失败

  • 并发导致写入了脏数据

①、引入消息队列保证缓存被删除

使用消息队列保证数据库更新和缓存更新之间的最终一致性。当数据库更新完成后,将更新事件发送到消息队列。有专门的服务监听这些事件并负责更新或删除缓存。

②、数据库订阅+消息队列保证缓存被删除

可以专门起一个服务去监听 MySQL 的 binlog,获取需要操作的数据。然后用一个公共的服务获取订阅程序传来的信息,进行缓存删除。

③、延时双删防止脏数据

简单说,就是在第一次删除缓存之后,过一段时间之后,再次删除缓存。

主要针对缓存不存在,但写入了脏数据的情况。在先删缓存,再写数据库的更新策略下发生的比较多。

52.热key

就是指在很短时间内被频繁访问的键。

①、把热 key 打散到不同的服务器,降低压⼒。

②、加⼊⼆级缓存,当出现热 Key 后,把热 Key 加载到 JVM 中,后续针对这些热 Key 的请求,直接从 JVM 中读取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值