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]
模拟
栈
:L
PUSH、L
POP
模拟
队列
:R
PUSH 、R
POP
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数据类型--列表类型相关推荐
- Redis 数据类型 Strings 类型详解
Redis 数据类型 Strings 类型详解 bitmap 操作 SETBIT • SETBIT key offset value 起始版本:2.2.0 时间复杂度:O(1) 设置或者清空key的v ...
- Redis数据类型--字符串类型
夫陶公清风千古,余又何人,敢称庶几 文章目录 介绍 一.基本命令 1. 赋值与取值 2. 递增数字 二.命令进阶 1. 增加指定的整数 2. 减少指定的整数 3. 增加指定浮点数 4. 向尾部追加值 ...
- Redis数据类型--集合类型
夫陶公清风千古,余又何人,敢称庶几 文章目录 介绍 一.基本命令 1.增加/删除元素 2.获得集合中的所有元素 3.判断元素是否在集合中 4.集合间运算 二.命令进阶 1.获取集合中元素个数 2.进行 ...
- redis数据类型 - Hash类型
hash类型,是一个string类型的field和value的映射表. hash存放的是键值对,可以很方便的存放对象. 常用操作 hset 设置hash field为指定值,如果key不存在,则先创建 ...
- Redis数据类型详解(五种)
Redis支持五种数据类型,即string(字符串).hash(哈希).list(列表).set(集合)及zset(sorted set:有序集合),云吞铺子分享Redis数据类型谅解: Redis数 ...
- redis hash field过期时间_Redis系列-Redis数据类型
1.全局命令 1.1查看所有键 127.0.0.1:6379> set k1 111OK127.0.0.1:6379> set k2 222OK127.0.0.1:6379> set ...
- Redis介绍--列表(LISTS)数据类型(六)
前面文章我们介绍了STRING的基本命令,本文我们介绍Redis中的列表(LISTS). 以下是Redis系列文章链接,有兴趣的童鞋,可以看一下. Redis介绍–Linux系统下的安装(一) ...
- Redis五大基本类型三种特殊数据类型事务操作(悲观锁,乐观锁)
Redis五大基本类型 Redis是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持多种类型的数据 结构,如字符串(strings),散列(hashes) ...
- Redis数据类型(hash 类型)
Redis数据类型(hash 类型) hash 类型及操作 ① 概述 ② 相关命令列表 ③ 命令示例 hash 类型及操作 ① 概述 Redis中的Hash类型可以理解是具有String Key和St ...
最新文章
- activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
- 【spring boot】第3篇:spring boot 进行 web 开发
- 【Interfacenavigation】XML中的字体(27)
- mysql四列数据表代码_MySQL数据库常用代码
- mapinfo在线地图插件_表格中如何可视化地址数据?用 SeaTable 的地图插件很方便...
- 图像处理:matplotlib
- 项目管理课件_项目管理(PMO)工作到底干些啥?
- TypeScript入门知识五(面向对象特性二)
- 《Python Cookbook 3rd》笔记(3.14):计算当前月份的日期范围
- SpringCloud工作笔记057---常用免费数据接口
- gcc,make和cmake
- Win11玩永劫无间闪退怎么办?Win11玩永劫无间闪退的解决方法
- CLR VIA C#(一)
- 五大常用算法之回溯法
- CDR制作壮观的浩瀚宇宙星空实例教程
- 读《南怀瑾讲人生哲理》
- “爱拍照”的OPPO逆袭战:合并一加,跑步造车
- 怎么看apache443端口是否打开_win7如何打开443端口
- Java语言程序设计数据结构基础篇第11版6.31(金融应用:信用卡号的合法性检验)信用卡号遵循某种模式。一个信用卡号必须是13-16位的整数 (java)
- 事务(Transaction)的简单理解