日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis数据类型--列表类型

發布時間:2024/9/27 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis数据类型--列表类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

夫陶公清風千古,余又何人,敢稱庶幾


文章目錄

    • 介紹
      • 一、基本命令
        • 1. 向列表兩端增加元素
        • 2.從列表兩端彈出元素
        • 3. 獲取列表中元素的個數
        • 4.獲得列表片段
      • 二、命令進階
        • 1.獲得/設置指定索引的元素值
        • 2. 只保留列表指定片段
        • 3.向列表中插入元素
        • 4.將元素從一個列表轉到另一個列表

介紹

一、基本命令

1. 向列表兩端增加元素

LPUSH key value [value …] // 向左邊增加元素
RPUSH key value [value …] // 向右邊增加元素

  • LPUSH:向列表左邊順序增加元素,返回值表示增加元素后列表的長度,可以同時增加多個元素
127.0.0.1:6379> lpush user 1 2 (integer) 2 127.0.0.1:6379> lpush user 3 (integer) 3 127.0.0.1:6379> lpush user 4 5 6 (integer) 6 127.0.0.1:6379> lrange user 0 6 1) "6" 2) "5" 3) "4" 4) "3" 5) "2" 6) "1

實踐:使用Java操作Redis數據庫:LPUSH

@Testpublic void testLPUSH(){Jedis jedis = new Jedis("127.0.0.1",6379);jedis.lpush("user","1");System.out.println(jedis.lrange("user", 0, 4));System.out.println();jedis.lpush("user",new String[]{"2","5","3"});System.out.println(jedis.lrange("user", 0, 4));} [1][3, 5, 2, 1]
  • RPUSH:向列表右邊順序增加元素,返回值表示增加元素后列表的長度,可以同時增加多個元素
127.0.0.1:6379> rpush user 1 (integer) 1 127.0.0.1:6379> rpush user 2 3 4 (integer) 4 127.0.0.1:6379> lrange user 0 4 1) "1" 2) "2" 3) "3" 4) "4"

實踐:使用Java操作Redis數據庫:RPUSH

@Testpublic void testRPUSH() {Jedis jedis = new Jedis("127.0.0.1", 6379);jedis.rpush("user", "1");List<String> lrange_1 = jedis.lrange("user", 0, jedis.llen("user"));System.out.println(lrange_1);jedis.rpush("user", new String[]{"2", "3", "4", "5", "6"});List<String> lrange_2 = jedis.lrange("user", 0, jedis.llen("user"));System.out.println(lrange_2);} [1] [1, 2, 3, 4, 5, 6]

2.從列表兩端彈出元素

LPOP key // 從列表左邊彈出元素,返回被移除的值
RPOP key // 從列表右邊彈出元素,返回被移除的值

127.0.0.1:6379> rpush nums // 1 2 3 4 5 6 放入6個元素 (integer) 6 127.0.0.1:6379> lrange nums 0 6 // 遍歷所有元素 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 127.0.0.1:6379> lpop nums // 從左邊彈出元素 "1" 127.0.0.1:6379> lpop nums // 從左邊彈出元素 "2" 127.0.0.1:6379> rpop nums // 從右邊彈出元素 "6" 127.0.0.1:6379> rpop nums // 從右邊彈出元素 "5"

實踐:使用Java操作Redis數據庫:LPOP、RPOP

@Testpublic void testLTOPAndRPOP() {Jedis jedis = new Jedis("127.0.0.1", 6379);jedis.rpush("nums", new String[]{"1", "2", "3", "4", "5", "6"});System.out.println("所有元素:" + jedis.lrange("nums", 0, jedis.llen("nums")));String l1 = jedis.lpop("nums");String l2 = jedis.lpop("nums");System.out.println("左邊彈出元素:" + l1);System.out.println("左邊彈出元素:" + l2);String r1 = jedis.rpop("nums");String r2 = jedis.rpop("nums");System.out.println("左邊彈出元素:" + r1);System.out.println("左邊彈出元素:" + r2);System.out.println("所有元素:" + jedis.lrange("nums", 0, jedis.llen("nums")));} 所有元素:[1, 2, 3, 4, 5, 6] 左邊彈出元素:1 左邊彈出元素:2 左邊彈出元素:6 左邊彈出元素:5 所有元素:[3, 4]

