Redis开发运维实践数据操作之列表操作

2.3.1 添加元素

lpush key string

在key对应list的头部添加字符串元素,返回1表示成功,0表示key存在且不是list类型。注意:江湖规矩一般从左端Push,右端Pop,即LPush/RPop。


lpushx

也是将一个或者多个value插入到key列表的表头,但是如果key不存在,那么就什么都不在,返回一个false【rpushx也是同样】


rpush key string

同上,在尾部添加


linsert

在key对应list的特定位置之前或之后添加字符串元素 , 例如


2.3.2 查看列表长度


llen key



返回key对应list的长度,key不存在返回0,如果key对应类型不是list返回错误






2.3.3 查看元素


lindex



返回名称为key的list中index位置的元素,例如:



2.3.4 查看一段列表


lrange key start end



返回指定区间内的元素,下标从0开始,负值表示从后面计算,-1表示倒数第一个元素 ,key不存在返回空列表。特殊的,


lrange key 0 -1



返回所有数据。






2.3.5 截取list


ltrim key start end



保留指定区间内元素,成功返回1,key不存在返回错误。O(N)操作。





注意:N是被移除的元素的个数,不是列表长度。






2.3.6 删除元素


lrem key count value



从key对应list中删除count个和value相同的元素。count为0时候删除全部,count为正,则删除匹配count个元素,如果为负数,则是从右侧扫描删除匹配count个元素。复杂度是O(N),N是List长度,因为List的值不唯一,所以要遍历全部元素,而Set只要O(log(N))。


lpop key



从list的头部删除元素,并返回删除元素。如果key对应list不存在或者是空返回nil,如果key对应值不是list返回错误。


rpop



同上,但是从尾部删除。






2.3.7 设置list中指定下标的元素值


lset key index value



成功返回1,key或者下标不存在返回错误






2.3.8 阻塞队列


blpop key1...keyN timeout



从左到右扫描返回对第一个非空list进行lpop操作并返回,比如blpop list1 list2 list3 0 ,如果list不存在list2,list3都是非空则对list2做lpop并返回从list2中删除的元素。如果所有的list都是空或不存在,则会阻塞timeout秒,timeout为0表示一直阻塞。当阻塞时,如果有client对key1...keyN中的任意key进行push操作,则第一在这个key上被阻塞的client会立即返回(返回键和值)。如果超时发生,则返回nil。有点像unix的select或者poll。


brpop



同blpop,一个是从头部删除一个是从尾部删除。





注意:不要采用其作为ajax的服务端推送,因为连接有限,遇到问题连接直接打满。




BLPOP/BRPOP 的先到先服务原则 如果有多个客户端同时因为某个列表而被阻塞,那么当有新值被推入到这个列表时,服务器会按照先到先服务(first in first service)原则,优先向最早被阻塞的客户端返回新值。举个例子,假设列表 lst 为空,那么当客户端 X 执行命令 BLPOP lst timeout 时,客户端 X 将被阻塞。在此之后,客户端 Y 也执行命令 BLPOP lst timeout ,也因此被阻塞。如果这时,客户端 Z 执行命令 RPUSH lst "hello" ,将值 "hello" 推入列表 lst ,那么这个 "hello" 将被返回给客户端 X ,而不是客户端 Y ,因为客户端 X 的被阻塞时间要早于客户端 Y 的被阻塞时间。



rpoplpush/brpoplpush:rpoplpush srckey destkey 从srckey对应list的尾部移除元素并添加到destkey对应list的头部,最后返回被移除的元素值,整个操作是原子的.如果srckey是空或者不存在返回nil,注意这是唯一一个操作两个列表的操作,用于两个队列交换消息。





+







应用场景:task + bak 双链表完成工作任务转交的安全队列,保证原子性。 业务逻辑: 1: Rpoplpush task bak 2: 接收返回值,并做业务处理 3: 完成时用LREM消掉。如不成功或者如果集群管理(如zookeeper)发现worker已经挂掉,下次从bak表里取任务



另一个应用场景是循环链表: 127.0.0.1:6379> lrange list 0 -1 1) "c" 2) "b" 3) "a" 127.0.0.1:6379> rpoplpush list list "a" 127.0.0.1:6379> lrange list 0 -1 1) "a" 2) "c" 3) "b"



