Redis数据类型--列表类型
夫陶公清風千古,余又何人,敢稱庶幾
文章目錄
- 介紹
- 一、基本命令
- 1. 向列表兩端增加元素
- 2.從列表兩端彈出元素
- 3. 獲取列表中元素的個數
- 4.獲得列表片段
- 二、命令進階
- 1.獲得/設置指定索引的元素值
- 2. 只保留列表指定片段
- 3.向列表中插入元素
- 4.將元素從一個列表轉到另一個列表
介紹
一、基本命令
1. 向列表兩端增加元素
LPUSH key value [value …] // 向左邊增加元素
RPUSH key value [value …] // 向右邊增加元素
- LPUSH:向列表左邊順序增加元素,返回值表示增加元素后列表的長度,可以同時增加多個元素
實踐:使用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:向列表右邊順序增加元素,返回值表示增加元素后列表的長度,可以同時增加多個元素
實踐:使用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 // 從列表右邊彈出元素,返回被移除的值
實踐:使用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 //返回04.獲得列表片段
LRANGE key start stop
特性:
- 包含兩端的元素
- 不會刪除該片段
- 支持負索引,從右邊開始計數,-1代表最右邊的第一個元素,-2為倒數第二個,依此類推
注意:
- 如果start大于stop,則會返回空列表
- 如果stop大于實際范圍,則會返回到列表最右邊的元素
注:在實戰中,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:
- LSET :
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:443.向列表中插入元素
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数据类型--列表类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows版nacos启动报错(na
- 下一篇: 支付宝和微信的JSSDK发起支付