模擬棧:LPUSH、LPOP

模擬隊列:RPUSH 、RPOP

3. 獲取列表中元素的個數

LLEN key

當鍵不存在時,會返回0,LLEN的時間復雜度為O(1),直接讀取現成的長度值。而某些關系數據庫需要遍歷完一遍數據表才能獲取所有元素的長度,數據量大時,速度特別慢,會影響性能。

127.0.0.1:6379> rpush nums 1 2 3 4 5 6 (integer) 6 127.0.0.1:6379> llen nums (integer) 6 127.0.0.1:6379> llen other // 獲取不存在的鍵的長度值 (integer) 0 //返回0

4.獲得列表片段

LRANGE key start stop

特性:

  • 包含兩端的元素
  • 不會刪除該片段
  • 支持負索引,從右邊開始計數,-1代表最右邊的第一個元素,-2為倒數第二個,依此類推

注意:

  • 如果start大于stop,則會返回空列表
  • 如果stop大于實際范圍,則會返回到列表最右邊的元素
127.0.0.1:6379> lrange nums 0 10 // 遍歷索引0-10的所有元素1) "1"2) "2"3) "3"4) "4"5) "5"6) "6"7) "7"8) "8"9) "9" 10) "10" 127.0.0.1:6379> lrange nums 2 5 // 遍歷索引2-5的元素 1) "3" 2) "4" 3) "5" 4) "6" 127.0.0.1:6379> lrange nums -2 -1 // 遍歷最后一個和倒數第二個元素 1) "9" 2) "10" 127.0.0.1:6379> lrange nums -9 -1 1) "2" 2) "3" 3) "4" 4) "5" 5) "6" 6) "7" 7) "8" 8) "9" 9) "10" 127.0.0.1:6379> lrange nums -10 -11) "1"2) "2"3) "3"4) "4"5) "5"6) "6"7) "7"8) "8"9) "9" 10) "10" 127.0.0.1:6379> lrange nums 1 9999 // stop大于實際值 1) "2" 2) "3" 3) "4" 4) "5" 5) "6" 6) "7" 7) "8" 8) "9" 9) "10" 127.0.0.1:6379> lrange nums 9999 1 // start大于stop (empty list or set) //返回空列表

注:在實戰中,LRANGE start stop 常用于分頁

實踐:使用Java操作Redis數據庫:LRANGE 簡單分頁

