spring整合redis-----ShardedJedisPool实现
redis是一个非常优秀的缓存框架,良好的api,强悍的性能,是现在非常非常火的缓存框架。下面来介绍一下spring中是如何整合redis的
分析:
- 需要引入依赖
- 需要配置连接池,就是一个xml文件,然后参数写在properties中
- 需要写一个工具类,主要方法有,从这个连接池中得到redis资源,销毁redis资源。
- 需要再写一个service,这个就是具体的得到redis实例之后,保存缓存save方法,取得缓存get方法。具体是按照自己业务逻辑来实现。比如说key如何生成了,反正最后都是用的一个redis的api。这里就简单演示一下。
pom.xml
<!-- redis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> <type>jar</type> </dependency>
redis.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="classpath:redis.properties" /> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" /> <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool" scope="singleton" > <constructor-arg index="0" ref="jedisPoolConfig" /> <constructor-arg index="1"> <list> <bean class="redis.clients.jedis.JedisShardInfo"> <constructor-arg name="host" value="${redis.host}"/> <constructor-arg name="port" value="${redis.port}"/> <constructor-arg name="timeout" value="${redis.timeout}"/> </bean> </list> </constructor-arg> </bean> </beans>
redis.properties
redis.host=127.0.0.1 redis.port=6379 redis.timeout=3000
RedisPool.java
package com.mmall.service; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPool; import javax.annotation.Resource; /** * Created by 敲代码的卡卡罗特 * on 2018/4/1 14:21. */ @Service("redisPool") @Slf4j public class RedisPool { @Resource(name = "shardedJedisPool") private ShardedJedisPool shardedJedisPool; public ShardedJedis instance() { return shardedJedisPool.getResource(); } public void safeClose(ShardedJedis shardedJedis) { try { if (shardedJedis != null) { shardedJedis.close(); } } catch (Exception e) { log.error("return redis resource exception", e); } } }
CacheService.java
package com.mmall.service; import com.google.common.base.Joiner; import com.mmall.beans.CacheKeyConstants; import com.mmall.util.JsonMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import redis.clients.jedis.ShardedJedis; import javax.annotation.Resource; /** * Created by 敲代码的卡卡罗特 * on 2018/4/1 14:22. */ @Service @Slf4j public class SysCacheService { @Resource(name = "redisPool") private RedisPool redisPool; //保存value public void saveCache(String toSavedValue, int timeoutSeconds, CacheKeyConstants prefix) { saveCache(toSavedValue, timeoutSeconds, prefix, null); } //保存value public void saveCache(String toSavedValue, int timeoutSeconds, CacheKeyConstants prefix, String... keys) { if (toSavedValue == null) { return; } ShardedJedis shardedJedis = null; try { String cacheKey = generateCacheKey(prefix, keys); shardedJedis = redisPool.instance(); shardedJedis.setex(cacheKey, timeoutSeconds, toSavedValue); } catch (Exception e) { log.error("save cache exception, prefix:{}, keys:{}", prefix.name(), JsonMapper.obj2String(keys), e); } finally { redisPool.safeClose(shardedJedis); } } //如何生成key private String generateCacheKey(CacheKeyConstants prefix, String... keys) { String key = prefix.name(); if (keys != null && keys.length > 0) { key += "_" + Joiner.on("_").join(keys); } return key; } //根据key得到value public String getFromCache(CacheKeyConstants prefix, String... keys) { ShardedJedis shardedJedis = null; String cacheKey = generateCacheKey(prefix, keys); try { shardedJedis = redisPool.instance(); String value = shardedJedis.get(cacheKey); return value; } catch (Exception e) { log.error("get from cache exception, prefix:{}, keys:{}", prefix.name(), JsonMapper.obj2String(keys), e); return null; } finally { redisPool.safeClose(shardedJedis); } } }
然后在application.xml中引入redis的配置文件就ok
<import resource="redis.xml" />