简化Redis数据访问代码RedisTemplate
Posted zzzhouheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简化Redis数据访问代码RedisTemplate相关的知识,希望对你有一定的参考价值。
---恢复内容开始---
Redis数据结构简介:
Redis可以存储键与5中数据结构类型之间的映射,这5中数据结构类型分别是;String(字符串),List(列表),Set(集合),Hash(散列)和ZSet(有序集合)。
下面对这5中数据结构做简单的介绍:
String:可以是字符串,整数和浮点数。对整个字符串和字符串其中的一部分执行操作;对象的浮点数执行自增(increment)或者自减(decrement)。
List:一个链表,链表上的每个节点都包含一个字符串;从链表的两端推入和弹出元素,根据偏移量对链表作出裁剪(trim);读取单个或者是多个元素,根据值来查找或者是移除元素。
Set:包含字符串的无序收集器(unorderedcollection),并且被包含的每个字符串都是独一无二的、各不相同;添加获取或者是移除单个元素;检查一个元素是否存在于某个集合中,计算交集并集和差集,从集合里随机获取元素。
Hash:包含键值对的无序散列表;添加获取移除单个键值对。获取所有的键值对。
ZSet:字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定;添加,获取,删除单个元素;根据分值范围(range)或者成员来获取元素。
下面介绍spring封装的RedisTemplate对这5种数据结构的运用做分析:
RedisTemplate的介绍:
spring封装了redisTemplate对象来进行对redis的各种操作,它支持所有的redis原生api。
类型参数(Type Parameter)
K:模板工作的Redis键类型(通常是一个字符串),RedisTemplate<String,Object>
注意:如果没有特殊情况,切勿定义为RedisTemplate<Object,Object>,否则根据里氏替换原则,使用的时候会造成类型错误。
V:是模板工作中Redis值的类型
RedisTemplate定义了对5种数据结构操作:
redisTemplate.opsForValue(); // 操作字符串 redisTemplate.opsForHash(); // 操作hash redisTemplate.opsForList(); // 操作List redisTemplate.opsForSet(); // 操作Set redisTemplate.opsForZSet(); // 操作有序Set
StringRedisTemplate与RedisTemplate:
两者的关系是StringRedisTemplate继承RedisTemplate。
两者的数据是不共通的,也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据;RedisTemplate只能管理RedisTemplate里面的数据。
SDR默认采用的序列化策略有两种,一种是String的序列化策略。一种是jdk的序列化策略。
StringRedisTemplate默认采用的是String序列化策略,保存的是key和value都是采用这种策略序列化保存的。
RedisTemplate默认采用的是jdk的序列化策略,保存的key和value都是采用此策略序列化保存。
RedisTemplate的配置如下:
@Bean public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jack2JsonRedisSerializer<Object>(Object.class); ObjectMpper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.All,JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); RedisTemplate<String,Object> template = new RedisTemplate<String,Object>(); template.setConnectionFactory(redisConnectionFactory); template.setKeySerializer(jackson2JsonRedisSerializer); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashKeySerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; }
Redis的String数据结构(推荐使用StringRedisTemplate)
注意:如果是RedisTemplate需要修改序列化方式。
RedisSerializer<String> stringRedisSerializer = new RedisSerializer(); template.setKeySerializer(stringRedisSerializer); template.setValueSerilizer(stringRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); template.setHashValueSerializer(stringRedisSerializer);
set void set(K key,V value);
使用:redisTemplate.opsForValue().set("name","tom"); 结果:redisTemplate.opsForValue().get("name"); // 输出结果为tomset
set void set(K key,V value,long timeOut,TimeUnit unit);
使用:redisTemplate.opsForValue().set("name","tom",10,TimeUnit.SECONDS); 结果:redisTemplate.opsForValue().get("name") // 由于设置的是十秒失效,十秒之内查询有结果,十秒之后返回为null
set void set(K,key,V value,long offset);
该方法是用value参数覆写(override)给定key所储存的字符串值,从偏移量offset开始。
使用:template.opsForValue().set("key","Helo world"); templste.opsForValue().set("key","redis",6); System.out.println("**********"+template.opsForValue().get("key")); 输出结果:**********Hello redis
selfAbsent Boolean selfAbsent(K key,V value);
使用:System.out.println(template.opsForValue().setIfAbsent("multi1","multi1"));// false System.out.println(template.opsForValue().setIfAbsent("multi2","multi2"));// true 结果:false表示以前已经存在,true表示以前不存在
multiSet void multiSet(Map <? extends K, ? extends V> m);为多个键分别设置他们的值
使用: Map<String,String> maps = new HashMap<String,String>(); maps.put("multi1","multi1"); maps.put("multi2","multi2\'); maps.put("muliti3","multi3"); template.opsForValue().multiSet(maps); List<String> keys = new ArrayList<String>(); keys.add("multi1"); keys.add("multi2"); keys.add("multi3"); System.out.println(template.opsForValue().multiGet(keys)); 结果: [multi1,multi2,multi3]
multiSetIfAbsent Boolean multiSetIfAbsent(Map<? extends K, ? extends V> m);为多个键分别设置它们的值,如果存在则返回false,不存在则返回true
使用: Map<String,String> maps = new HashMap<String,String>(); maps.put("multi1","multi1"); maps.put("multi2","multi2"); maps.put("multi3","multi3");
Maps<String,String> maps2 = new HashMap<String,String>();
maps2.put("multi11","multi11");
maps2.put("multi22","multi22");
maps2.put("multi33","multi33");
System.out.println(template.opsForValue().multiSetIfAbsent(maps))
System.out.println(template.opsForValue().multiSetIfAbsent(maps2))
// 如果存在则返回false,不存在则返回true
get V get (Object key);
使用: template.opsForValue().set("key","Hello world"); System.out.println("********"+template.opsForValue().get("key")); 输出结果:"*********"Hello world
getAndSet V getAndSet(K key, V value);
设置键的字符串值并返回其旧值
使用:template.opsForValue().set("getSetTest","test"); System.out.println(template.opsForValue().getAndSet("getSetTest","test2")); 结果:test
---恢复内容结束---
以上是关于简化Redis数据访问代码RedisTemplate的主要内容,如果未能解决你的问题,请参考以下文章
Redis使用BitMap用户签到统计BitMap解决缓存击穿方案 及 UV(HyperLogLog) 统计页面访问量 与 独立访问量