整合Redis和RedisCacheManger

news2024/9/22 21:12:00

整合redis

  • springboot在现在的版本中操作Redis数据库用到了lettuce,而不是Jedis,他们各有各的特点。
  • Jedis以Redis命令作为方法名称,学习成本低,简单实用。但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用。
  • Lettuce是基于Netty实现的,支持同步、异步和响应式编程方式,并且是线程安全的。支持Redis的哨兵模式、集群模式和管道模式。

SpringDataRedis相关的api

1、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、配置文件

spring:
  redis:
    # Redis服务器地址
    host: 127.0.0.1
    # Redis服务器端口号
    port: 6379
    # 使用的数据库索引,默认是0
    database: 0
    # 连接超时时间
    timeout: 1800000
     # 设置密码
    password: "123456"

3、代码测试

    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    public void redis() {
        redisTemplate.opsForValue().set("study","学习redis");
        String name = (String) redisTemplate.opsForValue().get("study");
        System.out.println(name); 
    }

问题出现了:当我们使用Redis客户端查看刚刚存入Redis数据库的数据时,结果是这样的:

是因为在使用默认的对象redisTemplate时,会把value值序列化为byte类型,所以就出现了上图的结果。

同理,如果我们存储内容是对象的时候,不序列化的话会报错

因此我们需要自定义序列化器

    public void redis(){
        User user = new User();
        user.setName("zs");
        user.setDeptId("11");
        user.setAge(20);
        redisTemplate.opsForValue().set("user:info",user);
    }

报错:

因此我们需要自定义序列化器

4、自定义序列化器



@Configuration
public class RedisCacheManagerConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // 设置Key的序列化方式
        template.setKeySerializer(new StringRedisSerializer());
        // 设置Value的序列化方式,根据需求选择
        template.setValueSerializer(jackson2JsonRedisSerializer());

        // 同样可以设置hashKey和hashValue的序列化方式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));

        return template;
    }


    // 配置Jackson2JsonRedisSerializer
    // 避免出现获取缓存时出现的类型转换错误
    private Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer =
                new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.configure(MapperFeature.USE_ANNOTATIONS, false);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

        // 此项必须配置,否则会报java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        return jackson2JsonRedisSerializer;
    }

}

再次执行存储对象,存储字符串

整合redisCahemanager

在上述redis配置中增加cacheMangerp配置



@Configuration
public class RedisCacheManagerConfig {
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        // 若想存入的不包含类信息,就直接使用GenericJackson2JsonRedisSerializer,配合ObjectMapper
        ObjectMapper objectMapper = new ObjectMapper(); 
        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(objectMapper);
        //------------------------//
        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer()))
                //变双冒号为单冒号
                .computePrefixWith(name -> name +":");

        return RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(cacheConfiguration)
                .build();
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // 设置Key的序列化方式
        template.setKeySerializer(new StringRedisSerializer());
        // 设置Value的序列化方式,根据需求选择
        template.setValueSerializer(jackson2JsonRedisSerializer());

        // 同样可以设置hashKey和hashValue的序列化方式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));

        return template;
    }


    // 配置Jackson2JsonRedisSerializer
    // 避免出现获取缓存时出现的类型转换错误
    private Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer =
                new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.configure(MapperFeature.USE_ANNOTATIONS, false);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

        // 此项必须配置,否则会报java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        return jackson2JsonRedisSerializer;
    }

}

使用参考springCache本地缓存:

SpringCache之本地缓存-CSDN博客

简单测试:

@Component
public class UserCache {

    @Cacheable(cacheNames = "room")
    public User getUserId(String userId){
        User user = new User();
        user.setId(userId);
        user.setAge(10);
        user.setDeptId("1");
        user.setName("zs");
        user.setSex("男");
        return user;
    }
}


    @Autowired
    private UserCache userCache;

    @Test
    public void cache(){
        User user = userCache.getUserId("1");
        System.out.println(user);
    }

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2117474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java实现一个简单的本地群聊。可以多开Client。

网络编程也有趣的&#xff0c;Java中有对系统网络IO操作的封装包&#xff1a;Socket。现在我们在本地电脑&#xff08;网络&#xff09;用它来模拟一个简单的群聊功能&#xff0c;以便能更好地对网络编程进行深刻的理解。 "Client"去连接"Host",可同时多有…

JavaEE 第23节 TCP的流量控制与阻塞控制详解

目录 前言&#xff08;必读&#xff09;1、滑动窗口背景运行机制 2. 流量控制作用实现机制关键目标 3. 拥塞控制作用实现机制作用 4. 流量控制和拥塞控制的区别作用对象不同触发条件不同控制方式不同 5.总结 前言&#xff08;必读&#xff09; 流量控制&#xff08;Flow Contr…

中科院院士薛其坤:通用量子计算机还得10-20年

说到量子计算机&#xff0c;很多人都抱有不切实际的幻想&#xff0c;甚至认为它无所不能&#xff0c;很快就能取代现有的电子计算机&#xff0c;但事实上&#xff0c;目前的量子计算机只能高效解决特定问题&#xff0c;不具备通用性。在2024年浦江创新论坛上&#xff0c;2023年…

linux日志备份

什么是日志文件?为什么要设立日志文件? 1、日志文件是用来记录事务对数据库的更新操作的文件。2、设立日志文件的目的是: 进行事务故障恢复;进行系统故障恢复;协助后备副本进行介质故障恢复。 但是&#xff0c;随着时间&#xff0c;日志文件内存过于增加&#xff0c;将会导…

creating chat agent with langchain and openai getting no attribute error

题意&#xff1a; 使用 LangChain 和 OpenAI 创建聊天代理时遇到“没有属性错误”&#xff08;Getting "no attribute" error when creating a chat agent with LangChain and OpenAI&#xff09; 问题背景&#xff1a; Im trying to test a chat agent using the …

