使用背景
项目中因为一些数据来源于第三方系统,偶尔会有第三方接口不通,数据库不可用以及网络问题,所以选择redis用作中间件,用来缓存第三方的数据信息。
使用RedisTemplate
RedisTemplate是Spring Data Redis提供给用户的最高级的抽象客户端,用户可直接通过RedisTemplate进行多种操作。
//RedisAccessor是RedisTemplate定义普通属性的基类,不直接使用
//RedisOperations是指定RedisTemplate实现的Redis connection操作的集合接口
//BeanClassLoaderAware是给其实现类是设置类加载器的接口
RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware
RedisTemplate内封装了很多操作接口:
ValueOperations:简单K-V操作
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对map类型的数据操作
ListOperations:针对list类型的数据操作
针对数据的“序列化/反序列化”,提供了多种可选择策略(RedisSerializer):
1.JdkSerializationRedisSerializer:POJO对象的存取场景,使用JDK本身序列化机制,将pojo类通过ObjectInputStream/ObjectOutputStream进行序列化操作,最终redis-server中将存储字节序列。是目前最常用的序列化策略。
2.StringRedisSerializer:Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是“newString(bytes,charset)”和“string.getBytes(charset)”的直接封装。是最轻量级和高效的策略。
3.JacksonJsonRedisSerializer:jackson-json工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。因为jackson工具在序列化和反序列化时,需要明确指定Class类型,因此此策略封装起来稍微复杂。
4.OxmSerializer:提供了将javabean与xml之间的转换能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存储的数据将是xml工具。不过使用此策略,编程将会有些难度,而且效率最低;不建议使用。【需要spring-oxm模块的支持】
项目使用情况:
RedisTemplate各种数据结构的操作
操作String的常用方法
set void set(K key, V value);
set void set(K key, V value, long timeout, TimeUnit unit);
set void set(K key, V value, long offset);
redisTemplate.opsForValue().set("num","12345");
redisTemplate.opsForValue().get("num") //输出结果为12345
redisTemplate.opsForValue().set("num","123",10l, TimeUnit.SECONDS);
redisTemplate.opsForValue().get("num")//设置的是10秒失效,十秒之内查询有结果,十秒之后返回为null
template.opsForValue().set("key","hello world");
template.opsForValue().set("key","redis", 6);//hello redis
等等很多基础操作。。。。。
操作List的常用方法
Long size(K key);
返回存储在键中的列表的长度。如果键不存在,则将其解释为空列表,并返回0。当key存储的值不是列表时返回错误。
Long leftPush(K key, V value);
将所有指定的值插入存储在键的列表的头部。如果键不存在,则在执行推送操作之前将其创建为空列表。(从左边插入)
Long leftPushAll(K key, V… values);
批量把一个数组插入到列表中。
Long rightPush(K key, V value);
将所有指定的值插入存储在键的列表的头部。如果键不存在,则在执行推送操作之前将其创建为空列表。(从右边插入)
Long remove(K key, long count, Object value);
从存储在键中的列表中删除等于值的元素的第一个计数事件。
计数参数以下列方式影响操作:
count> 0:删除等于从头到尾移动的值的元素。
count <0:删除等于从尾到头移动的值的元素。
count = 0:删除等于value的所有元素。
template.opsForList().size("list");
template.opsForList().leftPush("list","java");
template.opsForList().leftPush("list","python");
template.opsForList().leftPush("list","c++");
template.opsForList().rightPush("listRight","java");
template.opsForList().rightPush("listRight","python");
template.opsForList().rightPush("listRight","c++");
操作Hash的常用方法
Long delete(H key, Object… hashKeys);
删除给定的哈希hashKeys
Boolean hasKey(H key, Object hashKey);
确定哈希hashKey是否存在
HV get(H key, Object hashKey);
从键中的哈希获取给定hashKey的值
template.opsForHash().delete("redisHash","name");
template.opsForHash().hasKey("redisHash","666")
操作Set,ZSet的常用方法均可参照api文档使用,不去列举了。
参考:https://blog.csdn.net/sinat_27629035/article/details/102652185