SpringBoot配置多个Redis集群数据源+自定义缓存注解实例

2023-10-31

今天找了半天没找到线程的,网上都是多个Redis示例。最还还是自己想办法实现了
两个Redis集群作为数据源 + 自定义缓存注解

不会做的是否发现好tm难。都不知道怎么动手。做完之后,发现原理其实特别简单。很容易就能实现。分两部分原理和示例代码部分

原理解析:

  1. 配置两个数据源,生成两个redisTemplate (这个配置是参考我之前配置单个集群的时候,从人家的data-redis里面复制出来的,也可能是看了那篇博客。我不清楚了)
  2. 分别操作这两个tempLate.
  3. 我这里是利用AOP+注解的方式。拦截所有配置了这个注解的方法。然后先通过template请求Redis 有结果直接返回。没有就查库,然后将结果放到Redis。再返回
  4. 我这里利用两个库的用途是相同场景不同城市使用不同的Redis数据源。 有的场景是不同业务使用不同数据源。那样应该实现起来更简单

代码示例:

  1. 需要的依赖
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
  1. 注意启动类要关掉redis的自动配置
    @SpringBootApplication(exclude = {RedisAutoConfiguration.class, RedisReactiveAutoConfiguration.class})
  2. 主配置类
@Configuration
@EnableCaching
public class RedisConfig2 {
    @Autowired
    RedisClusterNode redisClusterNode;
    @Bean(name = "jtClusterRedisConnectionFactory")
    public LettuceConnectionFactory getJtRedisConnectionFactory() {
        return new LettuceConnectionFactory(new RedisClusterConfiguration(redisClusterNode.getJtNodes()));
    }
    @Bean(name = "szClusterRedisConnectionFactory")
    public LettuceConnectionFactory getSzRedisConnectionFactory() {
        return new LettuceConnectionFactory(new RedisClusterConfiguration(redisClusterNode.getSzNodes()));
    }
    @Bean(name = "redisTemplate")
    @Qualifier("jtClusterRedisConnectionFactory")
    public RedisTemplate redisTemplate(LettuceConnectionFactory jtClusterRedisConnectionFactory){
        return getRedisTemplate(jtClusterRedisConnectionFactory);
    }
    @Bean(name = "szRedisTemplate")
    @Qualifier("szClusterRedisConnectionFactory")
    public RedisTemplate szRedisTemplate(LettuceConnectionFactory szClusterRedisConnectionFactory) {
        return getRedisTemplate(szClusterRedisConnectionFactory);
    }
    private RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式,value的序列化方式采用jackson
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的key也采用String的序列化方式 value的序列化方式采用jackson
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}
  1. 节点配置(这个应该可以和上面写在一起的。日后有时间在优化。将记录下来)
@Configuration
@Getter
@Setter
public class RedisClusterNode {
   @Value("${redis.cluster.jt-nodes}")
   private List<String> jtNodes;
   @Value("${redis.cluster.sz-nodes}")
   private List<String> szNodes;
}
  1. Redis集群数据源的配置(这里做了处理,总不能将公司的地址放出来把)
redis:
  cluster:
    jt-nodes: 127.0.0.1:7002,127.0.0.1:7003
    sz-nodes: 127.0.0.2:7002,127.0.0.2:7003
  1. 自定义注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyRedisCache {
    String key();
}
  1. AOP拦截使用了注解的方法
@Aspect
@Component
@Slf4j
public class RedisCacheAspect {
    @Resource(name = "szRedisTemplate")
    private RedisTemplate<String, Object> szRedisTemplate;
    @Resource(name = "redisTemplate")
    private RedisTemplate<String, Object> jtRedisTemplate;
    @Value("${spring.profiles.active}")
    private String active;
    @Around("@annotation(com.centanet.bizcom.config.redis.MyRedisCache)")
    public Object handleCache(ProceedingJoinPoint joinPoint) {
        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
        // 取出key
        MyRedisCache myRedisCache = method.getAnnotation(MyRedisCache.class);
        String key = myRedisCache.key();
        Object[] args = joinPoint.getArgs();
        // 获取当前城市
        String city = CityHelper.getCityen();
        // 填充完整的key
        String fullKey = this.buildFullKey(key,args);
        // 先从缓存里查询。如果查询到直接返回。
        Object result = this.getObjectFromRedis(city,fullKey);
        if (!ObjectUtil.isEmpty(result)) {
            return result;
        }
        // 查询不到,走原来的方法。并且把结果填充到Redis服务器
        try {
            result = joinPoint.proceed(args);
        } catch (Throwable throwable) {
            throw new MyRedisCacheAnnotationException("自定义的Redis注解这里出问题了。问题详情"+throwable.getMessage());
        }
        if (!ObjectUtil.isEmpty(result)) {
                this.setObjectToRedis(city,fullKey,result);
        }
        return result;
    }
    private Object getObjectFromRedis(String city, String key) {
        if (city.equalsIgnoreCase("SZ")) {
            return szRedisTemplate.opsForValue().get(key);
        }
        return jtRedisTemplate.opsForValue().get(key);
    }
    private void setObjectToRedis(String city, String key, Object target) {
        if (city.equalsIgnoreCase("SZ")) {
            szRedisTemplate.opsForValue().set(key,target,6,TimeUnit.HOURS);
        }else {
            jtRedisTemplate.opsForValue().set(key,target,6,TimeUnit.HOURS);
        }
    }
    private String buildFullKey(String key, Object[] objects) {
        // 加个active的目的是因为测试环节深圳和线上是一个集群。避免数据混乱,加个个active进行区分
        StringBuilder fullKey = new StringBuilder(key).append(":").append(active);
        if (objects == null || objects.length <= 0) {
            return fullKey.toString();
        }
        for (Object o : objects) {
            fullKey.append(":").append(o.toString());
        }
        return fullKey.toString();
    }
}
  1. 使用时将注解加在方法上就好了。key看自己的需求
