redis 开发接口兼容单机版和集群版

本文介绍了如何通过设计模式实现Redis客户端接口的兼容性,以适应开发环境的单机版和生产环境的集群版。通过定义一个接口继承JedisCommands,创建适配器类和具体实现类,最后在Spring配置文件中切换实现,实现环境间的无缝切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:因为开发环境的redis通常为单机版,而生产环境的redis为集群版。所以能不能只需配置文件修改就能实现代码中兼容单机版和集群版。

1、定义一个接口继承JedisCommands(Common interface for sharded and non-sharded Jedis)

public interface JedisClient extends JedisCommands {

}

2、使用 适配器 设计模式,定义一个JedisClientAdapter适配器继承JedisClient接口,所有方法都为空实现。最好将类定义成抽象类abstract。

3、创建单机版和集群版实现类,都继承JedisClientAdapter,将想要实现的方法进行重写
单机版:

/**
 * redis单机版,通过redis.clients.jedis.JedisPool
 */
public class JedisClientPool extends JedisClientAdapter {

    @Autowired
    private JedisPool jedisPool;

    @Override
    public String set(String key, String value) {
        Jedis jedis = jedisPool.getResource();
        jedis.set(key,value);
        jedis.close();
        return value;
    }

    @Override
    public String get(String key) {
        Jedis jedis = jedisPool.getResource();
        String value = jedis.get(key);
        return value;
    }
}

集群版:

/**
 * redis集群版,通过redis.clients.jedis.JedisCluster
 */
public class JedisClientCluster extends JedisClientAdapter {

    @Autowired
    private JedisCluster jedisCluster;

    @Override
    public String set(String key, String value) {
        jedisCluster.set(key,value);
        return value;
    }

    @Override
    public String get(String key) {
        return jedisCluster.get(key);
    }
}

 4、spring配置文件 applicationContext.xml

    <context:component-scan base-package="com.heima.jedis"></context:component-scan>

    <!--redis单机版-->
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
       <constructor-arg name="host" value="192.168.25.129"></constructor-arg>
        <constructor-arg name="port" value="6379"></constructor-arg>
    </bean>

    <!--redis集群版-->
    <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
        <constructor-arg>
            <set>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.129"></constructor-arg>
                    <constructor-arg name="port" value="7001"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.129"></constructor-arg>
                    <constructor-arg name="port" value="7002"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.129"></constructor-arg>
                    <constructor-arg name="port" value="7003"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.129"></constructor-arg>
                    <constructor-arg name="port" value="7004"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.129"></constructor-arg>
                    <constructor-arg name="port" value="7005"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.129"></constructor-arg>
                    <constructor-arg name="port" value="7006"></constructor-arg>
                </bean>
            </set>
        </constructor-arg>
    </bean>

    <!-- jedisClientPool 和 jedisClientCluster 必须要注释掉一个否则spring初始化会报错。
    即通过接口JedisClient查找实现类会找到两个-->
<!-- <bean id="jedisClientPool" class="com.heima.jedis.JedisClientPool">

    </bean>-->

    <bean id="jedisClientCluster" class="com.heima.jedis.JedisClientCluster">

    </bean>
<beans>

 5、测试

    public static void main(String[] args) {
        ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        //获取的时候,通过接口。必须保证spring配置文件只有一个实现类,否则报错
        JedisClient jedis = application.getBean(JedisClient.class);
        jedis.set("jedisClientPool","JedisClientCluster");
        String value = jedis.get("jedisClientPool");
        System.out.println("得到的值集:"+value);
    }

获取实现类的时候通过JedisClient接口获取,这样测试环境和生产环境切换的时候,只需要修改配置文件applicationContext.xml。例如,现在applicationContext.xml有两个JedisClient的实现类,把需要的不需要的那个注释掉就ok了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值