Spring中使用RedisTemplate操做Redis(spring-data-redis)

Redis 數據結構簡介

Redis能夠存儲鍵與5種不一樣數據結構類型之間的映射,這5種數據結構類型分別爲String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。javascript

下面來對這5種數據結構類型做簡單的介紹:java

結構類型 結構存儲的值 結構的讀寫能力
String 能夠是字符串、整數或者浮點數 對整個字符串或者字符串的其中一部分執行操做;對象和浮點數執行自增(increment)或者自減(decrement)
List 一個鏈表,鏈表上的每一個節點都包含了一個字符串 從鏈表的兩端推入或者彈出元素;根據偏移量對鏈表進行修剪(trim);讀取單個或者多個元素;根據值來查找或者移除元素
Set 包含字符串的無序收集器(unorderedcollection),而且被包含的每一個字符串都是獨一無二的、各不相同 添加、獲取、移除單個元素;檢查一個元素是否存在於某個集合中;計算交集、並集、差集;從集合裏賣弄隨機獲取元素
Hash 包含鍵值對的無序散列表 添加、獲取、移除單個鍵值對;獲取全部鍵值對
Zset 字符串成員(member)與浮點數分值(score)之間的有序映射,元素的排列順序由分值的大小決定 添加、獲取、刪除單個元素;根據分值範圍(range)或者成員來獲取元素

Redis 5種數據結構的概念大體介紹到這邊,下面將結合Spring封裝的RedisTemplate來對這5種數據結構的運用進行演示python

RedisTemplate介紹

Spring封裝了RedisTemplate對象來進行對Redis的各類操做,它支持全部的Redis原生的api。RedisTemplate位於spring-data-redis包下。c++

RedisTemplate在Spring代碼中的結構以下:

org.springframework.data.redis.core
Class RedisTemplate<K,V>
java.lang.Object
org.springframework.data.redis.core.RedisAccessor
org.springframework.data.redis.core.RedisTemplate
<K,V>

Type Parameters:
Kredis

  • the Redis key type against which the template works (usually a String)
    模板中的Redis key的類型(一般爲String)如:RedisTemplate<String, Object>
    注意:若是沒特殊狀況,切勿定義成RedisTemplate<Object, Object>,不然根據里氏替換原則,使用的時候會形成類型錯誤 。

Vspring

  • the Redis value type against which the template works
    模板中的Redis value的類型

RedisTemplate中定義了對5種數據結構操做

redisTemplate.opsForValue();//操做字符串
redisTemplate.opsForHash();//操做hash
redisTemplate.opsForList();//操做list
redisTemplate.opsForSet();//操做set
redisTemplate.opsForZSet();//操做有序set

StringRedisTemplate與RedisTemplate

  • 二者的關係是StringRedisTemplate繼承RedisTemplate。apache

  • 二者的數據是不共通的;也就是說StringRedisTemplate只能管理StringRedisTemplate裏面的數據,RedisTemplate只能管理RedisTemplate中的數據。c#

  • SDR默認採用的序列化策略有兩種,一種是String的序列化策略,一種是JDK的序列化策略。api

    StringRedisTemplate默認採用的是String的序列化策略,保存的key和value都是採用此策略序列化保存的。數組

    RedisTemplate默認採用的是JDK的序列化策略,保存的key和value都是採用此策略序列化保存的。

RedisTemplate配置以下:

複製代碼
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
Jackson2JsonRedisSerializer
<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper 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> stringSerializer = new StringRedisSerializer();
template.setKeySerializer(stringSerializer );
template.setValueSerializer(stringSerializer );
template.setHashKeySerializer(stringSerializer );
template.setHashValueSerializer(stringSerializer );

public interface ValueOperations<K,V>
Redis operations for simple (or in Redis terminology 'string') values.
ValueOperations能夠對String數據結構進行操做:

  • set void set(K key, V value);



    使用:redisTemplate.opsForValue().set("name","tom");
    結果:redisTemplate.opsForValue().get(
    "name") 輸出結果爲tom
  • set void set(K key, V value, long timeout, TimeUnit unit);

    使用:redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);
    結果:redisTemplate.opsForValue().get(
    "name")因爲設置的是10秒失效,十秒以內查詢有結果,十秒以後返回爲null
  • set void set(K key, V value, long offset);
    該方法是用 value 參數覆寫(overwrite)給定 key 所儲存的字符串值,從偏移量 offset 開始

    使用:template.opsForValue().set("key","hello world");
    template.opsForValue().set(
    "key","redis", 6);
    System.out.println(
    "***************"+template.opsForValue().get("key"));
    結果:
    ***************hello redis
  • setIfAbsent Boolean setIfAbsent(K key, V value);

    使用:System.out.println(template.opsForValue().setIfAbsent("multi1","multi1"));//false  multi1以前已經存在
    System.out.println(template.opsForValue().setIfAbsent("multi111","multi111"));//true multi111以前不存在
    結果: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(
    "multi3","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(
    "multi11","multi11");
    maps.put(
    "multi22","multi22");
    maps.put(
    "multi33","multi33");
    Map
    <String,String> maps2 = new HashMap<String, String>();
    maps2.put(
    "multi1","multi1");
    maps2.put(
    "multi2","multi2");
    maps2.put(
    "multi3","multi3");
    System.out.println(template.opsForValue().multiSetIfAbsent(maps));
    System.out.println(template.opsForValue().multiSetIfAbsent(maps2));
    結果:
    true false
    複製代碼
  • 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
  • multiGet List<V> multiGet(Collection<K> keys);
    爲多個鍵分別取出它們的值

    複製代碼
    使用:Map<String,String> maps = new HashMap<String, String>();
    maps.put(
    "multi1","multi1");
    maps.put(
    "multi2","multi2");
    maps.put(
    "multi3","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]
    複製代碼
  • increment Long increment(K key, long delta);
    支持整數

    使用:template.opsForValue().increment("increlong",1);
    System.out.println(
    "***************"+template.opsForValue().get("increlong"));
    結果:
    ***************1
  • increment Double increment(K key, double delta);
    也支持浮點數

    使用:template.opsForValue().increment("increlong",1.2);
    System.out.println(
    "***************"+template.opsForValue().get("increlong"));
    結果:
    ***************2.2
  • append Integer append(K key, String value);
    若是key已經存在而且是一個字符串,則該命令將該值追加到字符串的末尾。若是鍵不存在,則它被建立並設置爲空字符串,所以APPEND在這種特殊狀況下將相似於SET。

    使用:template.opsForValue().append("appendTest","Hello");
    System.out.println(template.opsForValue().get(
    "appendTest"));
    template.opsForValue().append(
    "appendTest","world");
    System.out.println(template.opsForValue().get(
    "appendTest"));
    結果:Hello Helloworld
  • get String get(K key, long start, long end);
    截取key所對應的value字符串

    複製代碼
    使用:appendTest對應的value爲Helloworld
    System.out.println(
    "*********"+template.opsForValue().get("appendTest",0,5));
    結果:
    *********Hellow
    使用:System.out.println(
    "*********"+template.opsForValue().get("appendTest",0,-1));
    結果:
    *********Helloworld
    使用:System.out.println(
    "*********"+template.opsForValue().get("appendTest",-3,-1));
    結果:
    *********rld
    複製代碼
  • size Long size(K key);
    返回key所對應的value值得長度

    使用:template.opsForValue().set("key","hello world");
      System.out.println("***************"+template.opsForValue().size("key"));
    結果:***************11
  • setBit Boolean setBit(K key, long offset, boolean value);
    對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)
    key鍵對應的值value對應的ascii碼,在offset的位置(從左向右數)變爲value

    複製代碼
    使用:template.opsForValue().set("bitTest","a");
    // 'a' 的ASCII碼是 97。轉換爲二進制是:01100001
    // 'b' 的ASCII碼是 98 轉換爲二進制是:01100010
    // 'c' 的ASCII碼是 99 轉換爲二進制是:01100011
    //由於二進制只有0和1,在setbit中true爲1,false爲0,所以我要變爲'b'的話第六位設置爲1,第七位設置爲0
    template.opsForValue().setBit("bitTest",6, true);
    template.opsForValue().setBit(
    "bitTest",7, false);
    System.out.println(template.opsForValue().get(
    "bitTest"));
    結果:b
    複製代碼
  • getBit Boolean getBit(K key, long offset);
    獲取鍵對應值的ascii碼的在offset處位值

    使用:System.out.println(template.opsForValue().getBit("bitTest",7));
    結果:false

