java-redis集合數據操作示例(三)


 redis系列博文,redis連接管理類的代碼請跳轉查看《java-redis字符類數據操作示例(一)》。

一、集合類型緩存測試類

public class SetTest {
    /**
     * 主測試方案
     */
    @Test
    public void test() {
        RedisUtil.instance.run(conn -> oper(conn));
        Assert.assertTrue(true);
    }
    /**
     * 測試用的key
     */
    private final String _key = "simm-set";
    /**
     * 字符串操作
     * 
     * @param conn
     */
    private void oper(ShardedJedis conn) {
        System.out.println(MessageFormat.format("key[{0}]存在:{1} ", _key,conn.exists(_key)));
        // 集合數據初始化
        String[] arr= "AA,AB,AC,AD,AE,AF,AG,BA,BB,BC,BD,BE,BF,BG".split(",");
        conn.sadd(_key, arr);
        print(conn);
        //1.查詢元素
        //指定個數 count 在redis服務中默認值為10 
        ScanResult<String> result = conn.sscan(_key, "0",new ScanParams().match("*").count(2));
        String cursor = result.getStringCursor();
        System.out.println(MessageFormat.format("游標位置:{0}", cursor));
        print(result.getResult());
        //匹配內容
        result = conn.sscan(_key, "0",new ScanParams().match("A*"));
        print(result.getResult());
        result = conn.sscan(_key, "0",new ScanParams().match("A*").count(100));
        print(result.getResult());
        //2.集合元素刪除方法 
        //2.1.移除
        Long effected = conn.srem(_key, "AE","BG","HI");//移除CGH。
        System.out.println(MessageFormat.format("成功移除{0}個元素", effected));
        print(conn);
        //2.2.從集合中彈出一個元素
        String pop = conn.spop(_key);
        System.out.println(MessageFormat.format("POP: {0}", pop));
        print(conn);
        //3.判斷元素是否存在
        System.out.println(MessageFormat.format("A是集合中的元素? {0}", conn.sismember(_key, "AA")));
        System.out.println(MessageFormat.format("J是集合中的元素? {0}", conn.sismember(_key, "JQ")));
        
        conn.expire(_key, 1); //設置改key值1s后過期,過期后redis自動清理該緩存
        System.out.println(MessageFormat.format("key[{0}]存在:{1} ", _key,conn.exists(_key)));
    }
    
    private void print(List<String> list){
        System.out.print(MessageFormat.format("scan輸出,長度[{1}]:", _key,list.size()));
        for (String str : list) {
            System.out.print(MessageFormat.format("{0} ", str));
        }
        System.out.println();
    }
    
    private void print(ShardedJedis conn){
        System.out.print(MessageFormat.format("{0}元素輸出,長度[{1}]:", _key,conn.scard(_key)));
        Set<String> list = conn.smembers(_key);
        for (String str : list) {
            System.out.print(MessageFormat.format("{0} ", str));
        }
        System.out.println();
    }
}

二、結果輸出

  

三、關於sscan命令

  

  match參數用於過濾,count參數用於限制一次迭代返回的集合數目。這個值默認是10。我測試了兩種情況,集合元素個數少於10以及大於10。后面給出測試的結果。測試過這個sscan方法后,有點懵逼,網上查找別人的分享,好像也是懵逼的多。顯示設置一次迭代的個數,是否能夠生效,還受到set元素總個數是否超過10的影響。這塊的實現讓人費解。就測試后來看,當數據量不是很大,想正確的一次查詢所有匹配項的話,請設置一個較大的count參數,這樣能保證數據量從少到多的過程中都不會出問題。

  1、初始化集合元素為7個

  // 集合數據初始化
        String[] arr= "AA,AB,AC,AD,AE,AF,AG".split(",");
        conn.sadd(_key, arr);
        print(conn);
        //1.查詢元素
        //指定個數 count 在redis服務中默認值為10 
        ScanResult<String> result = conn.sscan(_key, "0",new ScanParams().match("A*").count(2));
        String cursor = result.getStringCursor();
        System.out.println(MessageFormat.format("游標位置:{0}", cursor));
        print(result.getResult());
        //匹配內容
        result = conn.sscan(_key, "0",new ScanParams().match("A*"));
        print(result.getResult());
        result = conn.sscan(_key, "0",new ScanParams().match("A*").count(100));
        print(result.getResult());

    測試3種場景,情況如下

    •  match("A*").count(2):查詢以A開頭的元素,限定一次迭代2個元素。結果返回了3個數據。設置一次迭代2個元素,結果返回元素還大於設置的迭代量,卧槽,蛋疼的結果;
    •  match("A*"):不顯示指定迭代個數,結果返回了所有的匹配項;
    •  match("A*").count(100):指定一次迭代上限為100,結果也返回了所有的匹配項。

  2、初始化集合元素為14個

        // 集合數據初始化
        String[] arr= "AA,AB,AC,AD,AE,AF,AG,BA,BB,BC,BD,BE,BF,BG".split(",");
        conn.sadd(_key, arr);
        print(conn);
        //1.查詢元素
        //指定個數 count 在redis服務中默認值為10 
        ScanResult<String> result = conn.sscan(_key, "0",new ScanParams().match("A*").count(2));
        String cursor = result.getStringCursor();
        System.out.println(MessageFormat.format("游標位置:{0}", cursor));
        print(result.getResult());
        //匹配內容
        result = conn.sscan(_key, "0",new ScanParams().match("A*"));
        print(result.getResult());
        result = conn.sscan(_key, "0",new ScanParams().match("A*").count(100));
        print(result.getResult());

    測試3種場景,情況如下

    •  match("A*").count(2):查詢以A開頭的元素,限定一次迭代2個元素。結果返回為空。可以理解為這一次的2個迭代元素均不符合過濾條件;
    •  match("A*"):不顯示指定迭代個數,結果返回了4個匹配項。這樣看默認的10個一批迭代的設置起作用了;
    •  match("A*").count(100):指定一次迭代上限為100,結果返回了所有的匹配項。看來想一次正確返回所有匹配項,只能直接設置一個較大的迭代值了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM