夫陶公清风千古,余又何人,敢称庶几


文章目录

  • 介绍
    • 一、基本命令
      • 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数据库:LPOPRPOP

@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"

:当把列表类型作为队列使用时,如果sourcedestination 相同时,可以实现一个网站监控系统


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


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

Redis数据类型--列表类型相关推荐

  1. Redis 数据类型 Strings 类型详解

    Redis 数据类型 Strings 类型详解 bitmap 操作 SETBIT • SETBIT key offset value 起始版本:2.2.0 时间复杂度:O(1) 设置或者清空key的v ...

  2. Redis数据类型--字符串类型

    夫陶公清风千古,余又何人,敢称庶几 文章目录 介绍 一.基本命令 1. 赋值与取值 2. 递增数字 二.命令进阶 1. 增加指定的整数 2. 减少指定的整数 3. 增加指定浮点数 4. 向尾部追加值 ...

  3. Redis数据类型--集合类型

    夫陶公清风千古,余又何人,敢称庶几 文章目录 介绍 一.基本命令 1.增加/删除元素 2.获得集合中的所有元素 3.判断元素是否在集合中 4.集合间运算 二.命令进阶 1.获取集合中元素个数 2.进行 ...

  4. redis数据类型 - Hash类型

    hash类型,是一个string类型的field和value的映射表. hash存放的是键值对,可以很方便的存放对象. 常用操作 hset 设置hash field为指定值,如果key不存在,则先创建 ...

  5. Redis数据类型详解(五种)

    Redis支持五种数据类型,即string(字符串).hash(哈希).list(列表).set(集合)及zset(sorted set:有序集合),云吞铺子分享Redis数据类型谅解: Redis数 ...

  6. 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 ...

  7. Redis介绍--列表(LISTS)数据类型(六)

      前面文章我们介绍了STRING的基本命令,本文我们介绍Redis中的列表(LISTS).   以下是Redis系列文章链接,有兴趣的童鞋,可以看一下. Redis介绍–Linux系统下的安装(一) ...

  8. Redis五大基本类型三种特殊数据类型事务操作(悲观锁,乐观锁)

    Redis五大基本类型 Redis是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持多种类型的数据 结构,如字符串(strings),散列(hashes) ...

  9. Redis数据类型(hash 类型)

    Redis数据类型(hash 类型) hash 类型及操作 ① 概述 ② 相关命令列表 ③ 命令示例 hash 类型及操作 ① 概述 Redis中的Hash类型可以理解是具有String Key和St ...

最新文章

  1. activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
  2. 【spring boot】第3篇:spring boot 进行 web 开发
  3. 【Interfacenavigation】XML中的字体(27)
  4. mysql四列数据表代码_MySQL数据库常用代码
  5. mapinfo在线地图插件_表格中如何可视化地址数据?用 SeaTable 的地图插件很方便...
  6. 图像处理:matplotlib
  7. 项目管理课件_项目管理(PMO)工作到底干些啥?
  8. TypeScript入门知识五(面向对象特性二)
  9. 《Python Cookbook 3rd》笔记(3.14):计算当前月份的日期范围
  10. SpringCloud工作笔记057---常用免费数据接口
  11. gcc,make和cmake
  12. Win11玩永劫无间闪退怎么办?Win11玩永劫无间闪退的解决方法
  13. CLR VIA C#(一)
  14. 五大常用算法之回溯法
  15. CDR制作壮观的浩瀚宇宙星空实例教程
  16. 读《南怀瑾讲人生哲理》
  17. “爱拍照”的OPPO逆袭战:合并一加,跑步造车
  18. 怎么看apache443端口是否打开_win7如何打开443端口
  19. Java语言程序设计数据结构基础篇第11版6.31(金融应用:信用卡号的合法性检验)信用卡号遵循某种模式。一个信用卡号必须是13-16位的整数 (java)
  20. 事务(Transaction)的简单理解

热门文章

  1. elasticsearch亿级数据量全量索引导入优化方案
  2. 【转载】LinkedHashMap和HashMap区别
  3. RSocket协议初识
  4. Maxcompute造数据-方法详解
  5. 深入理解C++中的RVO
  6. 数据中台技术及业务发展史与未来趋势展望
  7. 定义下一代存储,打造全新一代数据基础设施
  8. “练好内功坚持被集成”,阿里云发布SaaS加速器
  9. 用PyTorch创建一个图像分类器?So easy!(Part 1)
  10. AI、元宇宙技术方兴未艾,软件测试重装上阵