Redis的List數據結構

這邊咱們把RedisTemplate序列化方式改回以前的

複製代碼
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper 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.setKeySerializer(jackson2JsonRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
複製代碼

public interface ListOperations<K,V>
Redis列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素導列表的頭部(左邊)或者尾部(右邊)
ListOperations專門操做list列表:

  • List<V> range(K key, long start, long end);
    返回存儲在鍵中的列表的指定元素。偏移開始和中止是基於零的索引,其中0是列表的第一個元素(列表的頭部),1是下一個元素

    使用:System.out.println(template.opsForList().range("list",0,-1));
    結果:[c#, c++, python, java, c#, c#]
  • void trim(K key, long start, long end);
    修剪現有列表,使其只包含指定的指定範圍的元素,起始和中止都是基於0的索引

    使用:System.out.println(template.opsForList().range("list",0,-1));
    template.opsForList().trim("list",1,-1);//裁剪第一個元素
    System.out.println(template.opsForList().range("list",0,-1));
    結果:[c#, c++, python, java, c#, c#]
    [c++, python, java, c#, c#]
  • Long size(K key);
    返回存儲在鍵中的列表的長度。若是鍵不存在,則將其解釋爲空列表,並返回0。當key存儲的值不是列表時返回錯誤。

    使用:System.out.println(template.opsForList().size("list"));
    結果:6
  • Long leftPush(K key, V value);
    將全部指定的值插入存儲在鍵的列表的頭部。若是鍵不存在,則在執行推送操做以前將其建立爲空列表。(從左邊插入)

    複製代碼
    使用:template.opsForList().leftPush("list","java");
    template.opsForList().leftPush(
    "list","python");
    template.opsForList().leftPush(
    "list","c++");
    結果:返回的結果爲推送操做後的列表的長度
    1 2 3
    複製代碼
  • Long leftPushAll(K key, V... values);
    批量把一個數組插入到列表中

    使用:String[] stringarrays = new String[]{"1","2","3"};
    template.opsForList().leftPushAll(
    "listarray",stringarrays);
    System.out.println(template.opsForList().range(
    "listarray",0,-1));
    結果:[
    3, 2, 1]
  • Long leftPushAll(K key, Collection<V> values);
    批量把一個集合插入到列表中

    複製代碼
    使用:List<Object> strings = new ArrayList<Object>();
    strings.add(
    "1");
    strings.add(
    "2");
    strings.add(
    "3");
    template.opsForList().leftPushAll(
    "listcollection4", strings);
    System.out.println(template.opsForList().range(
    "listcollection4",0,-1));
    結果:[
    3, 2, 1]
    複製代碼
  • Long leftPushIfPresent(K key, V value);
    只有存在key對應的列表才能將這個value值插入到key所對應的列表中

    複製代碼
    使用:System.out.println(template.opsForList().leftPushIfPresent("leftPushIfPresent","aa"));
    System.out.println(template.opsForList().leftPushIfPresent(
    "leftPushIfPresent","bb"));
    ==========分割線===========
    System.out.println(template.opsForList().leftPush(
    "leftPushIfPresent","aa"));
    System.out.println(template.opsForList().leftPushIfPresent(
    "leftPushIfPresent","bb"));
    結果:
    0 0 ==========分割線=========== 1 2
    複製代碼
  • Long leftPush(K key, V pivot, V value);
    把value值放到key對應列表中pivot值的左面,若是pivot值存在的話

    使用:template.opsForList().leftPush("list","java","oc");
    System.out.print(template.opsForList().range(
    "list",0,-1));
    結果:[c
    ++, python, oc, java, c#, c#]
  • Long rightPush(K key, V value);
    將全部指定的值插入存儲在鍵的列表的頭部。若是鍵不存在,則在執行推送操做以前將其建立爲空列表。(從右邊插入)

    複製代碼
    使用:template.opsForList().rightPush("listRight","java");
    template.opsForList().rightPush(
    "listRight","python");
    template.opsForList().rightPush(
    "listRight","c++");
    結果:
    1 2 3
    複製代碼
  • Long rightPushAll(K key, V... values);

    使用:String[] stringarrays = new String[]{"1","2","3"};
    template.opsForList().rightPushAll(
    "listarrayright",stringarrays);
    System.out.println(template.opsForList().range(
    "listarrayright",0,-1));
    結果:[
    1, 2, 3]
  • Long rightPushAll(K key, Collection<V> values);

    複製代碼
    使用:List<Object> strings = new ArrayList<Object>();
    strings.add(
    "1");
    strings.add(
    "2");
    strings.add(
    "3");
    template.opsForList().rightPushAll(
    "listcollectionright", strings);
    System.out.println(template.opsForList().range(
    "listcollectionright",0,-1));
    結果:[
    1, 2, 3]
    複製代碼
  • Long rightPushIfPresent(K key, V value);
    只有存在key對應的列表才能將這個value值插入到key所對應的列表中

    複製代碼
    使用:System.out.println(template.opsForList().rightPushIfPresent("rightPushIfPresent","aa"));
    System.out.println(template.opsForList().rightPushIfPresent(
    "rightPushIfPresent","bb"));
    System.out.println(
    "==========分割線===========");
    System.out.println(template.opsForList().rightPush(
    "rightPushIfPresent","aa"));
    System.out.println(template.opsForList().rightPushIfPresent(
    "rightPushIfPresent","bb"));
    結果:
    0 0 ==========分割線=========== 1 2
    複製代碼
  • Long rightPush(K key, V pivot, V value);
    把value值放到key對應列表中pivot值的右面,若是pivot值存在的話

    使用:System.out.println(template.opsForList().range("listRight",0,-1));
    template.opsForList().rightPush(
    "listRight","python","oc");
    System.out.println(template.opsForList().range(
    "listRight",0,-1));
    結果:[java, python, c
    ++]
    [java, python, oc, c
    ++]
  • void set(K key, long index, V value);
    在列表中index的位置設置value值

    使用:System.out.println(template.opsForList().range("listRight",0,-1));
    template.opsForList().set(
    "listRight",1,"setValue");
    System.out.println(template.opsForList().range(
    "listRight",0,-1));
    結果:[java, python, oc, c
    ++]
    [java, setValue, oc, c
    ++]
  • Long remove(K key, long count, Object value);
    從存儲在鍵中的列表中刪除等於值的元素的第一個計數事件。
    計數參數如下列方式影響操做:
    count> 0:刪除等於從頭至尾移動的值的元素。
    count <0:刪除等於從尾到頭移動的值的元素。
    count = 0:刪除等於value的全部元素。

    使用:System.out.println(template.opsForList().range("listRight",0,-1));
    template.opsForList().remove(
    "listRight",1,"setValue");//將刪除列表中存儲的列表中第一次次出現的「setValue」。
    System.out.println(template.opsForList().range("listRight",0,-1));
    結果:[java, setValue, oc, c
    ++]
    [java, oc, c
    ++]
  • V index(K key, long index);
    根據下表獲取列表中的值,下標是從0開始的

    使用:System.out.println(template.opsForList().range("listRight",0,-1));
    System.out.println(template.opsForList().index("listRight",2));
    結果:[java, oc, c++]
    c++
  • V leftPop(K key);
    彈出最左邊的元素,彈出以後該值在列表中將不復存在

    複製代碼
    使用:System.out.println(template.opsForList().range("list",0,-1));
    System.out.println(template.opsForList().leftPop(
    "list"));
    System.out.println(template.opsForList().range(
    "list",0,-1));
    結果: [c
    ++, python, oc, java, c#, c#] c++ [python, oc, java, c#, c#]
    複製代碼
  • V leftPop(K key, long timeout, TimeUnit unit);
    移出並獲取列表的第一個元素, 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。

    使用:用法與 leftPop(K key);同樣
  • V rightPop(K key);
    彈出最右邊的元素,彈出以後該值在列表中將不復存在

    使用:    System.out.println(template.opsForList().range("list",0,-1));
    System.out.println(template.opsForList().rightPop(
    "list"));
    System.out.println(template.opsForList().range(
    "list",0,-1));
    結果:[python, oc, java, c#, c#] c# [python, oc, java, c#]
  • V rightPop(K key, long timeout, TimeUnit unit);
    移出並獲取列表的最後一個元素, 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。

    使用:用法與 rightPop(K key);同樣
  • V rightPopAndLeftPush(K sourceKey, K destinationKey);
    用於移除列表的最後一個元素,並將該元素添加到另外一個列表並返回。

    複製代碼
    使用:System.out.println(template.opsForList().range("list",0,-1));
    template.opsForList().rightPopAndLeftPush(
    "list","rightPopAndLeftPush");
    System.out.println(template.opsForList().range(
    "list",0,-1));
    System.out.println(template.opsForList().range(
    "rightPopAndLeftPush",0,-1));
    結果:[oc, java,c#] [oc, java] [c#]
    複製代碼
  • V rightPopAndLeftPush(K sourceKey, K destinationKey, long timeout, TimeUnit unit);
    用於移除列表的最後一個元素,並將該元素添加到另外一個列表並返回,若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。

    使用:用法與rightPopAndLeftPush(K sourceKey, K destinationKey)同樣

Redis的Hash數據機構

Redis的散列可讓用戶將多個鍵值對存儲到一個Redis鍵裏面。
public interface HashOperations<H,HK,HV>
HashOperations提供一系列方法操做hash:

複製代碼
初始數據:
//template.opsForHash().put("redisHash","name","tom");
//template.opsForHash().put("redisHash","age",26);
//template.opsForHash().put("redisHash","class","6");

//Map<String,Object> testMap = new HashMap();
//testMap.put("name","jack");
//testMap.put("age",27);
//testMap.put("class","1");
//template.opsForHash().putAll("redisHash1",testMap);

複製代碼
  • Long delete(H key, Object... hashKeys);
    刪除給定的哈希hashKeys

    使用:System.out.println(template.opsForHash().delete("redisHash","name"));
    System.out.println(template.opsForHash().entries(
    "redisHash"));
    結果:
    1
    {
    class=6, age=28.1}
  • Boolean hasKey(H key, Object hashKey);
    肯定哈希hashKey是否存在

    使用:System.out.println(template.opsForHash().hasKey("redisHash","age"));
    System.out.println(template.opsForHash().hasKey(
    "redisHash","ttt"));
    結果:
    true
    false
  • HV get(H key, Object hashKey);
    從鍵中的哈希獲取給定hashKey的值

    使用:System.out.println(template.opsForHash().get("redisHash","age"));
    結果:
    26
  • List<HV> multiGet(H key, Collection<HK> hashKeys);
    從哈希中獲取給定hashKey的值

    使用:List<Object> kes = new ArrayList<Object>();
    kes.add(
    "name");
    kes.add(
    "age");

    System.out.println(template.opsForHash().multiGet(
    "redisHash",kes)); 結果:[jack, 28.1]
  • Long increment(H key, HK hashKey, long delta);
    經過給定的delta增長散列hashKey的值(整型)

    使用:System.out.println(template.opsForHash().get("redisHash","age"));
    System.out.println(template.opsForHash().increment(
    "redisHash","age",1));
    結果:
    26 27
  • Double increment(H key, HK hashKey, double delta);
    經過給定的delta增長散列hashKey的值(浮點數)

    使用:System.out.println(template.opsForHash().get("redisHash","age"));
    System.out.println(template.opsForHash().increment(
    "redisHash","age",1.1));
    結果:
    27 28.1
  • Set<HK> keys(H key);
    獲取key所對應的散列表的key

    使用:System.out.println(template.opsForHash().keys("redisHash1"));
    //redisHash1所對應的散列表爲{class=1, name=jack, age=27}
    結果:[name, class, age]
  • Long size(H key);
    獲取key所對應的散列表的大小個數

    使用:System.out.println(template.opsForHash().size("redisHash1"));
    //redisHash1所對應的散列表爲{class=1, name=jack, age=27}
    結果:3
  • void putAll(H key, Map<? extends HK, ? extends HV> m);
    使用m中提供的多個散列字段設置到key對應的散列表中

    複製代碼
    使用:Map<String,Object> testMap = new HashMap();
    testMap.put(
    "name","jack");
    testMap.put(
    "age",27);
    testMap.put(
    "class","1");
    template.opsForHash().putAll(
    "redisHash1",testMap);
    System.out.println(template.opsForHash().entries(
    "redisHash1"));
    結果:{
    class=1, name=jack, age=27}
    複製代碼
  • void put(H key, HK hashKey, HV value);
    設置散列hashKey的值

    使用:template.opsForHash().put("redisHash","name","tom");
    template.opsForHash().put(
    "redisHash","age",26);
    template.opsForHash().put(
    "redisHash","class","6");
    System.out.println(template.opsForHash().entries(
    "redisHash"));
    結果:{age
    =26, class="6", name=tom}
  • Boolean putIfAbsent(H key, HK hashKey, HV value);
    僅當hashKey不存在時才設置散列hashKey的值。

    使用:System.out.println(template.opsForHash().putIfAbsent("redisHash","age",30));
    System.out.println(template.opsForHash().putIfAbsent(
    "redisHash","kkk","kkk"));
    結果:
    false
    true
  • List<HV> values(H key);
    獲取整個哈希存儲的值根據密鑰

    使用:System.out.println(template.opsForHash().values("redisHash"));
    結果:[tom,
    26, 6]
  • Map<HK, HV> entries(H key);
    獲取整個哈希存儲根據密鑰

    使用:System.out.println(template.opsForHash().entries("redisHash"));
    結果:{age
    =26, class="6", name=tom}
  • Cursor<Map.Entry<HK, HV>> scan(H key, ScanOptions options);
    使用Cursor在key的hash中迭代,至關於迭代器。

    複製代碼
    使用:Cursor<Map.Entry<Object, Object>> curosr = template.opsForHash().scan("redisHash", ScanOptions.ScanOptions.NONE);
    while(curosr.hasNext()){
    Map.Entry
    <Object, Object> entry = curosr.next();
    System.out.println(entry.getKey()
    +":"+entry.getValue());
    }
    結果:age:
    28.1 class:6 kkk:kkk
    複製代碼

Redis的Set數據結構

Redis的Set是string類型的無序集合。集合成員是惟一的,這就意味着集合中不能出現重複的數據。
Redis 中 集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是O(1)。
public interface SetOperations<K,V>
SetOperations提供了對無序集合的一系列操做:

  • Long add(K key, V... values);
    無序集合中添加元素,返回添加個數
    也能夠直接在add裏面添加多個值 如:template.opsForSet().add("setTest","aaa","bbb")

    使用:String[] strarrays = new String[]{"strarr1","sgtarr2"};
    System.out.println(template.opsForSet().add(
    "setTest", strarrays));
    結果:
    2
  • Long remove(K key, Object... values);
    移除集合中一個或多個成員

    使用:String[] strarrays = new String[]{"strarr1","sgtarr2"};
    System.out.println(template.opsForSet().remove(
    "setTest",strarrays));
    結果:
    2
  • V pop(K key);
    移除並返回集合中的一個隨機元素

    使用:System.out.println(template.opsForSet().pop("setTest"));
    System.out.println(template.opsForSet().members(
    "setTest"));
    結果:bbb [aaa, ccc]
  • Boolean move(K key, V value, K destKey);
    將 member 元素從 source 集合移動到 destination 集合

    使用:template.opsForSet().move("setTest","aaa","setTest2");
    System.out.println(template.opsForSet().members(
    "setTest"));
    System.out.println(template.opsForSet().members(
    "setTest2"));
    結果:[ccc] [aaa]
  • Long size(K key);
    無序集合的大小長度

    使用:System.out.println(template.opsForSet().size("setTest"));
    結果:
    1
  • Boolean isMember(K key, Object o);
    判斷 member 元素是不是集合 key 的成員

    使用:System.out.println(template.opsForSet().isMember("setTest","ccc"));
    System.out.println(template.opsForSet().isMember(
    "setTest","asd"));
    結果:
    true
    false
  • Set<V> intersect(K key, K otherKey);
    key對應的無序集合與otherKey對應的無序集合求交集

    使用:System.out.println(template.opsForSet().members("setTest"));
    System.out.println(template.opsForSet().members(
    "setTest2"));
    System.out.println(template.opsForSet().intersect(
    "setTest","setTest2"));
    結果:[aaa, ccc] [aaa] [aaa]
  • Set<V> intersect(K key, Collection<K> otherKeys);
    key對應的無序集合與多個otherKey對應的無序集合求交集

    複製代碼
    使用:System.out.println(template.opsForSet().members("setTest"));
    System.out.println(template.opsForSet().members(
    "setTest2"));
    System.out.println(template.opsForSet().members(
    "setTest3"));
    List
    <String> strlist = new ArrayList<String>();
    strlist.add(
    "setTest2");
    strlist.add(
    "setTest3");

    System.out.println(template.opsForSet().intersect(
    "setTest",strlist)); 結果:[aaa, ccc] [aaa] [ccc, aaa] [aaa]
    複製代碼
  • Long intersectAndStore(K key, K otherKey, K destKey);
    key無序集合與otherkey無序集合的交集存儲到destKey無序集合中

    複製代碼
    使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
    System.out.println(
    "setTest2:" + template.opsForSet().members("setTest2"));
    System.out.println(template.opsForSet().intersectAndStore(
    "setTest","setTest2","destKey1"));
    System.out.println(template.opsForSet().members(
    "destKey1"));
    結果:setTest:[ddd, bbb, aaa, ccc]
    setTest2:[ccc, aaa]
    2 [aaa, ccc]
    複製代碼
  • Long intersectAndStore(K key, Collection<K> otherKeys, K destKey);
    key對應的無序集合與多個otherKey對應的無序集合求交集存儲到destKey無序集合中

    複製代碼
    使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
    System.out.println(
    "setTest2:" + template.opsForSet().members("setTest2"));
    System.out.println(
    "setTest3:" + template.opsForSet().members("setTest3"));
    List
    <String> strlist = new ArrayList<String>();
    strlist.add(
    "setTest2");
    strlist.add(
    "setTest3");
    System.out.println(template.opsForSet().intersectAndStore(
    "setTest",strlist,"destKey2"));
    System.out.println(template.opsForSet().members(
    "destKey2"));
    結果:setTest:[ddd, bbb, aaa, ccc] setTest2:[ccc, aaa] setTest3:[ccc, aaa]
    2 [aaa, ccc]
    複製代碼
  • Set<V> union(K key, K otherKey);
    key無序集合與otherKey無序集合的並集

    使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
    System.out.println(
    "setTest2:" + template.opsForSet().members("setTest2"));
    System.out.println(template.opsForSet().union(
    "setTest","setTest2"));
    結果:setTest:[ddd, bbb, aaa, ccc]
    setTest2:[ccc, aaa] [ccc, aaa, ddd, bbb]
  • Set<V> union(K key, Collection<K> otherKeys);
    key無序集合與多個otherKey無序集合的並集

    複製代碼
    使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
    System.out.println(
    "setTest2:" + template.opsForSet().members("setTest2"));
    System.out.println(
    "setTest3:" + template.opsForSet().members("setTest3"));
    List
    <String> strlist = new ArrayList<String>();
    strlist.add(
    "setTest2");
    strlist.add(
    "setTest3");
    System.out.println(template.opsForSet().union(
    "setTest",strlist));
    結果:setTest:[ddd, bbb, aaa, ccc] setTest2:[ccc, aaa] setTest3:[xxx, ccc, aaa] [ddd, xxx, bbb, aaa, ccc]
    複製代碼
  • Long unionAndStore(K key, K otherKey, K destKey);
    key無序集合與otherkey無序集合的並集存儲到destKey無序集合中

    複製代碼
    使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
    System.out.println(
    "setTest2:" + template.opsForSet().members("setTest2"));
    System.out.println(template.opsForSet().unionAndStore(
    "setTest","setTest2","unionAndStoreTest1"));
    System.out.println(
    "unionAndStoreTest1:" + template.opsForSet().members("unionAndStoreTest1"));
    結果:setTest:[ddd, bbb, aaa, ccc] setTest2:[ccc, aaa]
    4 unionAndStoreTest1:[ccc, aaa, ddd, bbb]
    複製代碼
  • Long unionAndStore(K key, Collection<K> otherKeys, K destKey);
    key無序集合與多個otherkey無序集合的並集存儲到destKey無序集合中

    複製代碼
    使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
    System.out.println(
    "setTest2:" + template.opsForSet().members("setTest2"));
    System.out.println(
    "setTest3:" + template.opsForSet().members("setTest3"));
    List
    <String> strlist = new ArrayList<String>();
    strlist.add(
    "setTest2");
    strlist.add(
    "setTest3");
    System.out.println(template.opsForSet().unionAndStore(
    "setTest",strlist,"unionAndStoreTest2"));
    System.out.println(
    "unionAndStoreTest2:" + template.opsForSet().members("unionAndStoreTest2"));
    結果:setTest:[ddd, bbb, aaa, ccc]
    setTest2:[ccc, aaa]
    setTest3:[xxx, ccc, aaa]
    5 unionAndStoreTest2:[ddd, xxx, bbb, aaa, ccc]
    複製代碼
  • Set<V> difference(K key, K otherKey);
    key無序集合與otherKey無序集合的差集

    使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
    System.out.println(
    "setTest2:" + template.opsForSet().members("setTest2"));
    System.out.println(template.opsForSet().difference(
    "setTest","setTest2"));
    結果:setTest:[ddd, bbb, aaa, ccc]
    setTest2:[ccc, aaa] [bbb, ddd]
  • Set<V> difference(K key, Collection<K> otherKeys);
    key無序集合與多個otherKey無序集合的差集

    複製代碼
    使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
    System.out.println(
    "setTest2:" + template.opsForSet().members("setTest2"));
    System.out.println(
    "setTest3:" + template.opsForSet().members("setTest3"));
    List
    <String> strlist = new ArrayList<String>();
    strlist.add(
    "setTest2");
    strlist.add(
    "setTest3");
    System.out.println(template.opsForSet().difference(
    "setTest",strlist));
    結果:setTest:[ddd, bbb, aaa, ccc]
    setTest2:[ccc, aaa]
    setTest3:[xxx, ccc, aaa]
    [bbb, ddd]
    複製代碼
  • Long differenceAndStore(K key, K otherKey, K destKey);
    key無序集合與otherkey無序集合的差集存儲到destKey無序集合中


    複製代碼
    使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
    System.out.println(
    "setTest2:" + template.opsForSet().members("setTest2"));
    System.out.println(template.opsForSet().differenceAndStore(
    "setTest","setTest2","differenceAndStore1"));
    System.out.println(
    "differenceAndStore1:" + template.opsForSet().members("differenceAndStore1"));
    結果:setTest:[ddd, bbb, aaa, ccc]
    setTest2:[ccc, aaa]
    2 differenceAndStore1:[bbb, ddd]
    複製代碼
  • Long differenceAndStore(K key, Collection<K> otherKeys, K destKey);
    key無序集合與多個otherkey無序集合的差集存儲到destKey無序集合中

    複製代碼
    使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
    System.out.println(
    "setTest2:" + template.opsForSet().members("setTest2"));
    System.out.println(
    "setTest3:" + template.opsForSet().members("setTest3"));
    List
    <String> strlist = new ArrayList<String>();
    strlist.add(
    "setTest2");
    strlist.add(
    "setTest3");
    System.out.println(template.opsForSet().differenceAndStore(
    "setTest",strlist,"differenceAndStore2"));
    System.out.println(
    "differenceAndStore2:" + template.opsForSet().members("differenceAndStore2"));
    結果:setTest:[ddd, bbb, aaa, ccc]
    setTest2:[ccc, aaa]
    setTest3:[xxx, ccc, aaa]
    2 differenceAndStore2:[bbb, ddd]
    複製代碼
  • Set<V> members(K key);
    返回集合中的全部成員

    使用:System.out.println(template.opsForSet().members("setTest"));
    結果:[ddd, bbb, aaa, ccc]
  • V randomMember(K key);
    隨機獲取key無序集合中的一個元素

    複製代碼
    使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
    System.out.println(
    "setTestrandomMember:" + template.opsForSet().randomMember("setTest"));
    System.out.println(
    "setTestrandomMember:" + template.opsForSet().randomMember("setTest"));
    System.out.println(
    "setTestrandomMember:" + template.opsForSet().randomMember("setTest"));
    System.out.println(
    "setTestrandomMember:" + template.opsForSet().randomMember("setTest"));
    結果:setTest:[ddd, bbb, aaa, ccc]
    setTestrandomMember:aaa
    setTestrandomMember:bbb
    setTestrandomMember:aaa
    setTestrandomMember:ddd
    複製代碼
  • Set<V> distinctRandomMembers(K key, long count);
    獲取多個key無序集合中的元素(去重),count表示個數

    使用:System.out.println("randomMembers:" + template.opsForSet().distinctRandomMembers("setTest",5));
    結果:randomMembers:[aaa, bbb, ddd, ccc]
  • List<V> randomMembers(K key, long count);
    獲取多個key無序集合中的元素,count表示個數

    使用:System.out.println("randomMembers:" + template.opsForSet().randomMembers("setTest",5));
    結果:randomMembers:[ccc, ddd, ddd, ddd, aaa]
  • Cursor<V> scan(K key, ScanOptions options);
    遍歷set

    複製代碼
    使用:    Cursor<Object> curosr = template.opsForSet().scan("setTest", ScanOptions.NONE);
    while(curosr.hasNext()){
    System.out.println(curosr.next());
    }
    結果:ddd bbb aaa ccc
    複製代碼

Redis的ZSet數據結構

Redis有序集合和無序集合同樣也是string類型元素的集合,且不容許重複的成員。
不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。
有序集合的成員是惟一的,但分數(score)卻能夠重複。
public interface ZSetOperations<K,V>
ZSetOperations提供了一系列方法對有序集合進行操做:

  • Boolean add(K key, V value, double score);
    新增一個有序集合,存在的話爲false,不存在的話爲true

    使用:System.out.println(template.opsForZSet().add("zset1","zset-1",1.0));
    結果:true
  • Long add(K key, Set<TypedTuple<V>> tuples);
    新增一個有序集合

    複製代碼
    使用:ZSetOperations.TypedTuple<Object> objectTypedTuple1 = new DefaultTypedTuple<Object>("zset-5",9.6);
    ZSetOperations.TypedTuple
    <Object> objectTypedTuple2 = new DefaultTypedTuple<Object>("zset-6",9.9);
    Set
    <ZSetOperations.TypedTuple<Object>> tuples = new HashSet<ZSetOperations.TypedTuple<Object>>();
    tuples.add(objectTypedTuple1);
    tuples.add(objectTypedTuple2);
    System.out.println(template.opsForZSet().add(
    "zset1",tuples));
    System.out.println(template.opsForZSet().range(
    "zset1",0,-1));
    結果:[zset
    -1, zset-2, zset-3, zset-4, zset-5, zset-6]
    複製代碼
  • Long remove(K key, Object... values);
    從有序集合中移除一個或者多個元素

    使用:System.out.println(template.opsForZSet().range("zset1",0,-1));
    System.out.println(template.opsForZSet().remove(
    "zset1","zset-6"));
    System.out.println(template.opsForZSet().range(
    "zset1",0,-1));
    結果:[zset
    -1, zset-2, zset-3, zset-4, zset-5, zset-6]
    1
    [zset
    -1, zset-2, zset-3, zset-4, zset-5]
  • Double incrementScore(K key, V value, double delta);
    增長元素的score值,並返回增長後的值

    使用:System.out.println(template.opsForZSet().incrementScore("zset1","zset-1",1.1));  //原爲1.1
    結果:2.2
  • Long rank(K key, Object o);
    返回有序集中指定成員的排名,其中有序集成員按分數值遞增(從小到大)順序排列

    使用:System.out.println(template.opsForZSet().range("zset1",0,-1));
    System.out.println(template.opsForZSet().rank(
    "zset1","zset-2"));
    結果:[zset
    -2, zset-1, zset-3, zset-4, zset-5]
    0 //代表排名第一
  • Long reverseRank(K key, Object o);
    返回有序集中指定成員的排名,其中有序集成員按分數值遞減(從大到小)順序排列

    使用:System.out.println(template.opsForZSet().range("zset1",0,-1));
    System.out.println(template.opsForZSet().reverseRank(
    "zset1","zset-2"));
    結果:[zset
    -2, zset-1, zset-3, zset-4, zset-5]
    4 //遞減以後排到第五位去了
  • Set<V> range(K key, long start, long end);
    經過索引區間返回有序集合成指定區間內的成員,其中有序集成員按分數值遞增(從小到大)順序排列

    使用:System.out.println(template.opsForZSet().range("zset1",0,-1));
    結果:[zset-2, zset-1, zset-3, zset-4, zset-5]
  • Set<TypedTuple<V>> rangeWithScores(K key, long start, long end);
    經過索引區間返回有序集合成指定區間內的成員對象,其中有序集成員按分數值遞增(從小到大)順序排列

    複製代碼
    使用:Set<ZSetOperations.TypedTuple<Object>> tuples = template.opsForZSet().rangeWithScores("zset1",0,-1);
    Iterator
    <ZSetOperations.TypedTuple<Object>> iterator = tuples.iterator();
    while (iterator.hasNext())

    { ZSetOperations.TypedTuple
    <Object> typedTuple = iterator.next();
    System.out.println(
    "value:" + typedTuple.getValue() + "score:" + typedTuple.getScore());
    }
    結果:value:zset
    -2score:1.2
    value:zset
    -1score:2.2
    value:zset
    -3score:2.3
    value:zset
    -4score:6.6
    value:zset
    -5score:9.6
    複製代碼
  • Set<V> rangeByScore(K key, double min, double max);
    經過分數返回有序集合指定區間內的成員,其中有序集成員按分數值遞增(從小到大)順序排列

    使用:System.out.println(template.opsForZSet().rangeByScore("zset1",0,5));
    結果:[zset
    -2, zset-1, zset-3]

  • Set<TypedTuple<V>> rangeByScoreWithScores(K key, double min, double max);
    經過分數返回有序集合指定區間內的成員對象,其中有序集成員按分數值遞增(從小到大)順序排列

    複製代碼
    使用:Set<ZSetOperations.TypedTuple<Object>> tuples = template.opsForZSet().rangeByScoreWithScores("zset1",0,5);
    Iterator
    <ZSetOperations.TypedTuple<Object>> iterator = tuples.iterator();
    while (iterator.hasNext())
    {
    ZSetOperations.TypedTuple
    <Object> typedTuple = iterator.next();
    System.out.println(
    "value:" + typedTuple.getValue() + "score:" + typedTuple.getScore());
    }
    結果:value:zset
    -2score:1.2
    value:zset
    -1score:2.2
    value:zset
    -3score:2.3
    複製代碼
  • Set<V> rangeByScore(K key, double min, double max, long offset, long count);
    經過分數返回有序集合指定區間內的成員,並在索引範圍內,其中有序集成員按分數值遞增(從小到大)順序排列

    使用:    System.out.println(template.opsForZSet().rangeByScore("zset1",0,5));
      System.out.println(template.opsForZSet().rangeByScore("zset1",0,5,1,2));
    結果:[zset-2, zset-1, zset-3]
    [zset-1, zset-3]
  • Set<TypedTuple<V>> rangeByScoreWithScores(K key, double min, double max, long offset, long count);
    經過分數返回有序集合指定區間內的成員對象,並在索引範圍內,其中有序集成員按分數值遞增(從小到大)順序排列

    複製代碼
    使用:Set<ZSetOperations.TypedTuple<Object>> tuples = template.opsForZSet().rangeByScoreWithScores("zset1",0,5,1,2);
          Iterator<ZSetOperations.TypedTuple<Object>> iterator = tuples.iterator();
    while (iterator.hasNext())
    {
    ZSetOperations.TypedTuple
    <Object> typedTuple = iterator.next();
    System.out.println(
    "value:" + typedTuple.getValue() + "score:" + typedTuple.getScore());
    }
    結果:value:zset
    -1score:2.2
    value:zset
    -3score:2.3
    複製代碼
  • Set<V> reverseRange(K key, long start, long end);
    經過索引區間返回有序集合成指定區間內的成員,其中有序集成員按分數值遞減(從大到小)順序排列

    使用:System.out.println(template.opsForZSet().reverseRange("zset1",0,-1));
    結果:[zset-5, zset-4, zset-3, zset-1, zset-2]
  • Set<TypedTuple<V>> reverseRangeWithScores(K key, long start, long end);
    經過索引區間返回有序集合成指定區間內的成員對象,其中有序集成員按分數值遞減(從大到小)順序排列

    複製代碼
    使用:Set<ZSetOperations.TypedTuple<Object>> tuples = template.opsForZSet().reverseRangeWithScores("zset1",0,-1);
    Iterator
    <ZSetOperations.TypedTuple<Object>> iterator = tuples.iterator();
    while (iterator.hasNext())
    {
    ZSetOperations.TypedTuple
    <Object> typedTuple = iterator.next();
    System.out.println(
    "value:" + typedTuple.getValue() + "score:" + typedTuple.getScore());
    }
    結果:value:zset
    -5score:9.6
    value:zset
    -4score:6.6
    value:zset
    -3score:2.3
    value:zset
    -1score:2.2
    value:zset
    -2score:1.2
    複製代碼
  • Set<V> reverseRangeByScore(K key, double min, double max);

    使用:與rangeByScore調用方法同樣,其中有序集成員按分數值遞減(從大到小)順序排列
  • Set<TypedTuple<V>> reverseRangeByScoreWithScores(K key, double min, double max);


    使用:與rangeByScoreWithScores調用方法同樣,其中有序集成員按分數值遞減(從大到小)順序排列
  • Set<V> reverseRangeByScore(K key, double min, double max, long offset, long count);


    使用:與rangeByScore調用方法同樣,其中有序集成員按分數值遞減(從大到小)順序排列
  • Set<TypedTuple<V>> reverseRangeByScoreWithScores(K key, double min, double max, long offset, long count);


    使用:與rangeByScoreWithScores調用方法同樣,其中有序集成員按分數值遞減(從大到小)順序排列
  • Long count(K key, double min, double max);
    經過分數返回有序集合指定區間內的成員個數

    使用:System.out.println(template.opsForZSet().rangeByScore("zset1",0,5));
          System.out.println(template.opsForZSet().count("zset1",0,5));
    結果:[zset-2, zset-1, zset-3]
    3
  • Long size(K key);
    獲取有序集合的成員數,內部調用的就是zCard方法

    使用:System.out.println(template.opsForZSet().size("zset1"));
    結果:
    6
  • Long zCard(K key);
    獲取有序集合的成員數

    使用:System.out.println(template.opsForZSet().zCard("zset1"));
    結果:
    6
  • Double score(K key, Object o);
    獲取指定成員的score值

    使用:System.out.println(template.opsForZSet().score("zset1","zset-1"));
    結果:
    2.2
  • Long removeRange(K key, long start, long end);
    移除指定索引位置的成員,其中有序集成員按分數值遞增(從小到大)順序排列

    使用:System.out.println(template.opsForZSet().range("zset2",0,-1));
    System.out.println(template.opsForZSet().removeRange(
    "zset2",1,2));
    System.out.println(template.opsForZSet().range(
    "zset2",0,-1));
    結果:[zset
    -1, zset-2, zset-3, zset-4]
    2
    [zset
    -1, zset-4]
  • Long removeRangeByScore(K key, double min, double max);
    根據指定的score值得範圍來移除成員

    複製代碼
    使用://System.out.println(template.opsForZSet().add("zset2","zset-1",1.1));
    //System.out.println(template.opsForZSet().add("zset2","zset-2",1.2));
    //System.out.println(template.opsForZSet().add("zset2","zset-3",2.3));
    //System.out.println(template.opsForZSet().add("zset2","zset-4",6.6));
    System.out.println(template.opsForZSet().range("zset2",0,-1));
    System.out.println(template.opsForZSet().removeRangeByScore(
    "zset2",2,3));
    System.out.println(template.opsForZSet().range(
    "zset2",0,-1));
    結果:[zset
    -1, zset-2, zset-3,zset-4]
    1 [zset-1, zset-2, zset-4]
    複製代碼
  • Long unionAndStore(K key, K otherKey, K destKey);
    計算給定的一個有序集的並集,並存儲在新的 destKey中,key相同的話會把score值相加

    複製代碼
    使用:System.out.println(template.opsForZSet().add("zzset1","zset-1",1.0));
    System.out.println(template.opsForZSet().add(
    "zzset1","zset-2",2.0));
    System.out.println(template.opsForZSet().add(
    "zzset1","zset-3",3.0));
    System.out.println(template.opsForZSet().add(
    "zzset1","zset-4",6.0));

    
    

    結果:value:zset-1score:2.0
    value:zset
    -2score:4.0
    value:zset
    -3score:6.0
    value:zset
    -5score:7.0
    value:zset
    -4score:12.0

    System.out.println(template.opsForZSet().add(</span>"zzset2","zset-1",1.0<span style="color: #000000;">));</br> System.out.println(template.opsForZSet().add(</span>"zzset2","zset-2",2.0<span style="color: #000000;">));</br> System.out.println(template.opsForZSet().add(</span>"zzset2","zset-3",3.0<span style="color: #000000;">));</br> System.out.println(template.opsForZSet().add(</span>"zzset2","zset-4",6.0<span style="color: #000000;">));</br> System.out.println(template.opsForZSet().add(</span>"zzset2","zset-5",7.0<span style="color: #000000;">));</br> System.out.println(template.opsForZSet().unionAndStore(</span>"zzset1","zzset2","destZset11"<span style="color: #000000;">));</br></br> Set</span>&lt;ZSetOperations.TypedTuple&lt;Object&gt;&gt; tuples = template.opsForZSet().rangeWithScores("destZset11",0,-1<span style="color: #000000;">);</br> Iterator</span>&lt;ZSetOperations.TypedTuple&lt;Object&gt;&gt; iterator =<span style="color: #000000;"> tuples.iterator();</br> </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (iterator.hasNext())</br></br> { ZSetOperations.TypedTuple</span>&lt;Object&gt; typedTuple =<span style="color: #000000;"> iterator.next();</br> System.out.println(</span>"value:" + typedTuple.getValue() + "score:" +<span style="color: #000000;"> typedTuple.getScore());</br> }</br>

    複製代碼
  • Long unionAndStore(K key, Collection<K> otherKeys, K destKey);
    計算給定的多個有序集的並集,並存儲在新的 destKey中

    複製代碼
    使用://System.out.println(template.opsForZSet().add("zzset1","zset-1",1.0));
    //System.out.println(template.opsForZSet().add("zzset1","zset-2",2.0));
    //System.out.println(template.opsForZSet().add("zzset1","zset-3",3.0));
    //System.out.println(template.opsForZSet().add("zzset1","zset-4",6.0));
    //
    //System.out.println(template.opsForZSet().add("zzset2","zset-1",1.0));
    //System.out.println(template.opsForZSet().add("zzset2","zset-2",2.0));
    //System.out.println(template.opsForZSet().add("zzset2","zset-3",3.0));
    //System.out.println(template.opsForZSet().add("zzset2","zset-4",6.0));
    //System.out.println(template.opsForZSet().add("zzset2","zset-5",7.0));

    System.out.println(template.opsForZSet().add(
    "zzset3","zset-1",1.0));
    System.out.println(template.opsForZSet().add(
    "zzset3","zset-2",2.0));
    System.out.println(template.opsForZSet().add(
    "zzset3","zset-3",3.0));
    System.out.println(template.opsForZSet().add(
    "zzset3","zset-4",6.0));
    System.out.println(template.opsForZSet().add(
    "zzset3","zset-5",7.0));

    
    

    結果:value:zset-1score:3.0
    value:zset
    -2score:6.0
    value:zset
    -3score:9.0
    value:zset
    -5score:14.0
    value:zset
    -4score:18.0

    List</span>&lt;String&gt; stringList = <span style="color: #0000ff;">new</span> ArrayList&lt;String&gt;<span style="color: #000000;">();</br> stringList.add(</span>"zzset2"<span style="color: #000000;">);</br> stringList.add(</span>"zzset3"<span style="color: #000000;">);</br> System.out.println(template.opsForZSet().unionAndStore(</span>"zzset1",stringList,"destZset22"<span style="color: #000000;">));</br></br> Set</span>&lt;ZSetOperations.TypedTuple&lt;Object&gt;&gt; tuples = template.opsForZSet().rangeWithScores("destZset22",0,-1<span style="color: #000000;">);</br> Iterator</span>&lt;ZSetOperations.TypedTuple&lt;Object&gt;&gt; iterator =<span style="color: #000000;"> tuples.iterator();</br> </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (iterator.hasNext())</br></br> {</br> ZSetOperations.TypedTuple</span>&lt;Object&gt; typedTuple =<span style="color: #000000;"> iterator.next();</br> System.out.println(</span>"value:" + typedTuple.getValue() + "score:" +<span style="color: #000000;"> typedTuple.getScore());</br> }</br>

    複製代碼
  • Long intersectAndStore(K key, K otherKey, K destKey);
    計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 key 中

    複製代碼
    使用:System.out.println(template.opsForZSet().intersectAndStore("zzset1","zzset2","destZset33"));

    
    

    結果:value:zset-1score:2.0
    value:zset
    -2score:4.0
    value:zset
    -3score:6.0
    value:zset
    -4score:12.0

    Set</span>&lt;ZSetOperations.TypedTuple&lt;Object&gt;&gt; tuples = template.opsForZSet().rangeWithScores("destZset33",0,-1<span style="color: #000000;">);</br> Iterator</span>&lt;ZSetOperations.TypedTuple&lt;Object&gt;&gt; iterator =<span style="color: #000000;"> tuples.iterator();</br> </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (iterator.hasNext())</br> {</br> ZSetOperations.TypedTuple</span>&lt;Object&gt; typedTuple =<span style="color: #000000;"> iterator.next();</br> System.out.println(</span>"value:" + typedTuple.getValue() + "score:" +<span style="color: #000000;"> typedTuple.getScore());</br> }</br>

    複製代碼
  • Long intersectAndStore(K key, Collection<K> otherKeys, K destKey);
    計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 key 中

    複製代碼
    使用:List<String> stringList = new ArrayList<String>();
    stringList.add(
    "zzset2");
    stringList.add(
    "zzset3");
    System.out.println(template.opsForZSet().intersectAndStore(
    "zzset1",stringList,"destZset44"));

    
    

    結果:value:zset-1score:3.0
    value:zset
    -2score:6.0
    value:zset
    -3score:9.0
    value:zset
    -4score:18.0

    Set</span>&lt;ZSetOperations.TypedTuple&lt;Object&gt;&gt; tuples = template.opsForZSet().rangeWithScores("destZset44",0,-1<span style="color: #000000;">);</br> Iterator</span>&lt;ZSetOperations.TypedTuple&lt;Object&gt;&gt; iterator =<span style="color: #000000;"> tuples.iterator();</br> </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (iterator.hasNext())</br> {</br> ZSetOperations.TypedTuple</span>&lt;Object&gt; typedTuple =<span style="color: #000000;"> iterator.next();</br> System.out.println(</span>"value:" + typedTuple.getValue() + "score:" +<span style="color: #000000;"> typedTuple.getScore());</br> }</br>

    複製代碼
  • Cursor<TypedTuple<V>> scan(K key, ScanOptions options);
    遍歷zset

    複製代碼
    使用:    Cursor<ZSetOperations.TypedTuple<Object>> cursor = template.opsForZSet().scan("zzset1", ScanOptions.NONE);
    while (cursor.hasNext()){
    ZSetOperations.TypedTuple
    <Object> item = cursor.next();
    System.out.println(item.getValue()
    + ":" + item.getScore());
    }
    結果:zset
    -1:1.0
    zset
    -2:2.0
    zset
    -3:3.0
    zset
    -4:6.0
    複製代碼

注:TimeUnit是java.util.concurrent包下面的一個類,表示給定單元粒度的時間段
經常使用的顆粒度

TimeUnit.DAYS //
TimeUnit.HOURS //小時
TimeUnit.MINUTES //分鐘
TimeUnit.SECONDS //
TimeUnit.MILLISECONDS //毫秒

 

 

參考:

http://www.jianshu.com/p/7bf5dc61ca06(以上內容轉自此篇文章)

2017-02-09更新

上面使用方法中,序列化的時候要傳對應的類,其實能夠不用傳對應的類,能夠直接使用"org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"類進行序列話,內部用了多態實現的,使用很是方便,可是有一個問題是序列化後的結果中有每一個鍵對應的java類型說明和"@class",好比: ```java {"@class":"org.apache.shiro.authc.SimpleAuthenticationInfo","principals": {"@class":"org.apache.shiro.subject.SimplePrincipalCollection","empty":false,"primaryPrincipal": {"@class":"com.jucheng365.modules.sys.entity.SysUser","id":"1","companyId":null,"officeId":null,"loginName":"admin","password":"21232f297a57a5a743894a0e4a801fc3","no":"0001","name":"系統管理員","email":"XXXX@163.com","phone":"0354-5774554","mobile":"15209840499","userType":"","photo":"/userfiles/1/images/photo/2017/01/QQ%E5%9B%BE%E7%89%8720160701203534.jpg","loginIp":"127.0.0.1","loginDate":["java.util.Date",1516959310000],"loginFlag":"1","createBy":null,"createDate":["java.util.Date",1369612800000],"updateBy":null,"updateDate":["java.util.Date",1484141716000],"remarks":"最高管理員","delFlag":"0","roleList": ["java.util.ArrayList",[]],"admin":true},"realmNames":["java.util.LinkedHashMap$LinkedKeySet",["UserRealm"]]},"credentials":"21232f297a57a5a743894a0e4a801fc3","credentialsSalt":null} ``` 沒有仔細研究,爲何會出現,若是不須要的話,能夠直接用上面「Jackson2JsonRedisSerializer」來進行序列化,,若是不須要用「Jackson2JsonRedisSerializer」和「ObjectMapper 」配合效果更好,不會顯示對應的java類型,這個看具體使用,具體代碼以下:

RedisTemplate序列化實踐總結

```java /** * 獲取RedisTemplate對象,處理Redis數據,而且進行最佳序列化 * @return */ @Bean(name="redisTemplate") public RedisTemplate redisTemplate() { RedisTemplate template = new RedisTemplate<>(); //手動序列化 //GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();//序列化後會產生java類型說明,若是不須要用「Jackson2JsonRedisSerializer」和「ObjectMapper 」配合效果更好 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); template.setKeySerializer(stringRedisSerializer); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashKeySerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); //鏈接Redis template.setConnectionFactory(connectionFactory()); return template; } ```
posted @ 2018-02-08 14:01  星朝 閱讀( ...) 評論( ...) 編輯 收藏
相關文章
相關標籤/搜索