Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Redis系统学习之自定义RedisTemplate

Redis系统学习之自定义RedisTemplate

作者头像
彼岸舞
发布于 2021-05-07 07:33:19
发布于 2021-05-07 07:33:19
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

自定义RedisTemplate

序列化源码分析
  • 在JAVA程序中看到中文是没有问题的,但是在Redis客户端工具,也就是命令行中看见是编码的
  • 继续分析源码
  • 查看RedisTemplate.class
  • 在RedisAutoConfiguration.class中点击
  • 在上面可以看到序列化支持的
  • 往下稍微滑动一些可以看到,默认采用的是JDK的序列化,因为默认4种都是空的
  • 但是我们一般都是采用JSON来做序列化的,这个时候就需要自己定义序列化了
默认序列化存在的问题
  • 创建测试实体类,User
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package co.flower.redis02springboot.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

@Data
@Component
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private String name;

    private int age;

}
测试存储JSON
/**
     * 测试默认序列化
     */
@Test
public void testSerial() throws JsonProcessingException {
    User user = new User("小姐姐", 18);
    // 使用jackson转换为字符串,我也没用过
    String jsonUser = new ObjectMapper().writeValueAsString(user);
    redisTemplate.opsForValue().set("user",jsonUser);
    System.out.println(redisTemplate.opsForValue().get("user"));
}

执行结果
{"name":"小姐姐","age":18}
测试存储对象User
/**
     * 测试默认序列化
     */
@Test
public void testSerial() throws JsonProcessingException {
    User user = new User("小姐姐", 18);
    // 使用jackson转换为字符串,我也没用过
    //        String jsonUser = new ObjectMapper().writeValueAsString(user);
    redisTemplate.opsForValue().set("user",user);
    System.out.println(redisTemplate.opsForValue().get("user"));
}

执行结果
// org.springframework.data.redis.serializer.SerializationException: 
Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: 
Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires 
a Serializable payload but received an object of type [co.flower.redis02springboot.pojo.User]
    at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:96)
  • 提示不能序列化,因为没有实现Serializable接口,所以不能被JDKSerialzationRedisSerializer序列化
  • 为User实现Serializable接口
  • 再次测试,执行成功
  • 返回结果:User(name=小姐姐, age=18)
自定义RedisTemplate
  • 在java下创建config包,里面创建RedisConfig.java
  • 复制源码中的代码进行改动
  • 自己设置序列化方式
  • 设置方法
    • 通过redisTemplate对象进行设置
    • 比如:setKeySerializer
    • 点击入参
    • 查看实现类,就知道有哪些能设置了
  • 配置类代码 RedisConfig.java
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package co.flower.redis02springboot.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        // JSON序列化配置 不需要被,不需要知道具体参数含义 大概知道是做什么的就可以 这个就是采用JSON序列化对象
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer  = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // String的序列化配置
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // 所有的Key通过String序列化
        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        // 所有的value通过JSON序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        // 调用刚才看的序列化源码中默认的方法,重新设置序列化
        template.afterPropertiesSet();
        return template;
    }

}
采用自定义配置之后,清空数据库再次测试测试代码如下
/**
     * 测试自定义序列化
     */
