SpringBoot整合Redis

  • 创建redis缓存配置类,配置插件(较为固定)
package com.xsha.servicebase;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
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.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.lang.reflect.Method;
import java.time.Duration;

@Configuration
@EnableCaching
public class RedisConfig {

    /**
     * 自定义key规则
     * @return KeyGenerator
     */
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                StringBuilder sb = new StringBuilder();
                sb.append(o.getClass().getName());
                sb.append(method.getName());
                for (Object obj: objects) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }

    /**
     * 设置RedisTemplate规则
     * @param redisConnectionFactory 连接工厂
     * @return RedisTemplate
     */
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        // 解决查询缓存转换差异的问题
        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field、set和get以及修饰符的范围,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化输入的类型,类必须是非final修饰的类,比如String、Integer等会抛出异常
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        // 序列号key value
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    /**
     * 设置CacheManager缓存规则
     * @param redisConnectionFactory 连接工厂
     * @return CacheManager
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisSerializer redisSerializer = new StringRedisSerializer();
        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);

        // 配置序列化(解决乱码问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();

        RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}

Original: https://www.cnblogs.com/aitiknowledge/p/15952268.html
Author: xsha_h
Title: SpringBoot整合Redis

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/643757/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Elasticsearch5.0 安装问题集锦

    elasticsearch 5.0 安装过程中遇到了一些问题,通过查找资料几乎都解决掉了,这里简单记录一下 ,供以后查阅参考,也希望可以帮助遇到同样问题的你。 问题一:警告提示 […

    技术杂谈 2023年6月1日
    085
  • 操作系统第一、二章错题

    操作系统第一、二章错题 ​ A就不解释了,用过服务器的都明白。UNIX操作系统采用以全局变量为中心的模块结构,所以导致系统结构较为复杂,表现出来就是模块间的循环调用和文件之间的全局…

    技术杂谈 2023年7月11日
    068
  • cookie和session

    当客户端访问时,服务端会为客户端生成一个 Cookie键值对数据,通过 Response响应给到客户端。当下一次客户端继续访问相同的服务端时,浏览器客户端就会将这个 Cookie值…

    技术杂谈 2023年6月21日
    0104
  • Java实现飞机大战游戏

    飞机大战详细文档 文末有源代码,以及本游戏使用的所有素材,将plane2文件复制在src文件下可以直接运行。 实现效果: 结构设计 角色设计 飞行对象类 FlyObject 战机类…

    技术杂谈 2023年7月24日
    076
  • 017 Linux 之啥是 ssh ?

    1 什么是 ssh?有什么用? (1)ssh 是一种协议 (2)ssh 服务 2 ssh 基于密匙的安全验证过程是怎样的? 3 对称加密与非对称加密区别是什么? (1)对称加密 (…

    技术杂谈 2023年7月10日
    0123
  • linux开机自动挂载(/etc/fstab)

    fatab 介绍 通常情况,Linux 的 /etc/fstab 文件可能有如下内容: # /etc/fstab Created by anaconda on Fri Aug 18…

    技术杂谈 2023年7月24日
    090
  • Allure的简单使用

    Allure的简单使用 1.Allure简介 简单的理解下,可以把Allure当成一个用于生成美观测试报告的开源工具,配合Pytest测试框架使用更佳。 也就是说,Allure是在…

    技术杂谈 2023年7月24日
    0115
  • 【JUC】ReentrantReadWriteLock

    ReentrantReadWriteLock 概述 先带着问题去看这个类: 著作权归https://pdai.tech所有。 链接:https://www.pdai.tech/md…

    技术杂谈 2023年7月24日
    093
  • 功能测试点大全

    一、 输入框测试 字符型输入框: (1)字符型输入框:英文全半角、数字、空或者空格、特殊字符”~!@#¥%……&*?[]{}&#8221…

    技术杂谈 2023年7月23日
    073
  • 爱上WPF,努力才会有希望!

    从WinForm转向WPF开发已经有两个多月了,通过不断深入地学习与运用,现在是越来越爱它了。它实在是太强大了。运用WPF,你不仅可以做Win界面,也可以很快转向Web开发,因为S…

    技术杂谈 2023年5月31日
    094
  • 更换 Kubernetes Storage Class 所使用的 NAS

    最近我们在 kubernetes 集群上部署 rabbitmq 时遇到一个场景,需要将 rabbitmq 使用的 persistent volume 从阿里云性能型 nas 切换为…

    技术杂谈 2023年5月31日
    079
  • 一文搞懂k近邻(k-NN)算法

    一.k近邻算法的基本概念,原理以及应用 k近邻算法是一种基本分类和回归方法。本篇文章只讨论分类问题的k近邻法。 K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找…

    技术杂谈 2023年5月31日
    0110
  • 力扣刷题之路-数组的遍历

    参考刷题顺序:力扣刷题顺序 本文章做自我总结,总结做题时自己的想法以及官方解题思路。 涉及题目 485 最大连续 1 的个数 495 提莫攻击 414 第三大的数 628 三个数的…

    技术杂谈 2023年7月11日
    073
  • Export大数据量导出和打包

    Export大数据量导出和打包 项目需求 ​ 导出生成大批量数据的文件,一个Excel中最多存有五十万条数据,查询多余五十万的数据写多个Excel中。导出完成是生成的多个Excel…

    技术杂谈 2023年7月24日
    073
  • 机器学习(4)特征值的处理之归一化,标准化

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/cgy1995/p/9982882.htmlAuthor…

    技术杂谈 2023年7月23日
    073
  • 解决go-micro与其它gRPC框架之间的通信问题

    在之前的文章中分别介绍了使用gRPC官方插件和go-micro插件开发gRPC应用程序的方式,都能正常走通。不过当两者混合使用的时候,互相访问就成了问题。比如使用go-micro插…

    技术杂谈 2023年7月11日
    073
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球