学习笔记-Redis系统集成

来源:互联网 发布:ibm人工智能沃森 编辑:程序博客网 时间:2024/06/08 02:46
  • 内容简介

    此篇文章主要介绍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
版权声明: 原创文章,有问题请评论中留言。非商业转载请注明作者及出处。

原创粉丝点击