当前位置:首页 > 问答 > 正文

Redis怎么拿数组里的数据,常用命令和方法都在这儿讲解

Redis里面没有严格意义上的“数组”这个数据类型,但是有一个叫“列表”(List)的数据结构,它跟我们平时用的数组非常像,可以按顺序存放一堆数据,你可以根据位置索引来拿里面的值,所以我们就把它当作数组来用就行了,下面我就把这些常用的命令和方法给你讲明白。

往列表(数组)里放数据

你得把数据放进列表里,才能谈怎么拿,放数据主要有两个方向:从左边放和从右边放。

  1. LPUSH 命令 (来源:Redis官方命令文档) 这个命令是从列表的“左边”放进一个或多个值,你可以想象列表是横着的,左边是开头,你有一个叫 mylist 的列表,执行 LPUSH mylist "apple","apple" 就被放到了列表的最前面,如果再执行 LPUSH mylist "banana" "orange",它会先把 "orange" 放到最左边,再把 "banana" 放到 "orange" 的左边,所以现在列表里的顺序是 ["banana", "orange", "apple"],这个命令适合当你想要最新添加的数据排在最前面的时候用,比如做消息队列或者最新动态列表。

  2. RPUSH 命令 (来源:Redis官方命令文档) 这个和LPUSH相反,是从列表的“右边”放进一个或多个值,同样用 mylist 的例子,执行 RPUSH mylist "apple","apple" 被放在最右边,再执行 RPUSH mylist "banana" "orange",会依次把 "banana" 和 "orange" 加到最右边,列表变成 ["apple", "banana", "orange"],这就像我们平时排队,新来的人总是排在队伍末尾,这种方式很自然,适合记录按时间顺序发生的事件。

从列表(数组)里取数据

放进去之后,怎么拿出来是关键,取数据的方法比较多,根据你的需要来选择。

  1. LRANGE 命令 (来源:Redis官方命令文档) 这是最常用、最像“取数组元素”的命令,它可以让你获取列表里指定范围内的所有元素,命令的格式是 LRANGE key start stop,这里的 key 就是列表的名字,myliststartstop 是索引位置,关键点来了:Redis列表的索引是从0开始的,和大多数编程语言里的数组一样,0代表第一个元素,1代表第二个,以此类推。 有两个特殊的索引值很方便:

    • -1 代表列表中的最后一个元素。
    • -2 代表倒数第二个元素。
    • 想获取整个列表的所有元素,就用 LRANGE mylist 0 -1
    • 只想获取前三个元素,就用 LRANGE mylist 0 2(因为索引从0开始,0,1,2正好是三个)。
    • 想获取最后两个元素,就用 LRANGE mylist -2 -1。 这个命令只负责“看”数据,不会把数据从列表里删除。
  2. LINDEX 命令 (来源:Redis官方命令文档) 这个命令相当于直接通过下标访问数组的某个元素,你想知道列表 mylist 里第二个元素是什么(索引为1),就执行 LINDEX mylist 1,Redis会直接返回这个位置的值,如果你想取最后一个元素,也可以用 LINDEX mylist -1,这个命令也是只读的,不删除数据。

  3. LPOP 命令 (来源:Redis官方命令文档) 这个命令的作用是“弹出”列表最左边(头部)的元素,执行 LPOP mylist,它会做两件事:一是返回 mylist 列表的第一个元素是什么,二是把这个元素从列表里永久删除,这个特性使得它非常适合用来实现“队列”(先进先出):一边用RPUSH从右边往里加任务,另一边用LPOP从左边取出任务处理。

  4. RPOP 命令 (来源:Redis官方命令文档) 和LPOP对应,它是从列表的最右边(尾部)弹出元素,同样,它也是返回并删除该元素,这个可以用来实现“栈”(后进先出):用LPUSH从左边加,用LPOP从左边取;或者用RPUSH从右边加,用RPOP从右边取。

其他有用的操作

除了基本的存取,还有一些命令能帮你更好地管理列表。

  1. LLEN 命令 (来源:Redis官方命令文档) 这个命令很简单,就是查看列表的长度,也就是里面有多少个元素。LLEN mylist 会返回一个数字,告诉你 mylist 里现在有多少项,这在分页查询或者判断列表是否为空的时候很有用。

  2. LTRIM 命令 (来源:Redis官方命令文档) 这个命令可以理解成“裁剪”列表,它只保留指定区间内的元素,区间之外的全部删除,你有一个很长的列表 mylist,你只想保留最新的10条记录,就可以执行 LTRIM mylist 0 9(保留索引从0到9的元素,共10个),或者,你可以用 LTRIM mylist -10 -1 来保留最后10个元素,效果一样,这个命令常用于限制列表的长度,防止它无限增长占用太多内存。

简单总结一下:

  • 想查看数据而不删除,主要用 LRANGE(取范围)和 LINDEX(取单个)。
  • 想以队列或栈的形式消费数据,边取边删,就用 LPOP / RPOP
  • 想知道列表有多长,用 LLEN
  • 想控制列表大小,用 LTRIM

这些就是Redis中操作类似数组的列表数据最核心、最常用的命令了,你根据你的业务场景,比如是需要遍历还是精准定位,是需要持久化数据还是消费后删除,来组合使用这些命令就可以了。

Redis怎么拿数组里的数据,常用命令和方法都在这儿讲解