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

news2024/12/23 10:00:09

目录

定义

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.coloradmin.cn/o/1625091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024最新版JavaScript逆向爬虫教程-------基础篇之面向对象

目录 一、概念二、对象的创建和操作2.1 JavaScript创建对象的方式2.2 对象属性操作的控制2.3 理解JavaScript创建对象2.3.1 工厂模式2.3.2 构造函数2.3.3 原型构造函数 三、继承3.1 通过原型链实现继承3.2 借用构造函数实现继承3.3 寄生组合式继承3.3.1 对象的原型式继承3.3.2 …

Docker——开源的应用容器的引擎

目录 一、前言 1.虚拟化产品有哪些 1.1寄居架构 1.2源生架构 2.虚拟化产品对比/介绍 2.1虚拟化产品 2.1.1仿真虚拟化 2.1.2半虚拟化 2.1.3全虚拟化 2.2重点 2.2.1KVM——Linux内核来完成的功能和性能 2.2.2ESXI——用的比较多 二、Docker概述 1.Docker定义 2.Do…

Docker容器:网络模式与资源控制

目录 一、Docker 网络模式 1、Docker 网络实现原理 2、Docker 网络模式概述 2.1 Host 模式 2.2 Container 模式 2.3 None 模式 2.4 Bridge 模式 2.5 自定义网络&#xff08;user-defined network&#xff09; 3、配置 docker 网络模式 3.1 查看网络基础命令 3.1.1 查…

Git操作与异常处理

文章目录 常用操作1、代码拉取2、代码提交3、暂存区状态4、提交代码5、推送远程仓库 异常处理【1】报错信息&#xff1a;Cannot pull into a repository with state: MERGING【2】报错信息&#xff1a;You have not concluded your merge (MERGE_HEAD exists)【3】报错信息&…

PM2管理器无法使用解决方法

之前的项目全是依靠PM2管理器部署的&#xff0c;部署快速&#xff0c;也便于管理 但是宝塔实在是bug毛病太多&#xff0c;最近这两天又出毛病了 这次的问题是在PM2管理器的node版本中无法进行版本切换&#xff0c;如果是第一次使用PM2的话甚至无法设置node版本&#xff0c;之前…

陪丨玩丨系丨统搭建制作流程APP小程序H5多端源码前后端一次性交付,本地授权,无二次费用!可定制开发!

陪丨玩app小程序H5开发&#xff0c;软件搭建&#xff0c;程序制作、系统设计 数据存储是陪玩平台源码的重点&#xff0c;没有数据库&#xff0c;用户的账号信息、平台产生的数据都无法顺利存储和读取&#xff0c;不能让用户拥有完善良好的用户体验。虽然是存放在服务器上&…

体验馆设计要考虑哪些需求

1、和谐 许多人认为&#xff0c;在所有规律中&#xff0c;和谐是体验馆设计最重要的一条规律。体验馆是由很多因素&#xff0c;包括布局、照明、色彩、图表、展品、展架、展具等组成。一个好的体验馆&#xff0c;须融合着所有的元素。 但万事都有一个度的把握&#xff0c;过于完…

Linux论坛搭建

1.安装httpd服务 1.1安装httpd软件 [rootlocalhost yum.repos.d]# dnf install httpd 1.2.修改httpd的配置 [rootlocalhost yum.repos.d]# vim /etc/httpd/conf/httpd.conf 1.3.启动这个httpd服务,并查看它的状态 [rootlocalhost yum.repos.d]# systemctl start httpd [ro…

LabVIEW多通道数据采集系统

LabVIEW多通道数据采集系统 在当今的数据采集领域&#xff0c;随着技术的不断进步和应用需求的日益增长&#xff0c;对数据采集系统的速度、稳定性和灵活性要求也越来越高。基于千兆以太网和LabVIEW的多通道数据采集系统&#xff0c;以其高速的数据传输能力和强大的数据处理功…

