1. 程式人生 > >RedisTemplate訪問Redis資料結構(三)——Hash

RedisTemplate訪問Redis資料結構(三)——Hash

Redis的雜湊可以讓使用者將多個鍵值對儲存到一個Redis鍵裡面。此處我們使用redisTemplate,配置如下(詳情請見連結:RedisTemplate訪問Redis資料結構(前言)

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">  
    <property name="connectionFactory" ref="jedisConnFactory"/>  
    <property name="keySerializer">
        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    </property>
    <property name="hashKeySerializer">
        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    </property>
    <property name="valueSerializer">
        <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
    </property>
    <property name="hashValueSerializer">
        <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
    </property>
</bean> 

HashOperations提供一系列方法操作hash。首先初始化spring工廠獲得redisTemplate和opsForHash

    private RedisTemplate<String,Object> redisTemplate;
    private HashOperations<String,String,Object> opsForHash;

    @SuppressWarnings("unchecked")
    @Before
    public void before(){
        @SuppressWarnings("resource")
        ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
        redisTemplate = (RedisTemplate<String,Object>)context.getBean("redisTemplate");
        opsForHash = redisTemplate.opsForHash();
    }

void put(H key, HK hashKey, HV value);

Map< HK, HV > entries(H key);

    @Test
    public void testPut(){
        opsForHash.put("he1", "key1", "a");
        opsForHash.put("he1", "key2", "b");
        opsForHash.put("he1", "key3", "c");
        Map<String, Object> entries = opsForHash.entries("he1");
        System.out.println(entries);//{key3=c, key1=a, key2=b}(無序)
    }

void putAll(H key, Map< ? extends HK, ? extends HV > m);

    @Test
    public void testPutAll(){
        Map<String,Object> param = new HashMap<String,Object>();
        param.put("key1", "a");
        param.put("key2", "b");
        param.put("key3", "c");
        opsForHash.putAll("he2", param);
        System.out.println(opsForHash.entries("he2"));//{key2=b, key1=a, key3=c}
    }

Long delete(H key, Object… hashKeys);

    @Test
    public void testDelete(){
        Map<String,Object> param = new HashMap<String,Object>();
        param.put("key1", "a");
        param.put("key2", "b");
        param.put("key3", "c");
        opsForHash.putAll("he3", param);
        System.out.println(opsForHash.entries("he3"));//{key3=c, key2=b, key1=a}
        opsForHash.delete("he3", "key1");
        System.out.println(opsForHash.entries("he3"));//{key2=b, key3=c}
    }

Boolean hasKey(H key, Object hashKey);

    @Test
    public void testHashKey(){
        Map<String,Object> param = new HashMap<String,Object>();
        param.put("key1", "a");
        param.put("key2", "b");
        param.put("key3", "c");
        opsForHash.putAll("he4", param);
        System.out.println(opsForHash.hasKey("he", "key2"));//false
        System.out.println(opsForHash.hasKey("he4", "key4"));//false
        System.out.println(opsForHash.hasKey("he4", "key2"));//true
    }

HV get(H key, Object hashKey);

    @Test
    public void testGet(){
        Map<String,Object> param = new HashMap<String,Object>();
        param.put("key1", "a");
        param.put("key2", "b");
        param.put("key3", "c");
        opsForHash.putAll("he5", param);
        System.out.println(opsForHash.get("he5", "key1"));//a
        System.out.println(opsForHash.get("he5", "key"));//null
    }

List< HV > multiGet(H key, Collection< HK > hashKeys);

    @Test
    public void testMultiGet(){
        Map<String,Object> param = new HashMap<String,Object>();
        param.put("key1", "a");
        param.put("key2", "b");
        param.put("key3", "c");
        opsForHash.putAll("he6", param);
        List<String> keys = new ArrayList<String>();
        keys.add("key1");
        keys.add("key");
        keys.add("key2");
        System.out.println(opsForHash.multiGet("he6", keys));//[a, null, b]
    }

Long increment(H key, HK hashKey, long delta);

Double increment(H key, HK hashKey, double delta);

    @Test
    public void testIncrement(){
        Map<String,Object> param = new HashMap<String,Object>();
        param.put("key1", "a");
        param.put("key2", "b");
        param.put("key3", "c");
        param.put("key4", 4);
        opsForHash.putAll("he7", param);
        System.out.println(opsForHash.increment("he7", "key4", 1));//5
        System.out.println(opsForHash.increment("he7", "key4", 1.1));//6.1
        try {
            opsForHash.increment("he7", "key1", 1);//ERR hash value is not an integer
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            opsForHash.increment("he7", "key1", 1.1);//ERR hash value is not a float
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Set< HK > keys(H key);

    @Test
    public void testKeys(){
        redisTemplate.delete("he8");
        Map<String,Object> param = new HashMap<String,Object>();
        param.put("key4", "d");
        param.put("key1", "a");
        param.put("key3", "c");
        param.put("key5", "e");
        param.put("key2", "b");
        opsForHash.putAll("he8", param);
        Set<String> keys = opsForHash.keys("he8");
        System.out.println(keys);//[key4, key3, key5, key2, key1]
    }

Long size(H key);

    @Test
    public void testSize(){
        Map<String,Object> param = new HashMap<String,Object>();
        param.put("key4", "d");
        param.put("key1", "a");
        param.put("key3", "c");
        param.put("key5", "e");
        param.put("key2", "b");
        opsForHash.putAll("he9", param);
        System.out.println(opsForHash.size("he9"));//5
    }

Boolean putIfAbsent(H key, HK hashKey, HV value);

    @Test
    public void testPutIfAbsent(){
        //僅當hashKey不存在時才設定雜湊hashKey的值。
        System.out.println(opsForHash.putIfAbsent("he10", "key1", "a"));//true
        System.out.println(opsForHash.putIfAbsent("he10", "key1", "a"));//false
    }

List< HV > values(H key);

    @Test
    public void testValues(){
        Map<String,Object> param = new HashMap<String,Object>();
        param.put("key4", "d");
        param.put("key1", "a");
        param.put("key3", "c");
        param.put("key5", "e");
        param.put("key2", "b");
        opsForHash.putAll("he11", param);
        List<Object> values = opsForHash.values("he11");
        System.out.println(values);//[d, c, e, b, a]
    }

Cursor< Map.Entry< HK, HV >> scan(H key, ScanOptions options);

    @Test
    public void testScan(){
        Map<String,Object> param = new HashMap<String,Object>();
        param.put("key4", "d");
        param.put("key1", "a");
        param.put("key3", "c");
        param.put("key5", "e");
        param.put("key2", "b");
        opsForHash.putAll("he13", param);
        Cursor<Map.Entry<String, Object>> curosr = opsForHash.scan("he13", ScanOptions.NONE);
        while(curosr.hasNext()){
            Map.Entry<String, Object> entry = curosr.next();
            System.out.println(entry.getKey()+":"+entry.getValue());
        }
        /**
            key4:d
            key3:c
            key5:e
            key2:b
            key1:a
         */
    }

相關推薦

RedisTemplate訪問Redis資料結構——Hash

Redis的雜湊可以讓使用者將多個鍵值對儲存到一個Redis鍵裡面。此處我們使用redisTemplate,配置如下(詳情請見連結:RedisTemplate訪問Redis資料結構(前言)) <bean id="redisTemplate" class="org.

資料結構:線性表

一、線性表及其邏輯結構 1、線性表的定義 線性表是具有相同特性的資料元素的一個有限序列。 該序列中所含的元素個數叫做線性表的長度,用 n表示(n>=0)。當 n=0時,表示線性表是一個空表,即表中不包含任何資料元素。 線性表中的第一個元素叫做表頭元素,最後一

資料結構之棧

棧是後進先出,先進後出 棧是一種受限制的線性表,只允許一端插入和刪除資料。 棧的實現也有兩種,用陣列實現叫順序棧;用連結串列實現叫鏈式棧。 // 基於陣列實現的順序棧 public class ArrayStack { private String[] items; // 陣列 private i

我理解的資料結構—— 佇列Queue

我理解的資料結構(三)—— 佇列(Queue) 一、佇列 佇列是一種線性結構 相比陣列,佇列對應的操作是陣列的子集 只能從一端(隊尾)新增元素,只能從另一端(隊首)取出元素 佇列是一種先進先出的資料結構(FIFO) 二、陣列佇列與迴圈佇列 1. 陣列佇列 如果你有看過我之前

資料結構Stack和Vector原始碼分析

一、基本概念: 1、棧是什麼? 是一個只能在某一端進行插入、刪除操作的線性表。 * 從棧頂插入一個元素稱之為入棧(push) * 從棧頂刪除一個元素稱之為出棧(pop) 2、圖解: 3、棧的實現: 鏈式儲存(連結串列) 順序儲存(陣列) 4

Java資料資料結構——佇列

今天但看了大二資料結構這本書,對佇列進行一個整理。 文章目錄 一、什麼是佇列 二、順序陣列實現佇列 三、迴圈陣列實現佇列 四、連結串列實現佇列 一、什麼是佇列 佇列和棧一樣,都是一種受限制的線性表。佇列元素只能從隊尾插入(稱為入隊

基礎演算法與資料結構普通並查集

簡介 在平時的計算中,常常會遇到集合劃分的問題,例如一個集合S={a1,a2,a3,a4},按照一定規則我們可以劃分為S1={a1,a2},S2={a3},s3={a4}。但是在劃分好集合後,又該如何快速確認任意兩個元素之間的關係呢。由此引出並查集。 並查集簡介 並查集最關鍵的表現就是一個集合中的每

自己動手實現java資料結構

自己動手實現java資料結構(三) 棧 1.棧的介紹   在許多演算法設計中都需要一種"先進後出(First Input Last Output)"的資料結構,因而一種被稱為"棧"的資料結構被抽象了出來。   棧的結構類似一個罐頭:只有一個開口;先被放進去的東西沉在底下,後放進去的東西被

資料結構之順序棧與鏈棧

順序棧 運用陣列結構來構建的線性棧就是順序棧。 本例實現了順序棧的初始化、列印棧、入棧、出棧、判斷棧空等操作。 #include<iostream> using namespace std; const int MAXSIZE=1000; typedef

再談資料結構

1 - 引言 圖(Graph)描述的是一些個體之間的關係。與線性表和二叉樹不同的是:這些個體之 間既不是前驅後繼的順序關係,也不是祖先後代的層次關係,而是錯綜複雜的網狀關係。 圖也是資料結構中經常使用的一種結構,讓我們來學習一下使用圖的演算法吧 2 - 用DFS求連通塊 例題

如何使用RedisTemplate訪問Redis資料結構

Redis 資料結構簡介 Redis 可以儲存鍵與5種不同資料結構型別之間的對映,這5種資料結構型別分別為String(字串)、List(列表)、Set(集合)、Hash(雜湊)和 Zset(有序集合)。 下面來對這5種資料結構型別作簡單的介紹: 結構型別 結構

資料結構--迴圈佇列

迴圈佇列的基本操作 剛把資料結構裡面的佇列學習了一下,主要是對迴圈佇列的基本操作進行了瞭解,主要是想明白,迴圈佇列的迴圈是咋實現的,就好了,然後把入隊和出隊,判斷是否是空,和判斷是否為滿的弄懂就搞清楚迴圈隊列了。 佇列 如圖所示,佇列是一種可以實現“先

資料結構——佇列及實現、迴圈佇列實現

一、佇列    佇列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇

資料結構單向迴圈連結串列的的分析與python程式碼實現

概念 單鏈表的一個變形是單向迴圈連結串列,連結串列中最後一個節點的next域不再為None,而是指向連結串列的頭節點。 節點包含兩個域:元素域和連結域(下一個節點),尾節點next指向第0個節點,當連結串列只有一個節點時,自己的next指向自己,基於單鏈表的基礎上,增加考慮首節點和尾節點

資料結構:非線性邏輯結構-特殊的二叉樹結構:堆、哈夫曼樹、二叉搜尋樹、平衡二叉搜尋樹、紅黑樹、線索二叉樹

/* 性質1. 節點是紅色或黑色 性質2. 根是黑色 性質3. 每個紅色節點的兩個子節點都是黑色 (從每個葉子到根的所有路徑上不能有兩個連續的紅色節點) 性質4. 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點 */ #include #include typedef enum

RedisTemplate訪問Redis資料結構

Redis 可以儲存鍵與5種不同資料結構型別之間的對映,這5種資料結構型別分別為String(字串)、List(列表)、Set(集合)、Hash(雜湊)和 Zset(有序集合)。 下面來對這5種資料結構型別作簡單的介紹: 結構型別 結構儲存的值 結構的讀

SpringBoot中 整合 redisTemplateRedis 的操作Set

SpringBoot中 整合 redisTemplate 對 Redis 的操作(三)Set 1、新增set型別,並且如果存在的

Redis 基礎資料結構

1.String字串 string 是 Redis 最簡單的資料結構。Redis 所有的資料結構都是以唯一的 key 字串作為名稱,然後通過這個唯一 key 值來獲取相應的 value 資料。不同型別的資料結構的差異就在於 value 的結構不一樣。字串結構使用最為廣泛,最常見的就是快取資訊。一般情況下我們是

redis底層設計——redis資料型別

今天我們來看一下redis的資料型別。既然redis的鍵值對可以儲存不同型別的值,那麼很自然就需要對鍵值對的型別進行檢查以及多型處理。下面我們將對redis所使用的物件系統進行了解,並分別觀察字串、雜湊表、列表、集合和有序集型別的底層實現。 3.1 物件處理機制   在redis的命令中,用於對鍵進行處理

資料結構】棧的儲存結構鏈棧

鏈棧 鏈棧因為不是陣列儲存,所以需要有指向下一個結點的指標 。 鏈棧如果使用頭插法是不需要棧頂指標,即棧頂指標就是頭指標。操作和頭插法連結串列一樣。 鏈棧若用尾插法略麻煩。 程式碼收穫 主要了解鏈棧的資料結構。 鏈棧的結構體中儲存連結下一個結構體的指標,而