简化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的主要内容,如果未能解决你的问题,请参考以下文章

看Spring Data如何简化数据操作

看Spring Data如何简化数据操作

springboot整合redis

微服务连接不上redis会直接访问数据库吗

idea没有配置redis链接为啥还能访问到数据

Redis使用BitMap用户签到统计BitMap解决缓存击穿方案 及 UV(HyperLogLog) 统计页面访问量 与 独立访问量