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


    目录

    定义

    Redis 集群升级

    模拟单机服务 RedisUtils

    模拟集群 EGM

    模拟集群 IIR

    定义使⽤接⼝

    实现调⽤代码

    代码实现

    定义适配接⼝

    实现集群使⽤服务

    EGMCacheAdapter

    IIRCacheAdapter

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

    JDKProxy

    JDKInvocationHandler

    测试验证


    定义

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

    Redis 集群升级

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

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

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

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

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

    模拟单机服务 RedisUtils

    模拟集群 EGM

    模拟集群 IIR

    定义使⽤接⼝

    1. public interface CacheService {
    2. String get(final String key);
    3. void set(String key, String value);
    4. void set(String key, String value, long timeout, TimeUnit timeUnit);
    5. void del(String key);
    6. }

    实现调⽤代码

    1. public class CacheServiceImpl implements CacheService {
    2. private RedisUtils redisUtils = new RedisUtils();
    3. public String get(String key) {
    4. return redisUtils.get(key);
    5. }
    6. public void set(String key, String value) {
    7. redisUtils.set(key, value);
    8. }
    9. public void set(String key, String value, long timeout, TimeUnit timeUnit) {
    10. redisUtils.set(key, value, timeout, timeUnit);
    11. }
    12. public void del(String key) {
    13. redisUtils.del(key);
    14. }
    15. }

    代码实现

    定义适配接⼝

    1. public interface ICacheAdapter {
    2. String get(String key);
    3. void set(String key, String value);
    4. void set(String key, String value, long timeout, TimeUnit timeUnit);
    5. void del(String key);
    6. }

    实现集群使⽤服务

    EGMCacheAdapter

    1. public class EGMCacheAdapter implements ICacheAdapter {
    2. private EGM egm = new EGM();
    3. public String get(String key) {
    4. return egm.gain(key);
    5. }
    6. public void set(String key, String value) {
    7. egm.set(key, value);
    8. }
    9. public void set(String key, String value, long timeout, TimeUnit timeUnit) {
    10. egm.setEx(key, value, timeout, timeUnit);
    11. }
    12. public void del(String key) {
    13. egm.delete(key);
    14. }
    15. }

    IIRCacheAdapter

    1. public class IIRCacheAdapter implements ICacheAdapter {
    2. private IIR iir = new IIR();
    3. public String get(String key) {
    4. return iir.get(key);
    5. }
    6. public void set(String key, String value) {
    7. iir.set(key, value);
    8. }
    9. public void set(String key, String value, long timeout, TimeUnit timeUnit) {
    10. iir.setExpire(key, value, timeout, timeUnit);
    11. }
    12. public void del(String key) {
    13. iir.del(key);
    14. }
    15. }

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

    JDKProxy

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

    JDKInvocationHandler

    1. public class JDKInvocationHandler implements InvocationHandler {
    2. private ICacheAdapter cacheAdapter;
    3. public JDKInvocationHandler(ICacheAdapter cacheAdapter) {
    4. this.cacheAdapter = cacheAdapter;
    5. }
    6. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    7. return ICacheAdapter.class.getMethod(method.getName(), ClassLoaderUtils.getClazzByArgs(args)).invoke(cacheAdapter, args);
    8. }
    9. }

    测试验证

    1. @Test
    2. public void test_CacheService() throws Exception {
    3. CacheService proxy_EGM = JDKProxy.getProxy(CacheServiceImpl.class, new EGMCacheAdapter());
    4. proxy_EGM.set("user_name_01","⼩亮哥");
    5. String val01 = proxy_EGM.get("user_name_01");
    6. System.out.println(val01);
    7. CacheService proxy_IIR = JDKProxy.getProxy(CacheServiceImpl.class, new IIRCacheAdapter());
    8. proxy_IIR.set("user_name_01","⼩亮哥");
    9. String val02 = proxy_IIR.get("user_name_01");
    10. System.out.println(val02);
    11. }

  • 相关阅读:
    手机机型响应式设置2
    torch、(二) Generators
    一招教你如何高效批量导入与更新数据
    基于Unity3D的AVG卡牌游戏设计与实现
    Go语言中的defer关键字
    Windows Server 2022 简体中文版、英文版下载 (updated Jun 2022)
    深刻解析数据库技术的要点以及应对策略 (软件设计师笔记)
    torch 写模型遇到 RuntimeError: Found dtype Double but expected Float
    在安卓模拟器(mumu为例)上联调app并且用Charles抓包
    第十九章绘图
  • 原文地址:https://blog.csdn.net/fanghailiang2016/article/details/138200158