@MyRedisCache(key = "bizCom:AD:listSchoolRequest")
public List<SchoolResponse> listSchoolRequest(ListSchoolRequest request) {
    // 这里是一堆业务逻辑
    return null;    
}

小结

• 发现自己水平还可以哈
• 做的是否很复杂。实际弄完发现代码其实并不多

水平有限。这个之前其实就实现了多Redis数据源。但是之前把分支删除了。还好找回了。
今天完成的部分就是自定义注解和清除缓存
这次记录下。如果下次有需求直接用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot配置多个Redis集群数据源+自定义缓存注解实例 的相关文章

  • redis单机版部署

    目录 1 下载版本 2 上传解压 3 安装依赖包 4 进入redis目录 执行编译 5 创建相应目录 6 配置redis conf 7 启动redis 8 配置redis开机自启 1 下载版本 以下是我使用的版本 redis 4 0 1 链
  • Linux中安装Redis教程

    1 在CentOS7中新建一个文件夹 然后在这个文件夹中下载 Redis 执行下面的命令 你也可以选择其他的包 如 redis 5 0 10 tar gz 我用这个包安装成功了 wget http download redis io rel
  • 记 ==> 首次使用rabbitMQ优化项目

    昨天刚学习完了rabbitMQ 刚好我的项目有个模块挺符合使用rabbitMQ进行异步处理的 这个模块大概功能是 用户发送的所有帖子都会添加到他的发件箱 当有个新用户关注了他 他发件箱内所有的博客都会被添加到关注他的用户的收件箱里 比如 A
  • redis HyperLogLog,看这篇就够了

    文章目录 前言 一 动手试试 1 添加 2 统计 3 合并 二 原理 1 伯努利过程 2 HyperLogLog 2 1 工作原理 2 2 占用内存大小 2 3 内存优化 3 数据编码 3 1 稀疏编码 3 2 密集编码 3 3 转码 前言
  • Idea中常用的快捷键(持续更新)

    自己用到的时候就会标注出来 Idea中常用快捷 一 idea中的快捷键 二 idea中的快捷输入 三 Win10用到快捷键 一 idea中的快捷键 Ctrl Z 撤销 Ctrl X 剪切 Ctrl C 复制 Ctrl V 粘贴 Ctrl H
  • Redis实现点赞功能模块

    功能点设计 统计文章点赞的总数 用户所有文章的点赞数 因此设计的点赞功能模块具有以下功能点 某篇文章的点赞数 用户所有文章的点赞数 用户点赞的文章 持久化到MySQL数据库 数据库设计 1 Redis数据库设计Redis是K V数据库 没有
  • 【Redis速通】基础知识2 - 常用数据结构

    Redis 通用指令 下面是一些 Redis 的通用命令 你可以根据下表进行简单的复习 键操作命令 SET 设置指定键的值 GET 获取指定键的值 DEL 删除指定键 EXISTS 检查指定键是否存在 KEYS 获取匹配指定模式的键列表 字
  • redis 管道(pipeline),深入解读

    文章目录 前言 一 动手试试 1 对比 2 请求 二 原理 1 模式 2 服务端 3 客户端 3 1 redisson 3 2 jedis 3 3 lettuce 总结 前言 本文源码参考版本 redis 6 2 redisson 3 17
  • redis基础知识汇总

    redis基础知识汇总 一 redis 基础知识 1 什么是Redis 2 redis的优缺点 3 redis比memcached的优势在哪里 以及两者的区别 4 redis的持久化策略 5 Redis过期键的删除策略 6 数据淘汰策略 7
  • Redis基础知识(二):事务机制

    文章目录 一 什么是事务机制 二 Redis模式下如何实现事务机制 2 1 显式开启一个事务 2 2 将命令入队列Queue 2 3 执行事务或丢弃 2 4 EXEC命令执行示例 2 5 DISCARD命令 放弃事务 2 6 因为命令错误导
  • redis实现原理和应用(redis读书笔记)

    数据结构与对象 简单动态字符串 sds 扩展C语言中的string 添加free剩余字节程度方便内存扩展 length字节长度提高获取长度的效率 动态扩容机制 Redis只会使用C字符串作为字面量 在大多数情况下 Redis使用SDS Si
  • 【Redis】Redis 常用命令

    文章目录 String List Set Hash Zset Geospatial Hyperloglog Bitmap String key value 结构 value 除了字符串还可以是数字 整型 浮点型 set key value
  • 10.BIO、NIO、AIO、多路复用IO的区别(图解)

    学习之前 我们先来了解一下IO模型 同步阻塞IO Blocking IO 即传统的IO模型 同步非阻塞IO Non blocking IO 默认创建的socket都是阻塞的 非阻塞IO要求socket被设置为NONBLOCK 注意这里所说的
  • zabbix监控多实例redis

    Zabbix监控多实例Redis 软件名称 软件版本 Zabbix Server 6 0 17 Zabbix Agent 5 4 1 Redis 6 2 10 Zabbix客户端配置 编辑自动发现脚本 vim usr local zabbi
  • Redis学习 - Tp6配置并使用redis图文详解 小皮面板(三)

    这篇文章主要介绍了Thinkphp6 配置并使用redis的方法 结合实例形式详细分析了Redis的安装 配置以及thinkphp6操作Redis的基本技巧 需要的朋友可以参考下 一 安装redis ThinkPHP内置支持的缓存类型包括f
  • springboot+canal+mysql+redis缓存双写一致性

    canal官网地址 https github com alibaba canal wiki QuickStart 基本上按照官网的步骤来就行 准备 首先服务器上要安装好jdk 因为canal运行需要jdk 同时把canal对应的端口在服务中
  • Redis类型之Geospatial

    1 简介 Redis 3 2 中增加了对GEO类型的支持 GEO Geographic 地理信息的缩写 该类型 就是元素的2维坐标 在地图上就是经纬度 redis基于该类型 提供了经纬度设置 查询 范围查询 距离查询 经纬度Hash等常见操
  • Redis学习(二)---常用命令、数据类型

    文章目录 常用命令 五大基本数据类型 1 String 2 List 3 Set 4 Hash 5 Zset 三种特殊数据类型 1 geospatial 2 Hyperloglog 3 Bitmaps 小结 常用命令 set key val
  • 第十二章_Redis单线程 VS 多线程

    Redis为什么选择单线程 是什么 这种问法其实并不严谨 为啥这么说呢 Redis的版本很多3 x 4 x 6 x 版本不同架构也是不同的 不限定版本问是否单线程也不太严谨 1 版本3 x 最早版本 也就是大家口口相传的redis是单线程
  • Redis Geo:掌握地理空间数据的艺术

    欢迎来到我的博客 代码的世界里 每一行都是一个故事 Redis Geo 掌握地理空间数据的艺术 前言 Redis Geo基本概念 Geo模块的目的 工作原理 地理坐标系统

随机推荐

  • virtualbox禁用硬件虚拟化_Mac版Virtualbox6.1开启嵌套虚拟化

    Virtualbox从6 0版本后 支持起了Intel cpu的嵌套虚拟化 很多用Virtualbox的朋友开始陷入了茫然 为何在BIOS或EFI中开启了CPU硬件虚拟化后 Virtualbox中的vm菜单中启用嵌套虚拟化的框还是灰色不可用
  • 我一下子说出4种分布式ID生成方案,把面试官给搞懵了!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 上一篇文章 我们聊了一下分库分表相关的一些基础知识 具体可以参见 支撑日活百万用户的高并发系统 应该如何设计其数据库架构 这篇文章 我们就接着分库分表的知识 来具体聊
  • 在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)

    对于游戏公司而言 采用游戏脚本lua python等进行开发也很常见 但是很多童鞋对脚本并没有很熟悉的概念 本篇则向大家简单介绍脚本的用途以及在Cocos2dx基础用法 Lua和python这些详细介绍的话 请不太熟悉的童鞋自行百度百科哈
  • 50道SQL练习题及答案与详细分析:

    流传较广的50道SQL训练 奋斗了不知道多久终于写完了 前18道题的难度依次递增 从19题开始的后半部分算是循环练习和额外function的附加练习 难度恢复到普通状态 第9题非常难 我反正没有写出来 如果有写出来了的朋友还请赐教 这50道
  • 教育平台的线上课程智能推荐策略

    题目来自 http www tipdm org 一 背景 近年来 随着互联网与通信技术的高速发展 学习资源的建设与共享呈现出 新的发展趋势 各种网课 慕课 直播课等层出不穷 各种在线教育平台和学习 应用纷纷涌现 尤其是 2020 年春季学期
  • 用Python学习吴恩达机器学习——梯度下降算法理论篇

    开篇词 CSDN专供 欢迎阅读我的文章 本文起先是在B站上进行投稿 一开始是采用吴恩达机器学习2012年版的 目前已经出了十二期了 现在我决定将我摸索出来的学习笔记在各个平台上进行连载 保证同时更新 半年已过 谁知道AI领域已发生很大的变数
  • ajax获取500,使用Python请求库500获取Ajax Json输出

    import requests import json class Yurtici object baseUrl http www yurticikargo com ajaxRoot1 layouts ArikanliHolding Yur
  • 模板之特化与偏特化

    C 模板 C 模板提供了对逻辑结构相同的数据对象通用行为的定义 这些模板运算对象的类型不是实际的数据类型 而是一种参数化的类型 C 模板分为类模板和函数模板那 类模板示例 template
  • MySQL的binlog功能详解

    什么是binlog binlog日志用于记录所有更新了数据或者已经潜在更新了数据 例如 没有匹配任何行的一个DELETE 的所有语句 语句以 事件 的形式保存 它描述数据更改 binlog作用 因为有了数据更新的binlog 所以可以用于实
  • MySQL主从复制

    1 基础环境配置 1 修改主机名 使用hostnamectl命令修改2台主机的主机名 root localhost hostnamectl set hostname db1 root localhost bash root db1 root
  • 干货-YOLOv5检测烟火

    火灾是一种常见的自然灾害和事故 经常给人们的生命财产安全带来威胁 在人力无法及时发现火灾的情况下 火势可能迅速扩散 造成不可挽回的损失 因此 及时发现火灾并采取有效的救援措施至关重要 利用计算机视觉技术检测火灾具有以下意义 提高火灾检测效率
  • 深入理解Socket套接字:必要的参数详解

    深入理解Socket套接字 必要的参数详解 文章目录 深入理解Socket套接字 必要的参数详解 引言 1 1 简介 1 2 Socket套接字的作用 Socket套接字的创建 2 1 Socket函数 2 2 Socket函数参数详解 S
  • 完美的mysql备份脚本

    转自 https www cnblogs com leffss p 7832047 html bin bash 全备方式 一般在从机上执行 适用于小中型mysql数据库 删除15天以前备份 作者 fafu li 时间 2015 08 10
  • 【全栈开发指南】OAuth2授权获取token调试接口的方式

    在我们实际应用接口的调用调试过程中 需要用到token或者刷新token GitEgg支持OAuth2 0协议进行认证授权 这里介绍说明如何通过Postman获取token和refresh token并进行接口调试 1 使用密码模式获取to
  • win10禁用windows更新

    Windows 10系统中有一项Update Orchestrator Service 更新协调器办事 在当地办事窗口中 我们发现 Update Orchestrator Service 状态的启动类型为灰色 无法进行点击修改 2 禁用Wi
  • ESB产品Oracle数据库升级说明

    ESB企业服务总线平台作为支撑企业综合集成的产品 在应用集成 数据集成 数据治理等解决方案都发挥着非常重要的作用 随着产品和解决方案的不断优化和升级 ESB企业服务总线平台功能需要逐步进行完善 不断提升产品功能的完备性 易用性和全面性 为了
  • 类和对象

    面向对象 类和对象 数据存储方面 变量 只能存储一个 如果内容多了 存储起来需要定义n个变量 麻烦 数组 可以存储一组相同数据类型的数据 数据类型相同 如果用数组存储一个人的信息 比较丰富的信息的话 不太方便 例如 吃货联盟中存储订单和菜品
  • Flowable-ui-modeler和MybatisPlus冲突问题

    启动出现报错 file F code test flowable boot target classes com example flowableboot flowable mapper ProcessModelMapper class r
  • 目录功能详解

    bin usr bin usr local bin 是Binary的缩写 这个目录存放着最经常使用的命令 sbin usr sbin usr local sbin s就是Super User的意思 这里存放的是系统管理员使用的系统管理程序
  • SpringBoot配置多个Redis集群数据源+自定义缓存注解实例

    今天找了半天没找到线程的 网上都是多个Redis示例 最还还是自己想办法实现了 两个Redis集群作为数据源 自定义缓存注解 不会做的是否发现好tm难 都不知道怎么动手 做完之后 发现原理其实特别简单 很容易就能实现 分两部分原理和示例代码