使用 Spring Boot 的 @Cacheable 注解与 Jedis 集成

使用 spring boot 的 @cacheable 注解与 jedis 集成

本文介绍了如何在已使用 Jedis 作为快速存储的 Spring Boot 应用中,配置并使用 Spring 的 @Cacheable 注解。通过配置 RedisCacheManager 和 JedisConnectionFactory,可以利用 Jedis 实现自定义缓存,并与 @Cacheable 注解无缝集成。

在 Spring Boot 项目中,我们经常使用 @Cacheable 注解来提升应用性能,减少对数据库或其他服务的重复调用。 然而,当项目中已经配置了 Jedis 作为快速存储时,如何将 @Cacheable 注解与 Jedis 集成,实现自定义的缓存管理,就成为一个需要解决的问题。

虽然 Spring 框架并没有直接提供 JedisCacheManager,但我们可以通过配置 RedisCacheManager 和 JedisConnectionFactory 来实现类似的功能。 实际上,RedisCacheManager 可以与任何实现了 RedisConnectionFactory 接口的连接工厂一起使用,而 JedisConnectionFactory 正是其中一种实现。

配置 JedisConnectionFactory

首先,我们需要配置 JedisConnectionFactory,它负责建立与 Jedis 服务器的连接。 以下是一个配置 JedisConnectionFactory 的示例代码:

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisStandaloneConfiguration;import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;@Configurationpublic class RedisConfig {    @Bean    public JedisConnectionFactory jedisConnectionFactory() {        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("your_redis_host", 6379); // 替换为你的 Redis 主机和端口        JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder().usePooling().build(); // 使用连接池        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);        return jedisConnectionFactory;    }    @Bean    public RedisTemplate redisTemplate() {        RedisTemplate template = new RedisTemplate();        template.setConnectionFactory(jedisConnectionFactory());        return template;    }}

在这个例子中:

RedisStandaloneConfiguration 用于配置连接到单个 Redis 节点的信息,例如主机名和端口。 请根据你的实际 Redis 配置进行修改。JedisClientConfiguration 用于配置 Jedis 客户端的行为,例如是否使用连接池。 使用连接池可以提高性能。JedisConnectionFactory 使用上述配置创建 Jedis 连接工厂。RedisTemplate 需要设置连接工厂为上面创建的jedisConnectionFactory

配置 RedisCacheManager

接下来,我们需要配置 RedisCacheManager,它负责管理缓存。 以下是一个配置 RedisCacheManager 的示例代码:

import org.springframework.cache.CacheManager;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheConfiguration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.RedisSerializationContext;import java.time.Duration;@Configurationpublic class CacheConfig {    @Bean    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()                .entryTtl(Duration.ofMinutes(10)) // 设置缓存过期时间为 10 分钟                .disableCachingNullValues() // 禁止缓存 null 值                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); // 使用 JSON 序列化        return RedisCacheManager.builder(redisConnectionFactory)                .cacheDefaults(cacheConfiguration)                .build();    }}

在这个例子中:

RedisCacheConfiguration 用于配置缓存的行为,例如过期时间、是否缓存 null 值以及序列化方式。RedisCacheManager 使用上述配置和 RedisConnectionFactory 创建缓存管理器。

使用 @Cacheable 注解

完成上述配置后,我们就可以在 Spring Boot 应用中使用 @Cacheable 注解了。 例如:

import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;@Servicepublic class MyService {    @Cacheable(value = "myCache", key = "#id")    public String getData(String id) {        // 模拟从数据库或其他服务获取数据        System.out.println("Fetching data from source for id: " + id);        return "Data for id: " + id;    }}

在这个例子中:

@Cacheable(value = “myCache”, key = “#id”) 表示将 getData 方法的返回值缓存到名为 “myCache” 的缓存中,缓存的 key 是方法参数 id。

注意事项

确保你的 Spring Boot 项目已经引入了必要的依赖,包括 spring-boot-starter-data-redis 和 jedis。根据你的实际 Redis 配置,修改 RedisStandaloneConfiguration 中的主机名和端口。根据你的需求,调整 RedisCacheConfiguration 中的缓存过期时间和其他配置。建议使用连接池来提高 Jedis 的性能。考虑使用合适的序列化方式,例如 JSON 序列化,以便缓存复杂对象。

总结

通过配置 RedisCacheManager 和 JedisConnectionFactory,我们可以轻松地将 Spring 的 @Cacheable 注解与 Jedis 集成,实现自定义的缓存管理。 这种方法不仅可以利用 Jedis 的高性能,还可以充分利用 Spring 框架的缓存抽象,提高应用性能。

以上就是使用 Spring Boot 的 @Cacheable 注解与 Jedis 集成的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/119050.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月25日 15:03:31
下一篇 2025年11月25日 15:08:51

相关推荐

  • c++怎么解析命令行选项getopt_c++命令行选项解析方法

    getopt是C++中解析命令行短选项的经典方法,通过中的getopt函数处理如-v、-f filename等形式的参数,配合optstring定义选项规则,循环解析后可获取选项及对应值;支持长选项需使用中的getopt_long,并定义option结构数组;跨平台项目可选Boost.Program…

    2025年12月19日
    000
  • c++怎么判断操作系统是Windows还是Linux_c++操作系统判断方法

    答案是使用预定义宏判断操作系统,如_WIN32表示Windows,__linux__表示Linux,__APPLE__表示苹果系统,编译器会自动定义这些宏,无需额外配置,通过条件编译即可实现跨平台识别。 在C++中判断操作系统是Windows还是Linux,通常通过预定义宏来实现。不同的编译器在不同…

    2025年12月19日
    000
  • c++怎么处理TCP粘包问题_c++ TCP粘包处理方法

    答案是通过应用层协议定义数据边界来解决TCP粘包问题,常用方法包括:1. 固定长度消息,实现简单但浪费带宽;2. 特殊分隔符,适用于文本协议但需转义避免冲突;3. 带长度前缀的消息头,最高效通用,先读长度再读数据体,支持二进制;4. 使用接收缓冲区管理数据拼接与解析,配合非阻塞IO提升性能。推荐长度…

    2025年12月19日
    000
  • c++怎么实现Base64编码和解码_c++ Base64编码解码方法

    C++中通过查表法和位操作实现Base64编码解码,每3字节转为4字符,不足补0并用’=’填充,使用标准字符表完成映射,代码轻量无依赖。 在C++中实现Base64编码和解码,可以通过查表法结合位操作来完成。不需要依赖第三方库,代码轻量且易于集成到项目中。 Base64 编码…

    2025年12月19日
    000
  • C++如何将程序打包成单个可执行文件_C++ 可执行文件打包方法

    通过静态链接和资源嵌入可将C++程序打包为单个可执行文件。首先在Visual Studio中设置运行时库为/MT或/MTd,或使用MinGW的-static参数,实现C运行时库静态链接,避免依赖msvcp140.dll等系统DLL。接着将图片、配置等资源文件用xxd -i转换为C数组形式嵌入源码,程…

    2025年12月19日
    000
  • c++中怎么把结构体写入二进制文件_C++结构体二进制文件读写操作指南

    使用二进制模式可将POD结构体直接写入文件。定义不含指针的结构体如struct Student,用std::ofstream配合write()和reinterpret_cast写入数据,sizeof确定大小;读取时用std::ifstream和read()恢复内容,注意检查流状态并确保跨平台兼容性;…

    2025年12月19日
    000
  • C++如何实现多态_C++ 多态实现方法

    多态通过虚函数、继承和基类指针或引用实现,允许不同对象对同一消息做出不同响应。示例中Animal基类的speak函数为虚函数,Dog和Cat类重写该函数,通过基类指针调用时根据实际对象类型动态绑定到对应版本,输出“Dog barks.”和“Cat meows.”。纯虚函数使用virtual void…

    2025年12月19日
    000
  • c++中chrono库怎么用来计时_chrono库高精度计时方法

    C++中推荐使用chrono库进行高精度计时,它提供steady_clock和high_resolution_clock用于可靠的时间间隔测量,相比system_clock更稳定。通过now()获取时间点,相减得到duration,再用duration_cast转换为毫秒、微秒等单位,操作直观且精度…

    2025年12月19日
    000
  • c++中如何定义函数模板_c++函数模板定义方法

    函数模板通过template定义实现泛型编程,支持单或多类型参数,如template T max(T a, T b)和template auto add(T a, U b) -> decltype(a + b),可自动推导或显式指定类型,提升代码复用性。 在C++中,函数模板是一种允许使用泛型…

    2025年12月19日
    000
  • c++如何计算程序运行时间_c++程序运行时间测量方法

    使用std::chrono测量C++程序运行时间最准确,通过high_resolution_clock记录开始和结束时间点,计算差值可得毫秒、微秒或纳秒级精度的执行耗时,推荐用于C++11及以上版本。 在C++中测量程序运行时间,常用的方法是使用标准库中的 chrono 头文件。它提供了高精度的时钟…

    2025年12月19日
    000
  • c++中iostream是什么_iostream标准输入输出库详解

    iostream是C++中用于输入输出的核心库,通过流(stream)实现数据在程序与外部设备间的流动,提供cin、cout等对象及操作符进行I/O操作,需包含头文件,支持类型安全且易于使用的输入输出功能。 iostream 是 C++ 中用于处理输入和输出的核心标准库之一。它提供了一套面向对象的输…

    2025年12月19日
    000
  • c++中如何删除字符串中特定字符_c++删除字符串中特定字符方法

    推荐使用std::remove与erase组合删除字符串中特定字符,该方法高效且简洁;也可通过迭代器遍历删除或构建新字符串,适用于不同场景需求。 在C++中删除字符串中的特定字符有多种方法,常用的是利用标准库中的算法和字符串操作函数。下面介绍几种实用且高效的方式。 使用 std::remove 和 …

    2025年12月19日
    000
  • c++中的参数依赖查找(ADL)是什么_c++ ADL参数依赖查找解析

    ADL(参数依赖查找)使编译器在调用未限定函数时,自动查找参数类型的关联命名空间。例如print(w)能调用MyLib::print,因w为MyLib::Widget类型,编译器通过ADL找到对应命名空间中的函数。规则包括:类类型决定关联命名空间,指针或引用仍使用原类的命名空间,枚举依定义位置确定。…

    2025年12月19日
    000
  • c++中什么是深拷贝和浅拷贝_c++深浅拷贝解析

    深拷贝会复制指针指向的数据,避免共享内存,而浅拷贝仅复制指针地址,导致多个对象共享同一块内存,析构时可能引发崩溃;当类含有动态内存时需手动实现深拷贝,遵循三法则,并推荐使用智能指针或标准容器来管理资源。 在C++中,深拷贝和浅拷贝是对象复制过程中两个核心概念,主要出现在使用默认拷贝构造函数或赋值操作…

    2025年12月19日
    000
  • c++中如何实现双向链表插入_c++双向链表插入方法

    答案是实现双向链表插入需正确处理节点的前驱和后继指针。首先定义包含数据域、前驱和后继指针的节点结构;在头部插入时更新头指针并连接新节点与原首节点;尾部插入需遍历至末尾节点,将新节点链接在其后;指定位置插入则遍历到目标位置前一个节点,调整前后指针关系,注意边界检查与空链表情况;所有操作均需确保指针赋值…

    2025年12月19日
    000
  • c++怎么读取二进制文件_c++二进制文件读取方法

    答案是使用std::ifstream以ios::binary模式读取二进制文件,通过read()方法获取原始字节,可一次性或分块读取,并注意检查流状态和结构体对齐问题。 在C++中读取二进制文件,主要使用标准库中的 fstream 类,并以二进制模式打开文件。关键在于使用 ios::binary 标…

    2025年12月19日
    000
  • c++怎么实现一个模板类_模板类实现教程

    实现C++模板类需先用template定义通用结构,如MyArray类封装动态数组,支持不同类型;通过指定具体类型实例化,如MyArray;可扩展为多参数模板,如Pair并设默认类型;成员函数若在类外定义,须重新声明模板;模板代码通常置于头文件以供编译时实例化。 实现一个C++模板类并不复杂,关键在…

    2025年12月19日
    000
  • c++怎么链接一个静态库或动态库_c++库链接方法

    静态库在编译时嵌入可执行文件,动态库在运行时加载;需配置头文件路径、库路径及链接选项,Linux用g++配合-L和-l,Windows用MSVC链接.lib并确保.dll存在,IDE中需设置包含目录、库目录和依赖项。 在C++项目中使用静态库或动态库,需要在编译和链接阶段正确配置。下面介绍如何在不同…

    2025年12月19日
    000
  • c++怎么使用Fibers(纤程)_c++ Fibers使用方法

    Windows Fibers是用户态线程机制,需调用ConvertThreadToFiber将线程转为纤程支持,再通过CreateFiber创建纤程并用SwitchToFiber实现手动切换,纤程间可传递上下文数据,但仅限Windows平台且需手动管理生命周期与栈资源。 Fibers(纤程)是Win…

    2025年12月19日
    000
  • c++中如何将二进制转为十进制_c++二进制转十进制方法

    C++中二进制转十进制有四种常用方法:1. 循环幂运算逐位计算;2. 字符串处理避免溢出并校验输入;3. bitset类转换(限固定长度);4. stoi函数指定进制快速转换,适用于已知二进制字符串。 在C++中将二进制数转换为十进制,可以通过多种方法实现。最常见的是使用数学计算逐位处理,也可以借助…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信