Redis缓存工具类

为什么Redis默认序列化器处理之后的key会带有乱码? 从定义默认序列化器那行代码进到的方法 先看一下SerializingConverter是个什么:Serializer是什么已经再熟悉不过了吧,那么看看构造方法中的DefaultSerializer又是什么:DefaultSerializer实现了jdk的Serializer接口并实现了里面的serialize方法,这个地方就是key最后被处理的地方。System.out.println("=============REDIS序列化KEY工具==================");... 阅读详情

添加依赖

<!--redis默认使用的Lettuce客户端-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--使用默认的Lettuce时,若配置spring.redis.lettuce.pool则必须配置该依赖-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

配置文件

/**
 * 启用Redis缓存,这个注释必须加上,即使单元测试也得加上EnableCaching
 * @author 六月Bing
 */

@EnableCaching
@Configuration
public class CacheRedisConfig {

    /**
     * 过期时间1天
     */
    private final Duration timeToLive = Duration.ofDays(1);

    private final StringRedisSerializer keySerializer = new StringRedisSerializer();

    /**
     * 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
     */
    private final Jackson2JsonRedisSerializer valueSerializer = new Jackson2JsonRedisSerializer(Object.class);

    /**
     * 代码块,会优先执行
     * 用来设置Jackson2JsonRedisSerializer
     */ {
        ObjectMapper objectMapper = new ObjectMapper();
        //设置所有访问权限以及所有的实际类型都可序列化和反序列化
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化输入的类型,类必须是非final修饰的
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
                ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);

        //下面两行解决Java8新日期API序列化问题
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.registerModule(new JavaTimeModule());

        valueSerializer.setObjectMapper(objectMapper);
    }

    /**
     * 在SpringBoot2.0之后,spring容器自动的生成了StringRedisTemplate和RedisTemplate<Object,Object>,可以直接注入
     * 但是在实际使用中,大多不会直接使用RedisTemplate<Object,Object>,而是会对key,value进行序列化,所以我们还需要新增一个配置类
     * 换句话说,由于原生的redis自动装配,在存储key和value时,没有设置序列化方式,故自己创建redisTemplate实例
     *
     * @param factory
     * @return
     */
    @Bean(name = "redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // key采用String的序列化方式
        template.setKeySerializer(keySerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(keySerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(valueSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(valueSerializer);
        template.afterPropertiesSet();
        return template;
    }

    @Bean(name = "cacheManager")
    public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
        // 配置序列化(解决乱码的问题),通过config对象对缓存进行自定义配置
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                // 设置缓存的默认过期时间
                .entryTtl(timeToLive)
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer))
                // 不缓存空值
                .disableCachingNullValues();

        //根据redis缓存配置和reid连接工厂生成redis缓存管理器
        RedisCacheManager redisCacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .transactionAware()
                .build();
        return redisCacheManager;
    }

    /**
     * 配置事务管理器
     *
     * @param dataSource
     * @return
     */
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }


}

@Cacheable CacheManager 重写clear方法 根据前缀批量删除redisKey 一、参考文档: https://blog.youkuaiyun.com/qq_36194413/article/details/105833158 https://blog.youkuaiyun.com/llllllllll4er5ty/article/details/106337559 https://www.freesion.com/article/5258202702/ 二、批量删除缓存代码 4.1 自定义RedisCache:(重写方法) @Slf4j public class CustomizedRedisCache e 阅读详情

相关推荐

Redis缓存穿透、缓存击穿解决方案及工具类

Redis缓存穿透、缓存击穿解决方案及工具类

m0_64656436的博客 637

Redis序列化方式比较

1.Spring-Data-Redis支持的序列化策略 SpringBoot默认提高StringRedisTemplate和RedisTemplate,前者用于操作包含字符串的数据机构,后者则使用了JDK自带的序列化策略。 事实上StringRedisTemplate继承了RedisTemplate,对key、value、hashkey、hashvalue提供了不同的序列化策略: pub...

u010277958的博客 2838

华为防火墙双ISP出口实战:如何用策略路由实现电信联通流量自动切换(附配置截图)