MySQL中什么情况下会出现索引失效?如何排查索引失效?

目录 1-引言&#xff1a;什么是MySQL的索引失效&#xff1f;(What、Why)1-1 索引失效定义1-2 为什么排查索引失效 2- 索引失效的原因及排查&#xff08;How&#xff09;2-1 索引失效的情况① 索引列参与计算② 对索引列进行函数操作③ 查询中使用了 OR 两边有范围查询 > 或 …

自动雷达水位雨量监测系统的组成

TH-SW2随着科技的不断发展&#xff0c;自动雷达水位雨量监测系统成为了现代气象和水文观测的重要工具。该系统结合了雷达技术与自动化控制技术&#xff0c;为气象、水文、环境等领域提供了实时、准确的数据支持。下面&#xff0c;我们将详细介绍自动雷达水位雨量监测系统的组成…

使用R语言进行简单的主成分分析(PCA)

主成分分析&#xff08;PCA&#xff09;是一种广泛使用的数据降维技术&#xff0c;它可以帮助我们识别数据中最重要的特征并简化复杂度&#xff0c;同时尽量保留原始数据的关键信息。在这篇文章中&#xff0c;我们将通过一个具体的例子&#xff0c;使用R语言实现PCA&#xff0c…

零门槛接入,开源的物联网超级中枢:ThingsBoard

ThingsBoard&#xff1a;重塑万物互联世界&#xff0c;无限可能拓展- 精选真开源&#xff0c;释放新价值。 概览 ThingsBoard是一款强大而灵活的开源物联网&#xff08;IoT&#xff09;平台&#xff0c;以其高度可扩展性和企业级功能赢得了全球开发者与企业的青睐。它无缝集成…

主机电源相关测试脚本:ping通 - 停止唤醒

简介&#xff1a;在进行一些涉及服务器或者PC主机的电源关机、开机、重启相关的测试中&#xff0c;远程开机或者唤醒&#xff0c;结合pythonping模块处理ping&#xff0c;可以节省出不必要的硬性等待时间&#xff0c;规避开机时间不稳定的情况&#xff0c;而且不会造成堵塞现象…

(一)Dataframes安装与类型 #Julia数据分析 #CDA学习打卡

目录 一. Julia简介 二. Dataframe构造方法 1&#xff09;访问列的方式 &#xff08;a&#xff09;判断严格相等 i. 切片严格相等是true ii. 复制严格相等是false &#xff08;b&#xff09;判断相等 i. 切片相等是true ii. 复制相等是true 2&#xff09;获取列名称 …

LORA详解

参考论文&#xff1a; low rank adaption of llm 背景介绍&#xff1a; 自然语言处理的一个重要范式包括对一般领域数据的大规模预训练和对特定任务或领域的适应处理。在自然语言处理中的许多应用依赖于将一个大规模的预训练语言模型适配到多个下游应用上。这种适配通常是通过…

unity学习(91)——云服务器调试——补充catch和if判断

本机局域网没问题&#xff0c;服务器放入云服务器后&#xff0c;会出现异常。 想要找到上面的问题&#xff0c;最简单的方法就是在云服务器上下载一个vs2022&#xff01; 应该不是大小端的问题&#xff01; 修改一下readMessage的内容&#xff0c;可以直接粘贴到云服务器的。 …

【Python系列】字符串操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PostgreSQL的学习心得和知识总结(一百三十九)|深入理解PostgreSQL数据库GUC参数 allow_alter_system 的使用和原理

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

K8s: 部署 kubernetes dashboard

部署 Dashboard K8s 官方有一个项目叫 dashboard&#xff0c;通过这个项目更方便监控集群的状态 官方地址: https://github.com/kubernetes/dashboard 通常我们通过命令行 $ kubectl get po -n kube-system 能够查看到集群所有的组件&#xff0c;但这样的方式比较不太直观 …