@Test
public void testSerial() throws JsonProcessingException {
    User user = new User("小姐姐", 18);
    // 使用jackson转换为字符串,我也没用过
    //        String jsonUser = new ObjectMapper().writeValueAsString(user);
    redisTemplate.getConnectionFactory().getConnection().flushDb();// 清空数据库
    redisTemplate.opsForValue().set("user",user);
    System.out.println(redisTemplate.opsForValue().get("user"));
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
执行结果:
User(name=小姐姐, age=18)
  • 没有问题,查询数据库,直接从客户端查询
  • 也没有问题,OK,nice,开发中如果使用的话,直接拷贝就可以用了!当然是配置类,但是一般开发中不直接在业务中引入redisTemplate,而是编写一个RedisUtils工具类,来包装一下默认的,因为使用起来比较麻烦~,我就不照着视屏巧了,好几百行[捂脸],用的时候直接从公司拿,没有的话百度一个!

问题AQF:

依赖报错:

在依赖redis的时候不要指定泛型,不然会报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
* 我居然直接就指定了泛型 RedisTemplate<String,Object>结果就直接报错了,删除泛型后成功
*/
@Autowired
private RedisTemplate redisTemplate;

作者:彼岸舞

时间:2021\05\05

内容关于:Redis

本文属于作者原创,未经允许,禁止转发

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-05-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot整合Redis
上面我们已经初步SpringBoot整合好了Redis,也可以正常运行出结果,看似没什么问题
张小驰出没
2021/12/06
2720
SpringBoot整合Redis
springboot2.5.0 整合 redis 配置详解
​ 1. pom添加依赖 <!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2. application.properties 配置文件 #===========Redis配置=========== # Redis数据库索引(默认为0) spring.re
FHAdmin
2021/06/02
6180
Sprint Boot 集成 Redis  介绍及开发
Redis是一个内存数据存储,可以用作用作数据库,缓存和消息代理。它支持数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,日志,带有半径查询和流的地理空间索引。Redis具有内置的复制,Lua脚本,LRU逐出,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。
Freedom123
2024/03/29
1260
Spring Boot整合 NoSQL 数据库 Redis
在日常的开发中,除了使用Spring Boot这个企业级快速构建项目的框架之外,随着业务数据量的大幅度增加,对元数据库造成的压力成倍剧增。在此背景下,Redis这个NoSQL数据库已然整个项目架构中的不可或缺的一部分,懂得如何Spring Boot整合 Redis,是当今开发人员必备的一项技能,接下来对整合步骤进行详细说明。
百思不得小赵
2022/12/01
4520
Spring Boot整合 NoSQL 数据库 Redis
【Spring Boot】020-Spring Boot整合Redis
spring boot 2.0.X之后,原来使用的jedis被替换成了lettuce;
訾博ZiBo
2025/01/06
640
【Spring Boot】020-Spring Boot整合Redis
SpringBoot实现接口限流(Redis版本)
随着前后端分离架构的流⾏,前端页面与后端接口的调⽤关系越来越复杂,后端服务的稳定性越来越重要。在遇到突发的请求量激增,恶意的⽤户访问,亦或请求频率过⾼给下游服务带来较⼤压⼒时,我们常常需要通过缓存、限流、负载均衡等多种⽅式保证后端服务的稳定性。其中,限流是不可或缺的⼀环。
水煮麥楽雞
2022/11/20
8970
springboot整合redis进行缓存的使用
看过我的文章的都应该有所了解如何使用docker方式进行redis环境的搭建过程,想要了解的可以看下历史文章。今天我们想要分享的就是如何使用redis进行缓存的使用。
码农王同学
2019/11/28
5040
springboot整合redis进行缓存的使用
就像一个从来没有杀过猪的人在教别人杀猪
在上一篇文章里,在公共模块中引入了redis依赖,从而造成没有配置redis信息的模块,在启动时,会默认去连接localhost:6379。
半月无霜
2024/05/17
870
就像一个从来没有杀过猪的人在教别人杀猪
java工具类(redis配置工具包)
package com.adingxiong.pm.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; import
java攻城狮
2020/10/10
9470
Spring boot配置多个Redis数据源操作实例
平时都是使用本地环境的单Redis情况比较多,在集群环境的情况下连接多个Redis数据库是很正常的情况。
程序员小强
2019/06/02
12.8K0
【详解】Spring整合Redis
在现代Web应用开发中,缓存技术是提高应用性能的关键因素之一。Redis作为一个高性能的键值存储系统,被广泛应用于各种场景中,如数据缓存、消息队列等。本文将介绍如何在Spring框架中整合Redis,实现数据的高效读取和存储。
大盘鸡拌面
2025/01/04
840
redis过期监听
今天写拼团功能,如果24小时后还没有人满,则此次拼团就失败了,那么这里我用redis过期监听来实现,键过期去处理订单状态等业务
adu
2022/10/30
2.3K0
redis过期监听
重学SpringBoot3-集成Redis(一)之基本使用
随着 Spring Boot 3 的发布,开发者可以享受更多的功能提升和性能优化。在现代开发中,Redis 作为高性能的缓存数据库,被广泛应用于提高系统的响应速度和减少数据库的压力。本文将介绍如何通过 Spring Boot 3 来整合 Redis,实现缓存和存储功能。
CoderJia
2024/10/18
2660
重学SpringBoot3-集成Redis(一)之基本使用
SpringBoot整合redis
前言 使用注解实现Redis缓存功能的具体代码 1 引入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2 添加配置 spring.redis.host=xxxxxxx spring.redis.port=6379 // 如
在水一方
2022/10/04
2990
当SpringBoot引用Redis依赖但没有配置Redis信息时
虽然引用了这个公共模块,但是没有配置相对应的**Redis**信息,在项目启动后会出现异常报错
半月无霜
2024/05/17
5820
当SpringBoot引用Redis依赖但没有配置Redis信息时
redis 乐观锁_redis 乐观锁
存储地理位置的数据结构 应用场景 朋友的定位,附近的人,打车距离计算 Geospatial底层使用的是Zset
全栈程序员站长
2022/09/22
4060
Spring Boot 整合 Redis
因为首页接口对应获取的首页数据变化不大,但访问量较大,所以就有必要将首页接口数据缓存到redis缓存中,减少数据库压力和提高访问速度
FHAdmin
2022/03/03
1K0
RedisTemplate基本配置类
RedisConfig import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.ja
benym
2023/05/18
9560
一文搞定 Spring Data Redis 详解及实战
Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能。它提供了与商店互动的低级别和高级别抽象,使用户免受基础设施问题的困扰。
Java技术栈
2018/09/29
1.3K0
Spring Boot 结合 Redis 的序列化配置
默认情况下,Spring 为我们提供了一个 RedisTemplate 来进行对 Redis 的操作,但是 RedisTemplate 默认配置的是使用Java本机序列化。
Vincent-yuan
2021/10/28
4.1K0
Spring Boot 结合 Redis 的序列化配置
相关推荐
SpringBoot整合Redis
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验