学习笔记-Redis系统集成

  • 内容简介

    此篇文章主要介绍Redis与项目之间的集成,上一篇文章介绍的是如何搭建Redis的服务,这里则是介绍在项目中如何使用Redis,其中又分为单机版和集群版,还有接口的设计以及版本之间的相互切换。此处只是简单的介绍,更详细内容大家可以参考网上其他资料,希望对路过的你有所帮助^_^


  • 背景介绍

    1.Redis服务

    已经搭建好一台包含Redis单机版和集群版的服务,并且都处于启动状态,并可以正常与外界进行连接(可以通过Redis的客户端进行测试连接)

    2.项目介绍

    基于SSM框架搭建的maven项目,当首页加载时,需要从Redis中获取首页的图片数据

    3.工具准备

    Java中使用Jedis操作Redis,在项目中添加相应的依赖,此处jedis.version为2.7.2

    <!-- Redis客户端 -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>${jedis.version}</version>
    </dependency>

  • 具体介绍

    1.接口以及实现类

    在项目开发过程中,一般根据项目运行环境不同,服务相应的配置有会做出改变。在开发环境中,由于数据量比较小,Redis单机版就能满足开发需求;但是在生产环境时,不管是考虑到数据量还是Redis服务的高可用,一般都是会使用Redis集群。为了满足这种实际情况,我们可以通过工厂模式的思路来设计Jedis的接口:

    
    #Jedis接口
    
    public interface JedisClient {
        String set(String key, String value);
        String get(String key);
        Boolean exists(String key);
        Long expire(String key, int seconds);
        Long ttl(String key);
        Long incr(String key);
        Long hset(String key, String field, String value);
        String hget(String key, String field);
        Long hdel(String key, String... field);
    }
    
    
    #Jedis单机版实现类
    
    public class JedisClientPool implements JedisClient {
    
        # 单机版使用线程池中获取
        private JedisPool jedisPool;
    
        @Override
        public String set(String key, String value) {
            Jedis jedis = jedisPool.getResource();
            String result = jedis.set(key, value);
            jedis.close();
            return result;
        }
    
        ......
    
    }
    
    
    #Jedis集群版实现类
    
    public class JedisClientCluster implements JedisClient {
    
        # 集群版获取方式
        private JedisCluster jedisCluster;
    
        @Override
        public String set(String key, String value) {
            return jedisCluster.set(key, value);
        }
    
        ......
    
    }

    2.配置文件

    接口和实现类设计好以后,有人会疑问,我们怎么控制注入的实现类呢?总不能每次都修改代码吧?那么接下来,我们只需要在使用Jedis的类注入接口,通过配置文件配置需要使用的实现类,即可做到不修改代码的情况下切换Redis的服务版本。接下来介绍配置文件的配置:

    <!-- redis连接单机版 -->
    <bean id="jedisClientPool" class="cn.taotao.common.jedis.JedisClientPool">
        <property name="jedisPool" ref="jedisPool"/>
    </bean>
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
        <constructor-arg name="host" value="${redis.host}"/>
        <constructor-arg name="port" value="${redis.port}"/>
    </bean>
    
    <!-- redis连接集群版 -->
    <bean id="jedisClientCluster" class="cn.taotao.common.jedis.JedisClientCluster">
        <property name="jedisCluster" ref="jedisCluster"/>
    </bean>
    <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
        <constructor-arg name="nodes">
            <set>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${redis.cluster.host1}"/>
                    <constructor-arg name="port" value="${redis.cluster.port1}"/>
                </bean>
    
                ......
    
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${redis.cluster.host6}"/>
                    <constructor-arg name="port" value="${redis.cluster.port6}"/>
                </bean>
            </set>
        </constructor-arg>
    </bean>

    具体情况下,只要把不需要的bean注释即可,不同环境下,通过不同的配置文件,即可实现使用不同的Redis服务


    3.具体代码

    一般使用缓存的逻辑就是:首先从缓存中根据唯一key取值,如果有直接返回;没有对应的value则进行数据库的交互,最后存入缓存。此处需要注意的就是我们在进行缓存相关的操作时,应该注意异常的处理,缓存相关的异常不能影响主业务逻辑的进行:

    public XXX getXXXX(String key) {
        //添加缓存,redis抛异常需要处理掉,不能影响正常业务进行
        try {
            //有,直接返回
            String json = jedisClient.hget(REDIS_KEY_CONTENT_LIST, key);
            if (StringUtils.isNotBlank(json)){
    
                return XXX;
    
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    
        System.out.println("find by db ...");
    
        //存入缓存中
        try {
            jedisClient.hset(REDIS_KEY_CONTENT_LIST, key, JsonUtils.objectToJson(list));
        } catch (Exception e){
            e.printStackTrace();
        }
    
    }   

  • 结语

    此处简单介绍了redis与项目集成的相关操作,还有关于缓存同步,过期时间设置等集体操作没有一一列举,感兴趣的同学可以参考其他资料进行学习,文中若有不对的地方,欢迎指正,仅供参考。


本文作者: little-dragon
个人博客: http://littledragon.cn
版权声明: 原创文章,有问题请评论中留言。非商业转载请注明作者及出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值