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

目录

定义

[Redis 集群升级](#Redis 集群升级)

[模拟单机服务 RedisUtils](#模拟单机服务 RedisUtils)

[模拟集群 EGM](#模拟集群 EGM)

[模拟集群 IIR](#模拟集群 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);
}
相关推荐
秋落风声1 小时前
【数据结构】---图
java·数据结构··graph
2401_857622661 小时前
Spring Boot新闻推荐系统:性能优化策略
java·spring boot·后端
qinzechen1 小时前
分享几个做题网站------学习网------工具网;
java·c语言·c++·python·c#
hakesashou1 小时前
python交互式命令时如何清除
java·前端·python
攒了一袋星辰1 小时前
今日指数项目项目集成RabbitMQ与CaffienCatch
java·分布式·rabbitmq
wrx繁星点点1 小时前
事务的四大特性(ACID)
java·开发语言·数据库
IT学长编程1 小时前
计算机毕业设计 Java酷听音乐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·音乐系统·计算机毕业设计选题
AskHarries1 小时前
如何优雅的处理NPE问题?
java·spring boot·后端
IT学长编程2 小时前
计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·毕业论文·协同过滤算法·计算机毕业设计选题·个性化音乐推荐系统
小小娥子2 小时前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存