Redis数据类型--列表类型
夫陶公清風(fēng)千古,余又何人,敢稱庶幾
文章目錄
- 介紹
- 一、基本命令
- 1. 向列表兩端增加元素
- 2.從列表兩端彈出元素
- 3. 獲取列表中元素的個(gè)數(shù)
- 4.獲得列表片段
- 二、命令進(jìn)階
- 1.獲得/設(shè)置指定索引的元素值
- 2. 只保留列表指定片段
- 3.向列表中插入元素
- 4.將元素從一個(gè)列表轉(zhuǎn)到另一個(gè)列表
介紹
一、基本命令
1. 向列表兩端增加元素
LPUSH key value [value …] // 向左邊增加元素
RPUSH key value [value …] // 向右邊增加元素
- LPUSH:向列表左邊順序增加元素,返回值表示增加元素后列表的長(zhǎng)度,可以同時(shí)增加多個(gè)元素
實(shí)踐:使用Java操作Redis數(shù)據(jù)庫(kù):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:向列表右邊順序增加元素,返回值表示增加元素后列表的長(zhǎng)度,可以同時(shí)增加多個(gè)元素
實(shí)踐:使用Java操作Redis數(shù)據(jù)庫(kù):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 // 從列表右邊彈出元素,返回被移除的值
實(shí)踐:使用Java操作Redis數(shù)據(jù)庫(kù):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
模擬隊(duì)列:RPUSH 、RPOP
3. 獲取列表中元素的個(gè)數(shù)
LLEN key
當(dāng)鍵不存在時(shí),會(huì)返回0,LLEN的時(shí)間復(fù)雜度為O(1),直接讀取現(xiàn)成的長(zhǎng)度值。而某些關(guān)系數(shù)據(jù)庫(kù)需要遍歷完一遍數(shù)據(jù)表才能獲取所有元素的長(zhǎng)度,數(shù)據(jù)量大時(shí),速度特別慢,會(huì)影響性能。
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 // 獲取不存在的鍵的長(zhǎng)度值 (integer) 0 //返回04.獲得列表片段
LRANGE key start stop
特性:
- 包含兩端的元素
- 不會(huì)刪除該片段
- 支持負(fù)索引,從右邊開(kāi)始計(jì)數(shù),-1代表最右邊的第一個(gè)元素,-2為倒數(shù)第二個(gè),依此類推
注意:
- 如果start大于stop,則會(huì)返回空列表
- 如果stop大于實(shí)際范圍,則會(huì)返回到列表最右邊的元素
注:在實(shí)戰(zhàn)中,LRANGE start stop 常用于分頁(yè)
實(shí)踐:使用Java操作Redis數(shù)據(jù)庫(kù):LRANGE 簡(jiǎn)單分頁(yè)
@Testpublic void testLRANGE() {Jedis jedis = new Jedis("127.0.0.1", 6379);//jedis.rpush("city", new String[]{"云南", "北京", "上海", "天津", "廣東", "重慶", "四川", "河南", "哈爾濱"}); //添加9個(gè)數(shù)據(jù)System.out.println("所有的數(shù)據(jù):" + jedis.lrange("city", 0, jedis.llen("city")));List<String> page_1 = queryByPage("city", 1, 3); //第一頁(yè)System.out.println(page_1);List<String> page_2 = queryByPage("city", 2, 3); //第二頁(yè)System.out.println(page_2);List<String> page_3 = queryByPage("city", 3, 3); //第三頁(yè)System.out.println(page_3);}/*** 分頁(yè)** @param o 要分頁(yè)的數(shù)據(jù)* @param page 頁(yè)* @param size 每頁(yè)顯示的數(shù)據(jù)* @return 分頁(yè)后的數(shù)據(jù)*/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;} 所有的數(shù)據(jù):[云南, 北京, 上海, 天津, 廣東, 重慶, 四川, 河南, 哈爾濱] 第一頁(yè):[云南, 北京, 上海] 第二頁(yè):[天津, 廣東, 重慶] 第三頁(yè):[四川, 河南, 哈爾濱]二、命令進(jìn)階
1.獲得/設(shè)置指定索引的元素值
LINDEX key index // 獲得指定索引的值
用來(lái)返回指定索引的元素值
特性:
- 索引從0開(kāi)始
- 如果索引index是負(fù)數(shù)表示從右邊開(kāi)始,-1表示最右邊元素
- 如果索引不存在則返回空(nil)
LSET key index value //設(shè)置指定索引的值
為指定索引重新賦值,如果超出列表最大索引會(huì)報(bào)錯(cuò):(error) ERR index out of range,而且不支持負(fù)索引,如果為負(fù)值,則會(huì)報(bào)錯(cuò):(error) ERR no such key
案例:
- LINDEX:
- LSET :
2. 只保留列表指定片段
LTRIM key start end
刪除指定索引范圍之外的所有元素,支持負(fù)索引
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 //刪除第一個(gè)元素 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"實(shí)踐:使用Java操作Redis數(shù)據(jù)庫(kù):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的元素,然后根據(jù)第二個(gè)參數(shù)是BEFORE還是AFTER 來(lái)決定將value插入到該元素的前面還是后面,返回值是插入后列表的元素個(gè)數(shù)。
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.將元素從一個(gè)列表轉(zhuǎn)到另一個(gè)列表
RPOPLPUSH source destination
RPOPLPUSH 命令的功能是先執(zhí)行RPOP命令再執(zhí)行LPUSH命令。RPOPLPUSH命令會(huì)先從source列表類型鍵的右邊彈出一個(gè)元素,將其加入到destination列表類型鍵的左邊,并返回這個(gè)元素值,整個(gè)過(guò)程是原子的。
127.0.0.1:6379> rpush num_1 1 2 3 4 5 //新建一個(gè)列表,并添加5個(gè)元素 (integer) 5 127.0.0.1:6379> rpush num_2 6 7 8 9 10 //新建一個(gè)列表,并添加5個(gè)元素 (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右邊彈出一個(gè)元素到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 //最左邊多了一個(gè)元素5 1) "5" 2) "6" 3) "7" 4) "8" 5) "9" 6) "10"注:當(dāng)把列表類型作為隊(duì)列使用時(shí),如果source和destination 相同時(shí),可以實(shí)現(xiàn)一個(gè)網(wǎng)站監(jiān)控系統(tǒng)。
Redis中文官方網(wǎng)站:http://www.redis.cn
未完待續(xù),持續(xù)更新中...
總結(jié)
以上是生活随笔為你收集整理的Redis数据类型--列表类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Windows版nacos启动报错(na
- 下一篇: Excel VBA Sql 操作Acce