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,結果返回了所有的匹配項。看來想一次正確返回所有匹配項,只能直接設置一個較大的迭代值了。