抽象工厂模式(Redis 集群升级)

ops/2025/4/2 15:23:05/

目录

定义

Redis 集群升级

模拟单机服务 RedisUtils

模拟集群 EGM

模拟集群 IIR

定义使⽤接⼝

实现调⽤代码

代码实现

定义适配接⼝

实现集群使⽤服务

EGMCacheAdapter

IIRCacheAdapter

定义抽象⼯程代理类和实现

JDKProxy

JDKInvocationHandler

测试验证


定义

抽象⼯⼚模式与⼯⼚⽅法模式虽然主要意图都是为了解决,接⼝选择问题。但在实现上,抽象⼯⼚是⼀个中⼼⼯⼚,创建其他⼯⼚的模式。

Redis 集群升级

随着这次的升级,可以预⻅的问题会有;

1. 很多服务⽤到了Redis需要⼀起升级到集群。

2. 需要兼容集群A和集群B,便于后续的灾备。

3. 两套集群提供的接⼝和⽅法各有差异,需要做适配。

4. 不能影响到⽬前正常运⾏的系统。

模拟单机服务 RedisUtils

模拟集群 EGM

模拟集群 IIR

定义使⽤接⼝

public interface CacheService {String get(final String key);void set(String key, String value);void set(String key, String value, long timeout, TimeUnit timeUnit);void del(String key);
}

实现调⽤代码

public class CacheServiceImpl implements CacheService {private RedisUtils redisUtils = new RedisUtils();public String get(String key) {return redisUtils.get(key);}public void set(String key, String value) {redisUtils.set(key, value);}public void set(String key, String value, long timeout, TimeUnit timeUnit) {redisUtils.set(key, value, timeout, timeUnit);}public void del(String key) {redisUtils.del(key);}
}

代码实现

定义适配接⼝

public interface ICacheAdapter {String get(String key);void set(String key, String value);void set(String key, String value, long timeout, TimeUnit timeUnit);void del(String key);
}

实现集群使⽤服务

EGMCacheAdapter

public class EGMCacheAdapter implements ICacheAdapter {private EGM egm = new EGM();public String get(String key) {return egm.gain(key);}public void set(String key, String value) {egm.set(key, value);}public void set(String key, String value, long timeout, TimeUnit timeUnit) {egm.setEx(key, value, timeout, timeUnit);}public void del(String key) {egm.delete(key);}
}

IIRCacheAdapter

public class IIRCacheAdapter implements ICacheAdapter {private IIR iir = new IIR();public String get(String key) {return iir.get(key);}public void set(String key, String value) {iir.set(key, value);}public void set(String key, String value, long timeout, TimeUnit timeUnit) {iir.setExpire(key, value, timeout, timeUnit);}public void del(String key) {iir.del(key);}
}

定义抽象⼯程代理类和实现

JDKProxy

public static <T> T getProxy(Class<T> interfaceClass, ICacheAdapter cacheAdapter) throws Exception {InvocationHandler handler = new JDKInvocationHandler(cacheAdapter);ClassLoader classLoader = Thread.currentThread().getContextClassLoader();Class<?>[] classes = interfaceClass.getInterfaces();return (T) Proxy.newProxyInstance(classLoader, new Class[]{classes[0]}, handler);
}

JDKInvocationHandler

public class JDKInvocationHandler implements InvocationHandler {private ICacheAdapter cacheAdapter;public JDKInvocationHandler(ICacheAdapter cacheAdapter) {this.cacheAdapter = cacheAdapter;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return ICacheAdapter.class.getMethod(method.getName(), ClassLoaderUtils.getClazzByArgs(args)).invoke(cacheAdapter, args);}}

测试验证

@Test
public void test_CacheService() throws Exception {CacheService proxy_EGM = JDKProxy.getProxy(CacheServiceImpl.class, new EGMCacheAdapter());proxy_EGM.set("user_name_01","⼩亮哥");String val01 = proxy_EGM.get("user_name_01");System.out.println(val01);CacheService proxy_IIR = JDKProxy.getProxy(CacheServiceImpl.class, new IIRCacheAdapter());proxy_IIR.set("user_name_01","⼩亮哥");String val02 = proxy_IIR.get("user_name_01");System.out.println(val02);
}


http://www.ppmy.cn/ops/22675.html

相关文章

景区文旅实景剧本杀小程序系统开发搭建

开发景区文旅实景剧本杀小程序系统需要以下步骤&#xff1a; 1. 确定需求和功能&#xff1a;根据景区文旅实景剧本杀的特点和需求&#xff0c;确定系统需要具备的功能&#xff0c;如实景探索、剧情互动、角色扮演、任务挑战等。 2. 设计系统架构&#xff1a;根据需求和功能&a…

基于微信小程序的旅游系统的设计与实现

基于微信小程序的旅游系统的设计与实现 Design and Implementation of a Tourism System based on WeChat Mini Program 完整下载链接:基于微信小程序的旅游系统的设计与实现 文章目录 基于微信小程序的旅游系统的设计与实现摘要第一章 绪论1.1 研究背景与意义1.2 国内外研究…

如何讲好ppt演讲技巧(4篇)

如何讲好ppt演讲技巧&#xff08;4篇&#xff09; 如何讲好PPT演讲技巧&#xff08;四篇&#xff09; **篇&#xff1a;精心准备&#xff0c;奠定演讲基础 一个成功的PPT演讲&#xff0c;离不开精心的准备。首先&#xff0c;要确定演讲的主题和目标&#xff0c;确保演讲内容清…

CSS合集

前言&#xff1a; 之前CSS的文章都是单独写出&#xff0c;本篇文章&#xff0c;将他们作为集合的形式进行整理。 链接&#xff08;点击查看&#xff09;&#xff1a; CSS的使用 CSS的语法规则——基础选择器 CSS的语法规则——高级选择器 CSS的网页美化功能 CSS盒子模型的…

基于Springboot+Vue的Java项目-火车票订票系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

在 Windows 系统上安装 TeamViewer 13

在 Windows 系统上安装 TeamViewer 13 References 默认安装到所有用户 同意协议 安装目录 勾选内容 打开文件位置 打开 rClientID.exe Extras -> Options -> Advanced Show advanced options -> Display language 重新启动TeamViewer 语言可修改为中文简体 …

搭建git私人仓库

环境准备&#xff1a; 服务端&#xff1a;centos7 客户端&#xff1a;win11 1、安装git sudo apt-get install git2、创建git用户 adduser git修改密码 passwd git查看是否添加成功 cd /home && ls -al3、导入公钥 # 1.切换到git账号 su git# 2.进入 git账户的主…

android room 数据库升级的原则

1.如果新加了一张数据表则什么都不用干直接database那里将数据库版本升1 就可以nichuang 在entities里增加新加的entity ProviderMeta.DB_VERSION 版本号增1 room会自动生成 一个ProviderMeta.DB_VERSION 版本号的json文件 比如实例中升级到70 就会生成一个70.json的文件这是r…