<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<cache:annotation-driven cache-manager="cacheManager"/>
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean class="com.common.cache.redis.RedisCache">
<property name="name" value="myCache"/>
<property name="redisTemplate" ref="redisTemplate"/>
</bean>
</set>
</property>
</bean>
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}"/>
<property name="maxTotal" value="${redis.maxTotal}"/>
<property name="testOnBorrow" value="${redis.testOnBorrow}"/>
</bean>
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}"/>
<property name="port" value="${redis.port}"/>
<property name="password" value="${redis.pass}"/>
<property name="poolConfig" ref="poolConfig"/>
<property name="usePool" value="true"/>
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
/**
* Cache adapter for Redis.
*/
public class RedisCache implements Cache {
private RedisTemplate<String, Object> redisTemplate;
private String name;
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void setName(String name) {
this.name = name;
}
@Override
public String getName() {
return this.name;
}
@Override
public Object getNativeCache() {
return this.redisTemplate;
}
/**
* 从缓存中获取key
*/
@Override
public ValueWrapper get(Object key) {
final String keyf = key.toString();
Object object;
object = redisTemplate.execute((RedisCallback<Object>) connection -> {
byte[] key1 = keyf.getBytes();
byte[] value = connection.get(key1);
if (value == null) {
return null;
}
return SerializationUtils.deserialize(value);
});
return (object != null ? new SimpleValueWrapper(object) : null);
}
/**
* 将一个新的key保存到缓存中
* 先拿到需要缓存key名称和对象,然后将其转成ByteArray
*/
@Override
public void put(Object key, Object value) {
final String keyf = key.toString();
final Object valuef = value;
final long liveTime = 86400;
redisTemplate.execute((RedisCallback<Long>) connection -> {
byte[] keyb = keyf.getBytes();
byte[] valueb = SerializationUtils.serialize(valuef);
connection.set(keyb, valueb);
if (liveTime > 0) {
connection.expire(keyb, liveTime);
}
return 1L;
});
}
/**
* 删除key
*/
@Override
public void evict(Object key) {
final String keyf = key.toString();
redisTemplate.execute((RedisCallback<Long>) connection -> connection.del(keyf.getBytes()));
}
/**
* 清空key
*/
@Override
public void clear() {
redisTemplate.execute((RedisCallback<String>) connection -> {
connection.flushDb();
return "ok";
});
}
@Override
public <T> T get(Object key, Class<T> type) {
return null;
}
@Override
public <T> T get(Object o, Callable<T> callable) {
return null;
}
@Override
public ValueWrapper putIfAbsent(Object key, Object value) {
return null;
}
}
@Cacheable(value = "myCache", key = "getMethodName()")