文为《Redis开发运维实践指南》内容,该书作者为黄鹏程,已授权转载。

时间: 2024-09-03 18:54:43

Redis开发运维实践数据操作之列表操作的相关文章

Redis开发运维实践数据操作之集合操作

2.4.1 添加元素 sadd key member 成功返回1,如果元素以及在集合中返回0,key对应的set不存在返回错误 2.4.2 移除元素 srem key member 成功返回1,如果member在集合中不存在或者key不存在返回0,如果key对应的不是set类型的值返回错误 2.4.3 删除并返回元素 spop key 如果set是空或者key不存在返回nil 2.4.4 随机返回一个元素 srandmember key 同spop,随机取set中的一个元素,但是不删除元素 2.

Redis开发运维实践数据操作之字符串操作

2.2.1 设置key对应的值为string类型的value set key value [ex 秒数] / [px 毫秒数] [nx] /[xx] 返回1表示成功,0失败注: 如果ex,px同时写,以后面的有效期为准setnx key value仅当key不存在时才Set,如果key已经存在,返回0 .nx 是not exist的意思.应用场景:用来选举Master或做分布式锁:所有Client不断尝试使用SetNx master myName抢注Master,成功的那位不断使用Expire刷

Redis开发运维实践数据操作之哈希操作

2.6.1 设置hash值 hset key field value 设置hash field为指定值,如果key不存在,则先创建. hsetnx 设置hash field为指定值,如果 key 不存在,则先创建.如果 field已经存在,返回0,nx是not exist的意思. 2.6.2 获取hash值 hget key field 获取指定的hash field hmget key filed1....fieldN 获取全部指定的hash filed hmset key filed1 va

Redis开发运维实践数据迁移之将key从当前数据库移动到指定数据库

4.1 将key从当前数据库移动到指定数据库 返回1成功.0 如果key不存在,或者已经在指定数据库中 Redis开发运维实践指南 本文为<Redis开发运维实践指南>内容,该书作者为黄鹏程,已授权转载.

Redis开发运维实践数据操作有序集合操作

2.5.1 添加元素 zadd key score member 添加元素到集合,元素在集合中存在则更新对应score. 2.5.2 删除元素 zrem key member 1表示成功,如果元素不存在返回0 zremrangebyrank key min max 删除集合中排名在给定区间的元素 zremrangebyscore key min max 删除集合中score在给定区间的元素 2.5.3 增加score zincrby key incr member 增加对应member的scor

Redis开发运维实践数据操作之HyperLogLog操作

2.7.1 将元素添加至 HyperLogLog PFADD key element [element ...] 这个命令可能会对 HyperLogLog 进行修改,以便反映新的基数估算值,如果 HyperLogLog 的基数估算值在命令执行之后出现了变化, 那么命令返回 1 , 否则返回 0 . 命令的复杂度为 O(N) ,N 为被添加元素的数量. 2.7.2 返回给定 HyperLogLog 的基数估算值 PFCOUNT key [key ...] 当只给定一个 HyperLogLog 时,

Redis开发运维实践指南数据操作之key操作

数据操作 熟悉每个数据操作前一定要明白每个操作都是代价,以时间复杂度和对应查询集或者结果集大小为衡量.时间复杂度收敛状况如下: 2.1.1 列出key keys *user* keys * 有3个通配符 *, ? ,[] *: 通配任意多个字符 ?: 通配单个字符 []: 通配括号内的某1个字符 注:生产已经禁止.更安全的做法是采用scan,原理和操作如下: 针对Keys的改进,支持分页查询Key.在迭代过程中,Keys有增删时不会要锁定写操作,数据集完整度不做任何保证,同一条key可能会被返回

Redis开发运维实践常见运维操作(一)

3.1 启动 3.1.1 启动redis 常见选项: ./redis-server (run the server with default conf) ./redis-server /etc/redis/6379.conf ./redis-server --port 7777 ./redis-server --port 7777 --slaveof 127.0.0.1 8888 ./redis-server /etc/myredis.conf --loglevel verbose 3.1.2

Redis开发运维实践开发设计规范之数据异常处理

4.3 数据异常处理 程序应该处理如果redis数据丢失时的清理redis内存和重新加载的过程. Redis开发运维实践指南