@Testpublic void testLRANGE() {Jedis jedis = new Jedis("127.0.0.1", 6379);//jedis.rpush("city", new String[]{"云南", "北京", "上海", "天津", "廣東", "重慶", "四川", "河南", "哈爾濱"}); //添加9個數據System.out.println("所有的數據:" + jedis.lrange("city", 0, jedis.llen("city")));List<String> page_1 = queryByPage("city", 1, 3); //第一頁System.out.println(page_1);List<String> page_2 = queryByPage("city", 2, 3); //第二頁System.out.println(page_2);List<String> page_3 = queryByPage("city", 3, 3); //第三頁System.out.println(page_3);}/*** 分頁** @param o 要分頁的數據* @param page 頁* @param size 每頁顯示的數據* @return 分頁后的數據*/public List<String> queryByPage(String o, Integer page, Integer size) {Jedis jedis = new Jedis("127.0.0.1", 6379);Integer start = (page - 1) * size;// Integer sizes = size - 1 + start;Integer sizes = page*size-1;List<String> city = jedis.lrange("city", start, sizes);return city;} 所有的數據:[云南, 北京, 上海, 天津, 廣東, 重慶, 四川, 河南, 哈爾濱] 第一頁:[云南, 北京, 上海] 第二頁:[天津, 廣東, 重慶] 第三頁:[四川, 河南, 哈爾濱]

二、命令進階

1.獲得/設置指定索引的元素值

LINDEX key index // 獲得指定索引的值

用來返回指定索引的元素值

特性:

  • 索引從0開始
  • 如果索引index是負數表示從右邊開始,-1表示最右邊元素
  • 如果索引不存在則返回空(nil)

LSET key index value //設置指定索引的值

為指定索引重新賦值,如果超出列表最大索引會報錯:(error) ERR index out of range,而且不支持負索引,如果為負值,則會報錯:(error) ERR no such key

案例:

  • LINDEX:
127.0.0.1:6379> keys * 1) "nums" 2) "city" 127.0.0.1:6379> lrange nums 0 101) "1"2) "2"3) "3"4) "4"5) "5"6) "6"7) "7"8) "8"9) "9" 10) "10" 127.0.0.1:6379> lindex num 5 (nil) 127.0.0.1:6379> lindex nums 5 "6" 127.0.0.1:6379> lindex nums -1 //索引為賦值,從右邊開始,-1返回最右邊元素 "10" 127.0.0.1:6379> lindex nums 999 //索引999不存在 (nil) //返回空 127.0.0.1:6379> lindex nums 0 //索引從0開始 "1"
  • LSET :
127.0.0.1:6379> lrange nums 0 101) "1"2) "2"3) "3"4) "4"5) "5"6) "6"7) "7"8) "8"9) "9" 10) "10" 127.0.0.1:6379> lset nums 0 110 //為第一個索引(0)賦值 110 OK 127.0.0.1:6379> lindex nums 0 "110" 127.0.0.1:6379> lset nums 11 11 //超出索引范圍賦值,報錯 (error) ERR index out of range 127.0.0.1:6379> lset num -1 200 // 負索引賦值 ,報錯 (error) ERR no such key

2. 只保留列表指定片段

LTRIM key start end

刪除指定索引范圍之外的所有元素,支持負索引

127.0.0.1:6379> lrange nums 0 -1 //查看所有的元素1) "110"2) "2"3) "3"4) "4"5) "5"6) "6"7) "7"8) "8"9) "9" 10) "10" 127.0.0.1:6379> ltrim nums 1 -1 //刪除第一個元素 OK 127.0.0.1:6379> lrange nums 0 -1 //查看所有的元素 1) "2" 2) "3" 3) "4" 4) "5" 5) "6" 6) "7" 7) "8" 8) "9" 9) "10"

實踐:使用Java操作Redis數據庫:LTRIM 記錄前10條最新的日志

