-
内容简介
此篇文章主要介绍Redis与项目之间的集成,上一篇文章介绍的是如何搭建Redis的服务,这里则是介绍在项目中如何使用Redis,其中又分为单机版和集群版,还有接口的设计以及版本之间的相互切换。此处只是简单的介绍,更详细内容大家可以参考网上其他资料,希望对路过的你有所帮助_
-
背景介绍
1.Redis服务
已经搭建好一台包含Redis单机版和集群版的服务,并且都处于启动状态,并可以正常与外界进行连接(可以通过Redis的客户端进行测试连接)
2.项目介绍
基于SSM框架搭建的maven项目,当首页加载时,需要从Redis中获取首页的图片数据
3.工具准备
Java中使用Jedis操作Redis,在项目中添加相应的依赖,此处jedis.version为2.7
<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
版权声明: 原创文章,有问题请评论中留言。非商业转载请注明作者及出处。