package cn.com.zhangruilin.cache;
import cn.com.zhangruilin.util.ApplicationContextUtil;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.util.concurrent.locks.ReadWriteLock;
/**
* 用redisTemplate来实现对redis操作时,发现对key的展示不太友好(展示出来的key看不懂)
* 用StringRedisTemplate来实现对redis操作时,发现对value不太友好,必须为String类型,
* 这就造成了对value进行序列化,才能使用StringRedisTemplate来实现对redis操作
*
* 所以,可以组合使用,用redisTemplate或者StringRedisTemplate来实现对redis操作时,key序列化使用StringRedisSerializer,,value可以使用JdkSerializationRedisSerializer,
* 这样都可以很友好的展示;
*
* 注意:
* 1.RedisTemplate和StringRedisTemplate,不同之处在于StringRedisTemplate的Key-Value序列化使用
* 的是StringRedisSerializer,RedisTemplate对象是默认使用JdkSerializationRedisSerializer实现。
*
* 2.在组合使用时,注意添加数据到缓存 和 从缓存中获取数据时,必须保证key和value序列化必须一致。
*/
public class MyCache3 implements Cache {
private String id;
//id:操作数据库的dao层方法的全限定名
public MyCache3(String id) {
this.id = id;
}
@Override
public String getId() {
System.out.println(id);
return id;
}
//添加数据到缓存
@Override
public void putObject(Object key, Object value) {
System.out.println("添加数据");
RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtil.getBean("redisTemplate");
//创建一个StringRedisSerializer的序列化对象
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//修改key的序列化方式
redisTemplate.setKeySerializer(stringRedisSerializer);
HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.put(id,key.toString(),value);
}
//从缓存中换取数据
@Override
public Object getObject(Object key) {
System.out.println("获取数据");
RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtil.getBean("redisTemplate");
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
HashOperations hashOperations = redisTemplate.opsForHash();
Object o = hashOperations.get(id, key.toString());
return o;
}
@Override
public Object removeObject(Object key) {
return null;
}
//清空缓存
@Override
public void clear() {
System.out.println("清空缓存");
RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtil.getBean("redisTemplate");
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.delete(id);
}
@Override
public int getSize() {
return 186;
}
@Override
public ReadWriteLock getReadWriteLock() {
return null;
}
}
记一记 免得需要的时候找不到 就不香了