@Testpublic void testLTRIM() {Integer index = 0;Jedis jedis = new Jedis("127.0.0.1", 6379);// 模擬添加10條日志jedis.lpush("logs", new String[]{"2021-2-19 13:40","2021-2-19 13:41","2021-2-19 13:42","2021-2-19 13:43","2021-2-19 13:44","2021-2-19 13:45","2021-2-19 13:46","2021-2-19 13:47","2021-2-19 13:48","2021-2-19 13:49","2021-2-19 13:50",});System.out.println("-------------------------------------------------------------------------");System.out.println("變更前...");jedis.ltrim("logs", 0, 9); //顯示最新的前十條日志List<String> logs_1 = jedis.lrange("logs", 0, -1); //獲取所有的日志logs_1.forEach((log) -> System.out.println("【日志】" + log)); //遍歷所有的日志System.out.println("-------------------------------------------------------------------------");System.out.println("變更后...");//模擬添加3條日志到列表中jedis.lpush("logs", new String[]{"2021-2-19 13:51","2021-2-19 13:52","2021-2-19 13:53",});jedis.ltrim("logs", 0, 9); //顯示最新的前十條日志List<String> logs_2 = jedis.lrange("logs", 0, -1); //獲取所有的日志logs_2.forEach((log) -> System.out.println("【日志】" + log)); //遍歷所有的日志} ------------------------------------------------------------------------- 變更前... 【日志】2021-2-19 13:50 【日志】2021-2-19 13:49 【日志】2021-2-19 13:48 【日志】2021-2-19 13:47 【日志】2021-2-19 13:46 【日志】2021-2-19 13:45 【日志】2021-2-19 13:44 【日志】2021-2-19 13:43 【日志】2021-2-19 13:42 【日志】2021-2-19 13:41 ------------------------------------------------------------------------- 變更后... 【日志】2021-2-19 13:53 【日志】2021-2-19 13:52 【日志】2021-2-19 13:51 【日志】2021-2-19 13:50 【日志】2021-2-19 13:49 【日志】2021-2-19 13:48 【日志】2021-2-19 13:47 【日志】2021-2-19 13:46 【日志】2021-2-19 13:45 【日志】2021-2-19 13:44

3.向列表中插入元素

LINSERT key BEFORE|AFTER pivot value

此命令首先從左到右查找值為pivot的元素,然后根據第二個參數是BEFORE還是AFTER 來決定將value插入到該元素的前面還是后面,返回值是插入后列表的元素個數。

127.0.0.1:6379> lrange nums 0 -1 //遍歷所有的元素 1) "2" 2) "3" 3) "4" 4) "5" 5) "6" 6) "7" 7) "8" 8) "9" 9) "10" 127.0.0.1:6379> linsert nums before 5 4.5 //在值為5之前添加元素4.5 (integer) 10 127.0.0.1:6379> lrange nums 0 -11) "2"2) "3"3) "4"4) "4.5"5) "5"6) "6"7) "7"8) "8"9) "9" 10) "10" 127.0.0.1:6379> linsert nums after 5 5.5 //在值為5之后添加元素5.5 (integer) 11 127.0.0.1:6379> lrange nums 0 -11) "2"2) "3"3) "4"4) "4.5"5) "5"6) "5.5"7) "6"8) "7"9) "8" 10) "9" 11) "10"

4.將元素從一個列表轉到另一個列表

RPOPLPUSH source destination

RPOPLPUSH 命令的功能是先執行RPOP命令再執行LPUSH命令。RPOPLPUSH命令會先從source列表類型鍵的右邊彈出一個元素,將其加入到destination列表類型鍵的左邊,并返回這個元素值,整個過程是原子的。

127.0.0.1:6379> rpush num_1 1 2 3 4 5 //新建一個列表,并添加5個元素 (integer) 5 127.0.0.1:6379> rpush num_2 6 7 8 9 10 //新建一個列表,并添加5個元素 (integer) 5 127.0.0.1:6379> keys * 1) "num_1" 2) "nums" 3) "city" 4) "logs" 5) "num_2" 127.0.0.1:6379> lrange num_1 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 127.0.0.1:6379> lrange num_2 0 -1 1) "6" 2) "7" 3) "8" 4) "9" 5) "10" 127.0.0.1:6379> rpoplpush num_1 num_2 //從num_1右邊彈出一個元素到num_2左邊 "5" 127.0.0.1:6379> lrange num_1 0 -1 //少了最右邊元素5 1) "1" 2) "2" 3) "3" 4) "4" 127.0.0.1:6379> lrange num_2 0 -1 //最左邊多了一個元素5 1) "5" 2) "6" 3) "7" 4) "8" 5) "9" 6) "10"

注:當把列表類型作為隊列使用時,如果source和destination 相同時,可以實現一個網站監控系統。


Redis中文官方網站:http://www.redis.cn


未完待續,持續更新中...

總結

以上是生活随笔為你收集整理的Redis数据类型--列表类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。