大数跨境
0
0

Spring Boot 结合 Redis客户端缓存技术让系统性能飙升

Spring Boot 结合 Redis客户端缓存技术让系统性能飙升 Spring全家桶实战案例
2024-10-13
0
导读:Spring Boot 结合 Redis客户端缓存技术让系统性能飙升

最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。

环境:Spring Boot3.2.5



1. 简介

在本篇文章中,我们将介绍关于Redis 的 Client-Side Caching(客户端缓存)技术。该技术是一种提高应用性能和减少数据库负载的技术。这项技术允许客户端在本地缓存从 Redis 服务器获取的数据,从而减少了对 Redis 服务器的直接请求次数,特别是在数据读取频繁而写入相对较少的情况下。

下图展示了从用户应用程序到应用程序服务器再到数据库的通信流程:

当你使用客户端缓存时,客户端库在从数据库中检索数据项的同时,会维护这些数据项的本地缓存。当需要再次访问相同的数据项时,客户端可以从缓存中满足读取请求,而无需访问数据库,如下图所示:

注:这Redis Client中加入了本地Cache,会先从该Cache获取数据

访问缓存比通过网络与数据库通信要快得多,而且还能减少网络流量。客户端缓存减少了数据库服务器的负载,因此可以使用更少的硬件资源运行缓存。

1.1 数据变化时更新缓存

所有缓存系统都必须实现一种方案,以便在主数据库中的相应数据发生变化时更新缓存中的数据。Redis采用了一种称为跟踪的方法。

当启用客户端缓存时,Redis服务器会记住或跟踪每个客户端连接之前读取的键集。这包括客户端直接使用GET命令等读取数据的情况,也包括服务器从存储的数据中计算值的情况,如STRLEN命令。当任何客户端向一个被跟踪的键写入新数据时,服务器会向之前访问过该键的所有客户端发送一个失效消息。这个消息会警告客户端,它们缓存的数据副本已无效,客户端会因此移除这些陈旧的数据。下次客户端从同一个键读取数据时,它会直接访问数据库,并用更新后的数据刷新其缓存。

如下序列图显示了两个客户端在访问和更新同一个key时可能发生的交互:

 
1.2 哪些命令可以缓存数据?

除了以下情况外,所有只读命令(具有@read ACL类别)都将使用缓存的数据:

  • 针对概率数据类型的任何命令。这些类型的设计就是为了频繁更新,这意味着缓存几乎没有好处或根本没有好处。

  • 非确定性命令,如HGETALL、HSCAN和ZRANDMEMBER。这些命令在设计上每次调用时都会给出不同的结果。

  • Redis查询引擎命令(以FT.*为前缀),如FT.SEARCH。

     

1.3 一个命令会缓存哪些数据?

广义上讲,在命令调用首次使用特定响应的数据后,该数据就会被缓存。该数据的子集或从中计算出的值会像往常一样从服务器检索,然后分别缓存。例如:

  • 通过GET命令检索的整个字符串会被添加到缓存中。而使用SUBSTR命令检索的同一字符串的部分数据,首次会在服务器上计算,然后会与原始字符串分开缓存。

  • 对字符串使用GETBIT或BITFIELD命令时,返回的值会与原始字符串分开缓存。

  • 对于通过key访问的复合数据类型(hash、json、set和sorted set),整个对象会与单个字段分开缓存。因此,JSON.GET mykey JSON.GETmykey.myfield的结果会在缓存中创建不同的条目。

  • lists、streams和sorted set 中的范围会与它们所属的对象分开缓存。同样,SINTER和SDIFF返回的子集也会创建单独的缓存条目。

  • 对于MGET等多键读取命令,键的顺序很重要。例如,MGET name:1 name:2会与MGET name:2 name:1分开缓存,因为服务器会按你指定的顺序返回值。

  • 从数据类型计算得出的布尔值或数值(例如SISMEMBER)和LLEN会与它们引用的对象分开缓存。

     

1.4 使用建议

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读38
粉丝0
内容832