zoukankan      html  css  js  c++  java
  • 简化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
    

    ---恢复内容结束---

  • 相关阅读:
    测试常用的sql语句总结
    测试常用的Linux命令总结
    【转载】vim 中如何替换选中行或指定几行内的文本
    1074 Reversing Linked List
    1077 Kuchiguse
    LC 355. Design Twitter
    LCP 5. 发 LeetCoin
    LC 1409. Queries on a Permutation With Key
    1095 Cars on Campus
    LC 1369. Get the Second Most Recent Activity
  • 原文地址:https://www.cnblogs.com/hengzhou/p/9542720.html
Copyright © 2011-2022 走看看