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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

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开发运维实践指南》内容,该书作者为黄鹏程,已授权云栖社区转载。
相关文章
|
26天前
|
机器学习/深度学习 运维 监控
别让运维只会“救火”——用数据点燃业务增长的引擎
别让运维只会“救火”——用数据点燃业务增长的引擎
111 12
|
2月前
|
机器学习/深度学习 存储 运维
数据别乱跑!聊聊智能运维如何减少数据丢失风险
数据别乱跑!聊聊智能运维如何减少数据丢失风险
107 4
|
2月前
|
数据采集 运维 数据可视化
AR 运维系统与 MES、EMA、IoT 系统的融合架构与实践
AR运维系统融合IoT、EMA、MES数据,构建“感知-分析-决策-执行”闭环。通过AR终端实现设备数据可视化,实时呈现温度、工单等信息,提升运维效率与生产可靠性。(238字)
|
3月前
|
机器学习/深度学习 运维 监控
运维不怕事多,就怕没数据——用大数据喂饱你的运维策略
运维不怕事多,就怕没数据——用大数据喂饱你的运维策略
135 0
|
3月前
|
存储 运维 安全
运维知识沉淀工具深度解析:从结构设计到落地实践全拆解
运维知识沉淀工具助力团队将零散经验结构化存储,实现问题处理路径标准化、知识复用化。通过标签、模板与自动化调取机制,让每次处理都留下可复用资产,提升团队协同效率与系统稳定性。
|
4月前
|
运维 算法 机器人
阿里云AnalyticDB具身智能方案:破解机器人仿真数据、算力与运维之困
本文将介绍阿里云瑶池旗下的云原生数据仓库AnalyticDB MySQL推出的全托管云上仿真解决方案,方案采用云原生架构,为开发者提供从开发环境、仿真计算到数据管理的全链路支持。
|
4月前
|
SQL 存储 运维
别让运维数据“各过各的”:聊聊数据湖怎么搭,才能不成“沼泽”
别让运维数据“各过各的”:聊聊数据湖怎么搭,才能不成“沼泽”
160 0
|
2月前
|
运维 监控 机器人
别等出事才救火:实时监控数据才是运维的救命稻草
别等出事才救火:实时监控数据才是运维的救命稻草
151 8
|
2月前
|
机器学习/深度学习 人工智能 运维
三重Reward驱动的运维智能体进化:多智能体、上下文工程与强化学习的融合实践
这篇文章系统性地阐述了 AI 原生时代下,面向技术风险领域的智能体系统(DeRisk)的架构设计、核心理念、关键技术演进路径与实践落地案例。
三重Reward驱动的运维智能体进化:多智能体、上下文工程与强化学习的融合实践

热门文章

最新文章