您好,登錄后才能下訂單哦!
這篇文章主要介紹了redis中如何獲取list中的所有元素,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
一種方法是用 lrange( key, 0, -1 )。這種方法不會影響 redis list 中的數據。
List<String> list = jedis.lrange( key, 0, -1 );
另一種方法是用 while + lpop 。這種方法會將 redis list 中的數據都彈出來,redis list 就變成空的了。
List<String> list = new ArrayList<>(); String st = jedis.lpop( key ); while ( st != null ) { list.add( st ); st = jedis.lpop( key ); }
這兩種方法獲得的 List<String> list 中的元素的順序是一樣的。
補充:redis列表類型list如何一次返回多個值并刪除這些值
redis的列表類型list是一個常用的數據類型,但是這個類型并不支持一次性返回多個值并刪除這些已經返回的值。
其實我們可以通過redis的事務,來完成這個一次性返回多個值并刪除這些已經返回的值的需求。
redis中的事務就是一組命令的集合,這些命令要么全部執行,要么全都不執行。redis事務的原理就是一次性將命令都發給服務端,
當服務接收到exec命令之后,按照事務中命令的順序依次執行事務中的命令。exec命令的返回值就是事務中依次執行的命令返回值的集合,返回值的順序和命令的執行順序相同。如果在發送exec命令前,客戶端和服務端失去連接,這時redis會清空這個事務隊列。
介紹完這些原理,我們再來看看如何完成一次性返回多個值并刪除這些已經返回的值的需求。
我們這里要利用兩個列表類型的命令:lrange和ltrim
lrange key start end // 從左邊依次返回key的[start,end] 的所有值,注意返回結果包含兩端的值。
ltrim key start end //刪除指定索引之外的所有元素,注意刪除之后保留的元素包含兩端的start和end索引值。
我們這里舉例測試:
我們構造了一個名為yujie_list的列表類型數據結構,從左邊依次壓入:0 1 2 3 4 5 6 7 8 9
最后從左到右依次列出列表中的所有元素如上圖所示。
接下來我們測試lrange和ltrim命令如下圖:
我們使用lrange yujie_list 0 3命令,從左到右依次列出從索引0到索引3的元素,注意包含了索引0 值為9和索引3值為6的元素。
我們使用ltrim yujie_list 4 -1命令,刪除索引4到最右端之外的所有元素,注意刪除的元素不包含索引4職位5的元素。
好了原理講完了,接下來我們上代碼:
RedisUtil是一個工具類,用于連接redis服務端。
/** * 連接redis服務的工具類 * @author yujie.wang3 * */ public final class RedisUtil { //Redis服務器IP private static String ADDR = "10.4.36.93"; //Redis的端口號 private static int PORT = 6379; //可用連接實例的最大數目,默認值為8; //如果賦值為-1,則表示不限制;如果pool已經分配了maxActive個jedis實例,則此時pool的狀態為exhausted(耗盡)。 private static int MAX_ACTIVE = 100; //控制一個pool最多有多少個狀態為idle(空閑的)的jedis實例,默認值也是8。 private static int MAX_IDLE = 20; //等待可用連接的最大時間,單位毫秒,默認值為-1,表示永不超時。如果超過等待時間,則直接拋出JedisConnectionException; private static int MAX_WAIT = 10000; private static int TIMEOUT = 10000; //在borrow一個jedis實例時,是否提前進行validate操作;如果為true,則得到的jedis實例均是可用的; private static boolean TEST_ON_BORROW = true; private static JedisPool jedisPool = null; /** * 初始化Redis連接池 */ static { try { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxActive(MAX_ACTIVE); config.setMaxIdle(MAX_IDLE); config.setMaxWait(MAX_WAIT); config.setTestOnBorrow(TEST_ON_BORROW); jedisPool = new JedisPool(config, ADDR, PORT); } catch (Exception e) { e.printStackTrace(); } } /** * 獲取Jedis實例 * @return */ public synchronized static Jedis getJedis() { try { if (jedisPool != null) { Jedis resource = jedisPool.getResource(); return resource; } else { return null; } } catch (Exception e) { e.printStackTrace(); return null; } } /** * 釋放jedis資源 * @param jedis */ public static void returnResource(final Jedis jedis) { if (jedis != null) { jedisPool.returnResource(jedis); } } }
測試類如下:
/** * 一次返回多個列表值并刪除返回值測試類 * @author yujie.wang * */ public class RedisTest { public static void main(String[] args) { String key = "yujie_test_list"; initList(key,9); printList(key,"原始列表數據"); List<String> listResult = getListMultValueAfterDel(key,0,3); System.out.println("一次返回并刪除數據:"+listResult.toString()); printList(key,"刪除之后列表數據"); } public static void initList(String key,int maxValue){ Jedis client = RedisUtil.getJedis(); for(int i = 0;i <= maxValue; i++){ client.lpush(key, String.valueOf(i)); } System.out.println("初始化列表:"+ key + "完畢"); } public static void printList(String key,String message){ Jedis client = RedisUtil.getJedis(); List<String> list = client.lrange(key, 0, -1); System.out.println(message+ " : " + list.toString()); } @SuppressWarnings("unchecked") public static List<String> getListMultValueAfterDel(String key,int start, int end){ List<Object> list = null; List<String> listStr = new ArrayList<String>(); try { Jedis jedis = RedisUtil.getJedis(); Transaction ts = jedis.multi(); ts.lrange(key, start, end); ts.ltrim(key, end+1, -1); list = ts.exec(); RedisUtil.returnResource(jedis); } catch (Exception e) { // TODO: handle exception System.out.println(e); } if(list != null && !list.isEmpty()){ try { //獲得命令lrange(key, start, end)的返回結果 listStr = (ArrayList<String>)list.get(0); } catch (Exception e) { // TODO: handle exception System.out.println(e); } } else { return Collections.emptyList(); } return listStr; } }
輸出結果:
感謝你能夠認真閱讀完這篇文章,希望小編分享的“redis中如何獲取list中的所有元素”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。