本文详细解析了华为防火墙在双ISP环境下的智能选路技术,通过策略路由与健康检测的深度应用,实现电信联通流量的自动切换。文章包含实战配置截图,帮助企业解决切换延迟、路径劣化等核心挑战,提升业务连续性。

backprop5master的博客 643

Redis的序列化配置

一、JdkSerialization序列化方式 RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerialize...

Morn_Li的博客 1734

dify1.3.1应用服务与数据服务分离,附件及插件包迁移至minio,实现离线部署,保证插件正常运行

dify1.3.1应用服务与数据服务分离,附件及插件包迁移至minio,实现离线部署,保证插件正常运行

Time_1023的博客 1872

关于Selenium3在MicrosoftEdge浏览器中出现的问题

前言 最近在做web自动化测试,所用环境是java+selenium3.141.59+MicrosoftEdge(Chromium)浏览器。 在调试的过程中,出现了很多问题。比如selenium3在Edge浏览器中远程调用中,不支持addArguments方法等 问题 1.Edge浏览器弹窗问题 在测试过程中,会出现弹出窗提示 ...

zhucheng1994的博客 2193

springBoot整合RedisCacheManager + CacheManager +@Cacheable 实现注解化缓存管理

1.redisConfig package com.hc.config.redis; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.Object

我心向Java的博客 1526

从理论到代码:手把手教你用Matlab复现MMC的HSS阻抗模型(附避坑指南)

本文详细介绍了如何使用Matlab复现MMC的HSS阻抗模型,涵盖谐波状态空间(HSS)理论、代码实现步骤及常见问题解决方案。通过谐波线性化和序阻抗建模技术,帮助工程师准确分析MMC的阻抗特性,并提供避坑指南以解决矩阵维度错误、收敛性问题和频域转换陷阱等难点。

weixin_42561040的博客 357

redis缓存工具类,值得拥有~

还在为redis的缓存的工具类而发愁吗,这里精心为你总结了redis缓存的各种工具类,非常全面,快来看看吧~

热爱技术,享受生活 657

疾病负担研究(GBD)——如何使用joinpoint软件计算AAPC

疾病负担研究(GBD)——如何使用joinpoint软件计算AAPC

weixin_44240228的博客 1万+

LVGL 丝滑菜单3(Silk Menu)

h。

摸鱼专家 90

缓存Redis工具类

【代码】Redis工具类。

anxinbuxinan的博客 152

外骨骼机器人(二):自适应振荡器

振荡器是一种数学工具,可以用于实时跟踪、预测类周期信号的频率、相位、幅值等,而助行外骨骼机器人需要自动适应人体的行走频率、幅度,两者相结合,就能使助行外骨骼机器人拥有更舒适、更自然的行走步态。 ......

行者无疆的博客 4264

《Redis实战篇》二、商户查询缓存(缓存基本使用 缓存更新 缓存穿透 缓存雪崩 缓存击穿 Redis缓存工具类(1)

缓存穿透产生的原因是什么?

2401_84166811的博客 702

基于Lumerical的1550 nm InGaAs/InP与InGaAs/InAlAs APD设计与功率饱和度优化

摘要 本研究利用Ansys Lumerical软件对1550 nm激光雷达应用的InGaAs/InP和InGaAs/InAlAs雪崩光电二极管(APD)进行仿真设计与优化。通过FDTD光学仿真获取光吸收分布,结合CHARGE模块的电学仿真分析暗电流、光电流及雪崩增益特性。重点研究了两种材料体系的性能差异,并针对近距离强反射导致的功率饱和问题提出结构优化方案。仿真结果表明,InGaAs/InAlAs APD具有更优的过量噪声特性,而优化的电荷层设计可显著提升器件的功率饱和阈值。研究提供了完整的仿真流程与代码实

huanghm88的专栏 95

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

redis缓存配置及redis工具类/缓存分页

这里做一个工作笔记,业务场景:redis缓存配置,及redis工具类整合先做redis配置:pom.xml文件新增&lt;!-- redis --&gt; &lt;spring-redis.version&gt;1.8.10.RELEASE&lt;/spring-redis.version&gt; &lt;redis-jedis.version&gt;2.9.0&lt;/redis-jedis.v...

SlipMan的博客 1470

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Redis二级缓存工具类

是一款结合本地缓存(Guava)和分布式缓存(Redis)的二级缓存工具类,专为列表类型数据设计并支持泛型。其核心目标是通过多级缓存协同,平衡数据访问性能与分布式一致性,减少数据库压力,提升系统响应速度。适用于读多写少的列表数据场景(如商品列表、用户订单历史、权限菜单等)。

qq_51419689的博客 373

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

《Redis实战篇》二、商户查询缓存(缓存基本使用 缓存更新 缓存穿透 缓存雪崩 缓存击穿 Redis缓存工具类)_怎么查看商城的缓存技术

缓存穿透产生的原因是什么?

2401_84182428的博客 402

Redis实战篇|将解决缓存问题方案封装成工具类

步骤 1:定义缓存策略枚举枚举中每个常量对应一种策略,并通过抽象方法统一执行逻辑。@Override// 参数校验throw new IllegalArgumentException("PASS_THROUGH 策略需设置 time 和 unit");},@Overridethrow new IllegalArgumentException("LOGICAL_EXPIRE 策略需设置 expireTime");

MonKingWD的博客 968

封装redis工具类——缓存工具类

基于StringRedisTemplate封装一个缓存工具类,满足下列要求:方法1:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL时间 方法2:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置逻辑过期时间,用于处理缓存击穿问题 方法3:根据指定的key查询缓存,并反序列化为指定类型。利用缓存空值解决缓存穿透问题 方法4:根据指定的key查询缓存,并反序列化为指定类型,需要利用逻辑过期时间解决缓存击穿问题...

PnJgHT的博客 537

java redis缓存工具类_Redis在JAVA中的运用(工具类)

最近项目需要用redis在中间做缓存所以写了一个工具类作为练习用redis版本:redis_version:3.0.504用到阿里的解析JSON的库:fastjsonimport org.apache.log4j.Logger;import org.apache.log4j.chainsaw.Main;import com.alibaba.fastjson.JSONObject;import re...

weixin_39832875的博客 290

【Redis】封装缓存工具类

Redis封装缓存工具类

liuwanqing233333的博客 627

封装redis工具类,便携使用redis进行数据缓存,并简单解决缓存穿透、雪崩和击穿问题

首先需要创建redis数据包装类,包含缓存数据以及逻辑过期时间,为解决缓存击穿问题做铺垫。然后创建缓存工具类,封装缓存存储,以及缓存读取的三种方式,和加锁信息。新人使用redis不久,有优化意见或者其他简介可以积极交流。

Admine1的博客 493

redis学习(010 实战:黑马点评:缓存:封装redis工具类)

黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目总时长 42:48:00 共175P此文章包含第46p-第p47的内容这里使用构造器注入,spring也推荐用构造器注入 使用final 可以避免一些无效的修改 final修饰只需要在使用之前一定要初始化,没有说定义必须初始化,且只能一次赋值 使用泛型 四大函数式接口 Function<T,R> Predicate Consumer Supplier

wang_book的博客 469

Redis-缓存工具类的封装

缓存雪崩,还是缓存击穿,这些问题的解决方案业务代码逻辑都很复杂,所以我们也不需要每次都来重写这些逻辑,我们可以将其封装成工具,以便于我们可以随时调用。方法三:根据指定的key查询缓存,并且反序列化成指定类型,利用缓存空值的方式解决缓存穿透问题。方法三:根据指定的key查询缓存,并且反序列化成指定类型,利用缓存空值的方式解决缓存穿透问题。方法四:根据指定的key查询缓存,并且反序列化成指定类型,需要利用逻辑过期解决缓存击穿问题。缓存中的问题,无论是。

2402_86907325的博客 305
上一篇: 数据库索引
下一篇: Mybatis联表查询:多对多(注解实现)
六月Bing
博客等级 码龄5年 2粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值