最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

redis 獲取 list 中的所有元素操作

 更新時間:2021年03月25日 14:19:04   作者:熱帶魚2020  
這篇文章主要介紹了redis 獲取 list 中的所有元素操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

一種方法是用 lrange( key, 0, -1 )。這種方法不會影響 redis list 中的數(shù)據(jù)。

List<String> list = jedis.lrange( key, 0, -1 ); 

另一種方法是用 while + lpop 。這種方法會將 redis list 中的數(shù)據(jù)都彈出來,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 中的元素的順序是一樣的。

補(bǔ)充:redis列表類型list如何一次返回多個值并刪除這些值

redis的列表類型list是一個常用的數(shù)據(jù)類型,但是這個類型并不支持一次性返回多個值并刪除這些已經(jīng)返回的值。

其實(shí)我們可以通過redis的事務(wù),來完成這個一次性返回多個值并刪除這些已經(jīng)返回的值的需求。

redis中的事務(wù)就是一組命令的集合,這些命令要么全部執(zhí)行,要么全都不執(zhí)行。redis事務(wù)的原理就是一次性將命令都發(fā)給服務(wù)端,

當(dāng)服務(wù)接收到exec命令之后,按照事務(wù)中命令的順序依次執(zhí)行事務(wù)中的命令。exec命令的返回值就是事務(wù)中依次執(zhí)行的命令返回值的集合,返回值的順序和命令的執(zhí)行順序相同。如果在發(fā)送exec命令前,客戶端和服務(wù)端失去連接,這時redis會清空這個事務(wù)隊列。

介紹完這些原理,我們再來看看如何完成一次性返回多個值并刪除這些已經(jīng)返回的值的需求。

我們這里要利用兩個列表類型的命令:lrange和ltrim

lrange key start end // 從左邊依次返回key的[start,end] 的所有值,注意返回結(jié)果包含兩端的值。

ltrim key start end //刪除指定索引之外的所有元素,注意刪除之后保留的元素包含兩端的start和end索引值。

我們這里舉例測試:

我們構(gòu)造了一個名為yujie_list的列表類型數(shù)據(jù)結(jié)構(gòu),從左邊依次壓入: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服務(wù)端。

/**
 * 連接redis服務(wù)的工具類
 * @author yujie.wang3
 *
 */
public final class RedisUtil {  
  //Redis服務(wù)器IP
  private static String ADDR = "10.4.36.93";
  
  //Redis的端口號
  private static int PORT = 6379;  
  
  //可用連接實(shí)例的最大數(shù)目,默認(rèn)值為8;
  //如果賦值為-1,則表示不限制;如果pool已經(jīng)分配了maxActive個jedis實(shí)例,則此時pool的狀態(tài)為exhausted(耗盡)。
  private static int MAX_ACTIVE = 100;
  
  //控制一個pool最多有多少個狀態(tài)為idle(空閑的)的jedis實(shí)例,默認(rèn)值也是8。
  private static int MAX_IDLE = 20;
  
  //等待可用連接的最大時間,單位毫秒,默認(rèn)值為-1,表示永不超時。如果超過等待時間,則直接拋出JedisConnectionException;
  private static int MAX_WAIT = 10000;
  
  private static int TIMEOUT = 10000;
  
  //在borrow一個jedis實(shí)例時,是否提前進(jìn)行validate操作;如果為true,則得到的jedis實(shí)例均是可用的;
  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實(shí)例
   * @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,"原始列表數(shù)據(jù)");
 List<String> listResult = getListMultValueAfterDel(key,0,3);
 System.out.println("一次返回并刪除數(shù)據(jù):"+listResult.toString());
 printList(key,"刪除之后列表數(shù)據(jù)");
 }
 
 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)的返回結(jié)果
  listStr = (ArrayList<String>)list.get(0); 
  } catch (Exception e) {
  // TODO: handle exception
  System.out.println(e);
  }  
 } else {
  return Collections.emptyList();
 }
 return listStr;
 }
 
} 

輸出結(jié)果:

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • MyBatis關(guān)聯(lián)查詢的實(shí)現(xiàn)

    MyBatis關(guān)聯(lián)查詢的實(shí)現(xiàn)

    MyBatis可以通過定義多個表的關(guān)聯(lián)關(guān)系,實(shí)現(xiàn)多表查詢,本文主要介紹了MyBatis關(guān)聯(lián)查詢的實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • 如何利用Java遞歸解決“九連環(huán)”公式

    如何利用Java遞歸解決“九連環(huán)”公式

    這篇文章主要給大家介紹了關(guān)于如何利用Java遞歸解決“九連環(huán)”公式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • SpringBoot Starter機(jī)制及整合tomcat的實(shí)現(xiàn)詳解

    SpringBoot Starter機(jī)制及整合tomcat的實(shí)現(xiàn)詳解

    這篇文章主要介紹了SpringBoot Starter機(jī)制及整合tomcat的實(shí)現(xiàn),我們知道SpringBoot自己在“后臺”幫我們配置了很多原本需要我們手動去的東西,至于這個“后臺”是啥,就是Starter機(jī)制
    2022-09-09
  • Java String類的常用方法匯總

    Java String類的常用方法匯總

    這篇文章主要為大家詳細(xì)匯總了Java String類的常用方法,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Java 敏感信息加密處理

    Java 敏感信息加密處理

    本文主要介紹了Java 敏感信息加密處理的相關(guān)知識:1)敏感信息加密處理我們要實(shí)現(xiàn)什么;2)敏感信息加密處理我做了些什么;3)敏感信息加密實(shí)現(xiàn)方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • java實(shí)現(xiàn)多個文件壓縮成壓縮包

    java實(shí)現(xiàn)多個文件壓縮成壓縮包

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)多個文件壓縮成壓縮包,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Linux centos7環(huán)境下jdk安裝教程

    Linux centos7環(huán)境下jdk安裝教程

    這篇文章主要為大家詳細(xì)介紹了Linux centos7環(huán)境下jdk的安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 詳解Java線程池如何實(shí)現(xiàn)優(yōu)雅退出

    詳解Java線程池如何實(shí)現(xiàn)優(yōu)雅退出

    這篇文章我們將從源碼角度深度解析線程池是如何優(yōu)雅的退出程序的,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)java線程池有一定幫助,需要的可以參考一下
    2022-07-07
  • 23種設(shè)計模式(13)java觀察者模式

    23種設(shè)計模式(13)java觀察者模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計模式之java觀察者模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java超詳細(xì)講解如何生成隨機(jī)整數(shù)

    Java超詳細(xì)講解如何生成隨機(jī)整數(shù)

    在?Java?中,生成隨機(jī)數(shù)的場景有很多,所以本文我們就來盤點(diǎn)一下?幾種生成隨機(jī)數(shù)的方式,以及它們之間的區(qū)別和每種生成方式所對應(yīng)的場景
    2022-05-05

最新評論

永济市| 枣庄市| 旬阳县| 安阳市| 海晏县| 万年县| 武强县| 安陆市| 措美县| 唐山市| 栖霞市| 卫辉市| 开封市| 保靖县| 宣恩县| 清流县| 内黄县| 广饶县| 拜泉县| 永安市| 招远市| 滦平县| 镇沅| 金秀| 云南省| 洛宁县| 白沙| 佛冈县| 荆门市| 吉林市| 长阳| 千阳县| 会东县| 长泰县| 深州市| 壶关县| 张家界市| 武宁县| 定边县| 溧阳市| 邵东县|