3.3 列表类型
3.3.1 介绍
列表类型(list)可以存储一个
有序的字符串列表,常用的操作是向列表
两端添加元素,或者获得列表的某一个片段。列表类型内部是使用
双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的(和从只有20个元素的列表中获取头部或尾部的10条记录的速度是一样的)。
不过使用链表的代价是通过索引访问元素比较慢。
这种特性使列表类型能非常快速地完成关系数据库难以应付的场景:如社交网站的新鲜事,我们关心的只是
最新的内容,使用列表类型存储,即使新鲜事的总数达到几千万个,获取其中
最新的100条数据也是极快的。同样因为在两端插入记录的时间复杂度是0(1),列表类型也适合用来记录日志,可以保证加入新日志的速度不会受到已有日志数量的影响。
与散列类型键最多能容纳的字段数量相同,
一个列表类型键最多能容纳2^32-1个元素。
3.3.2 命令
1.向列表两端增加元素
LPUSH key value [value …]
RPUSH key value [value …]
LPUSH命令用来向列表左边增加元素,返回值表示增加元素后列表的长度。
redis>LPUSH numbers 1
(integer) 1
2.从列表两端弹出元素
LPOP key
RPOP key
有进有出,LPOP命令可以从列表
左边弹出一个元素。
LPOP命令执行两步操作:
第一步是将列表左边的元素从列表中
移除;
第二步是返回被移除的元素值。例如,从numbers列表左边弹出一个元素(也就是"3"):
redis>LPOP numbers
"3"
结合上面提到的4个命令可以使用列表类型来
模拟栈和队列的操作:如果想把列表当做栈,则搭配使用LPUSH和LPOP或RPUSH和RPOP,如果想当成队列,则搭配使用LPUSH和RPOP或RPUSH和LPOP。
3.获取列表中元素的个数
LLEN key
当键不存在时LLEN会返回0:
redis>LLEN numbers
(integer) 3
LLEN命令的功能类似SQL语句SELECT COUNT(*) FROM table_name,但是LLEN的
时间复杂度为0(1),使用时Redis会直接读取现成的值,而不需要像部分关系数据库(如使用InnoDB 存储引擎的MySQL表)那样需要遍历一遍数据表来统计条目数量。
4.获得列表片段
LRANGE key start stop
LRANGE命令是列表类型最常用的命令之一,它能够获得列表中的某一片段。LRANGE命令将返回索引从start到stop之间的所有元素(
包含两端的元素)。与大多数人的直觉相同,Redis的列表起始索引为0:
redis>LRANGE numbers 0 2
1) "2"
2) "1"
3) "0"
LRANGE命令在取得列表片段的同时
不会像LPOP一样删除该片段,另外LRANGE命令与很多语言中用来截取数组片段的方法slice有一点区别是LRANGE返回的值包含最右边的元素。
LRANGE命令
支持负索引,
表示从右边开始计算序数,如"-1"表示最右边第一个元素,"-2"表示最右边第二个元素,依次类推:
redis>LRANGE numbers -2 -1
1) "1"
2) "0"
显然,LRANGE numbers 0 -1可以获取列表中的所有元素。另外一些特殊情况如下。
(1)如果start的索引位置比stop的索引位置靠后,则会返回空列表。
(2)如果stop大于实际的索引范围,则会返回到列表最右边的元素
5.删除列表中指定的值
LREM key count value
LREM命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数。根据count值的不同,LREM命令的执行方式会略有差异:
- ●当count>0时LREM命令会从列表左边开始删除前count个值为value的元素;
- ●当count<0时LREM 命令会从列表右边开始删除前|count|个值为value的元素;
- ●当count=0是LREM命令会删除所有值为value的元素
#从右边开始删除第一个值为"2"的元素
redis>LREM numbers -1 2
(integer) 1
redis>LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
6. 获得/设置指定索引的元素值
LINDEX key index
LSET key index value
如果要将列表类型当作数组来用,LINDEX命令是必不可少的。LINDEX命令用来返回指定索引的元素,索引从0开始。如:
redis>LINDEX numbers 0
"2"
如果index是
负数则表示从右边开始计算的索引,最右边元素的索引是-1。例如:
redis>LINDEX numbers -1
"0"
LSET是另一个通过索引操作列表的命令,它会将索引为index的元素赋值为value。例如:
redis>LSET numbers 1 7
OK
redis>LINDEX numbers 1
"7"
注意,这个命令只能修改指定索引元素的值,不能新增。如果index超过了list的下标范围,则会返回错误提示:(error) ERR index out of range
7.只保留列表指定片段
LTRIM key start end
LTRIM命令可以
删除指定索引范围之外的所有元素,其指定列表范围的方法和LRANGE命令相同。
LTRIM命令常和LPUSH命令一起使用来限制列表中元素的数量,比如记录日志时我们希望只保留最近的100条日志,则每次加入新元素时调用一次LTRIM命令即可:
LPUSH logs newLog
LTRIM logs 0 99
8.向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
LINSERT命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
LINSERT命令的返回值是插入后列表的元素个数。示例如下:
redis>LRANGE numbers 0 -1
1) "2"
2) "7"
3) "0"
redis>LINSERT numbers AFTER 7 3
(integer) 4
redis>LRANGE numbers 0 -1
1) "2"
2) "7"
3) "3"
4) "0"
redis>LINSERT numbers BEFORE 2 1
(integer) 5
redis>LRANGE numbers 0 -1
1) "1"
2) "2"
3) "7"
4) "3"
5) "0"
9.将元素从一个列表转到另一个列表R
RPOPLPUSH source destination
RPOPLPUSH是个很有意思的命令,从名字就可以看出它的功能:
先执行RPOP命令再执行LPUSH 命令。RPOPLPUSH命令会先从source列表类型键的右边弹出一个元素,然后将其加入到destination列表类型键的左边,并返回这个元素的值,整个过程是原子的。
分享到:
相关推荐
redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-...
<!-- ... <groupId>com.orange.redis-embedded</groupId> <artifactId>embedded-redis</artifactId> <version>0.6</version> </dependency>
redis-5.0.14/src/redis-cli --cluster create 192.168.129.98:7000 192.168.129.99:7003 192.168.129.99:7002 192.168.129.126:7005 192.168.129.126:7004 192.168.129.98:7001 --cluster-replicas
$redis->connect($address['ip'], $address['port']); $info = $redis->info(); print_r($info);$sentinel_pool = new \Jenner\RedisSentinel\SentinelPool(); $sentinel_pool->addSentinel('127.0.0.1', ...
tomcat-redis-session-manager-2.0.0.jar jedis-2.5.2.jar commons-pool2-2.2.jar 2.修改 conf 目录下的 context.xml 文件 <Valve className=...
<section name="RedisConfig" type="Redis.Helper.RedisConfigInfo,Redis.Helper"/> </configSections> <!--Redis配置--> <RedisConfig WriteServerList="密码@192.168.1.232:6379" ReadServerList="密码@192....
1: 下载redis-5.0.4.tar.gz 2: 解压源码并进入目录 tar zxvf redis-5.0.4.tar.gz cd redis-5.0.4 3: 不用configure 4: 直接make (如果是32位机器 make 32bit) 查看linux机器是32位还是64位的方法:file /bin/...
Redis在CentOS系统中创建集群可能会用到的安装包, 其中redis-3.0.0.tar是Redis服务, redis-3.0.0.gem是Redis通过ruby创建集群要用到的包
redis++使用说明,windows下编译redis-plus-plus
redis校验工具redis-full-check,配合redis-shake使用!!!
文件夹内包括有Redis-x64-3.0.504.zip、Redis-x64-3.2.100.msi。可供大家下载安装。
Redis-x64-5.0.10.msi
压缩文件包括tomcat-redis-session-manager-master-2.0.0.jar、jedis-2.7.3.jar、commons-pool2-2.3.jar三个jar包使用方法请参照https://github.com/jcoleman/tomcat-redis-session-manager。apache-tomcat-8.5.33....
Redis稳定版 Redis-x64-5.0.14.1.zip
tomcat-redis-session-manager-2.0.0.jar
Redis下载,Redis Server,Redis-x64-5.0.9.zip
jizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-...
Redis 64位window 版 Redis-x64-3.2.100
Redis是一种开源的内存数据结构存储系统,它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。Redis可以用作数据库、缓存和消息中间件。Redis在性能、可扩展性和灵活性方面表现出色,因此被广泛应用于Web...
Tomcat8亲测可用 tomcat-redis-session-manager的jar包 修改了tomcat-redis-session-manager源码进行的编译生成的jar包