基于springboot+vue的工作量统计系统(全套)

传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装工作量统计系统软件来发挥其高效地信息处理的作用&#xff0c;可以…

java后端开发的DO、DTO、BO、AO、VO、POJO定义

1.常用文件夹命名规则 pojo&#xff1a; &#xff08;1&#xff09;vo &#xff08;与前端交互的所有对象&#xff0c;包括接参和返回&#xff09; &#xff08;2&#xff09;query &#xff08;查询的筛选条件&#xff0c;前端传参和后端内部传参通用&#xff09; &#x…

[计算机基础四大件学习笔记]计算机组成原理

文章总览&#xff1a;YuanDaiMa2048博客文章总览 计算机基础四大件学习笔记 说明&#xff1a;虽然学习过计算机组成与系统结构、操作系统、计算机网络以及数据结构这四门课程&#xff0c;但是对于这四门课的结合和实际中的应用还是模糊的&#xff0c;因此x想通过网上的一些视频…

Rust语言初探:WebAssembly 入门

Rust语言初探&#xff1a;WebAssembly 入门 前言 在我的印象中&#xff0c;Rust 一直是比较底层的语言&#xff0c;例如在操作系统底层、高性能中间件等底层场景才会看到它的身影。 然而&#xff0c;随着技术的发展&#xff0c;Rust 也开始在前端场景如 WebAssembly 中崭露头…

大数据Flink(一百一十五):Flink SQL的基本概念

文章目录 Flink SQL的基本概念 一、​​​​​​​SQL 中表的概念 二、​​​​​​​​​​​​​​SQL 临时表、永久表 三、​​​​​​​​​​​​​​SQL表类型的定义 四、​​​​​​​​​​​​​​常见的连接器 五、​​​​​​SQL数据视图 1、​​​​​​…

校园气膜馆助力青少年体质发展:少年强则国强—轻空间

青少年是国家的未来&#xff0c;体质的强健与否&#xff0c;直接关系到国家的竞争力和可持续发展。在现代社会&#xff0c;学习和压力并存&#xff0c;青少年的体育锻炼时间不断被压缩&#xff0c;如何提供更为优质的体育设施&#xff0c;帮助他们增强体质&#xff0c;成为学校…

【C/C++】“秒懂”学C/C++不可错过的“经典编程题” — 日期类的经典运用 (含题链接)

“秒懂”学C/C不可错过的“经典编程题” — 日期类的经典运用 (含题链接&#xff09; 1. 计算日期到天数转换(1). 解题思路&#xff1a;(2). 代码实现&#xff1a; 2. 打印日期(1). 解题思路&#xff1a;(2). 代码实现&#xff1a; 3. 日期累加(1). 解题思路&#xff1a;(2). 代…

Java 设计模式-状态模式

目录 一. 概述 二. 主要角色 三. 代码示例 四. 优缺点 优点&#xff1a; 缺点&#xff1a; 五. 常见应用场景 一. 概述 状态模式是一种行为设计模式&#xff0c;它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式把所有的与一个特定…

AES算法与接口解密

文章目录 AES算法基本介绍加密模式模式与IV 接口响应AES解密 AES算法 基本介绍 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。 对称加密算法中加解密密钥都是一样的。 AES 的主要特性&#xff1a; 块加密&#xff1a;AES 是一种分组加密算法&…

Vue day-04

目录 一. vue组件 1.1 为什么用组件 1.2 vue组件 1.3 基础使用 1.4 全局 - 注册使用 1.5 局部 - 注册使用 1.4 用less写的样式 二. Vue组件之间传值(重点) 2.1 父组件向子组件传值 2.2 子组件向父组件传值 2.3 兄弟之间的传递 三. vue生命周期 3.1 含义 3.2 钩子…

phpmyadmin报错mysqli::real_connect(): (HY000/1045): Access denied for user ‘

问题分析 这是因为本身还安装了MySQL&#xff0c;导致发生冲突&#xff0c;只需要找到自己安装的进行关闭即可 方法 在任务管理器(快捷键&#xff1a;ctrlaltdelete)-服务中&#xff0c;找到对应的MySQL进行关闭

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端&#xff0c;一般来说需要版本检测和自动更新功能&#xff0c;这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤&#xff1a; 读取本地应用版本拉取远程版本并比较两个版本如果需要升级&…

数字化转型的战略规划应该怎么做?(附IBM-IT战略规划方法论PPT下载)

IBM-IT战略规划方法论PPT-下载链接见文末~ 数字化转型的战略规划是一个系统而复杂的过程&#xff0c;需要从多个维度进行考虑和规划。以下是一些关键步骤和建议&#xff0c;以帮助企业制定有效的数字化转型战略规划&#xff1a; 1. 明确数字化转型愿景和目标 设定愿景&#…

基于ONSEMI电源管理芯片NCP1607之AC300V高输入电压36W调色温智能电源

NCP1607PFC在LED智能电源PFC处理部分性价比高&#xff0c;输入电压范围宽到AC90-300V,母线电压420V导致高压低电流整机光效高&#xff0c;成熟芯片可靠新高&#xff0c;没有任何纹波与频闪&#xff0c;智能护眼。 ►场景应用图 ►产品实体图 ►展示板照片 ►方案方块图 ►核心…

常见概念 -- OPA与插损预置

OPA基本原理 OPA功能&#xff0c;即光功率调节(Optical Power Adjust)&#xff0c;在新建光层业务时使用。 ​单板正常工作后&#xff0c;在网管上创建单站光交叉时&#xff0c;可以创建自动模式的光交叉&#xff0c;即启动OPA功能。OPA功能通过软件计算&#xff0c;自动调节交…