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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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开发运维实践指南》内容,该书作者为黄鹏程,已授权云栖社区转载。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
10天前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
38 11
|
2月前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
92 8
|
2月前
|
缓存 NoSQL Redis
Redis 缓存使用的实践
《Redis缓存最佳实践指南》涵盖缓存更新策略、缓存击穿防护、大key处理和性能优化。包括Cache Aside Pattern、Write Through、分布式锁、大key拆分和批量操作等技术,帮助你在项目中高效使用Redis缓存。
480 22
|
2月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
67 2
|
3月前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万级数据统计优化实践
【10月更文挑战第21天】 在处理大规模数据集时,传统的单体数据库解决方案往往力不从心。MySQL和Redis的组合提供了一种高效的解决方案,通过将数据库操作与高速缓存相结合,可以显著提升数据处理的性能。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
174 9
|
3月前
|
NoSQL 关系型数据库 MySQL
Redis 列表(List)
10月更文挑战第16天
54 2
|
3月前
|
运维 Java Linux
【运维基础知识】掌握VI编辑器:提升你的Java开发效率
本文详细介绍了VI编辑器的常用命令,包括模式切换、文本编辑、搜索替换及退出操作,帮助Java开发者提高在Linux环境下的编码效率。掌握这些命令,将使你在开发过程中更加得心应手。
49 2
|
2月前
|
存储 NoSQL Java
Redis命令:列表模糊删除详解
通过本文的介绍,我们详细探讨了如何在Redis中实现列表的模糊删除。虽然Redis没有直接提供模糊删除命令,但可以通过组合使用 `LRANGE`和 `LREM`命令,并在客户端代码中进行模糊匹配,来实现这一功能。希望本文能帮助你在实际应用中更有效地操作Redis列表。
136 0
|
2月前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
3月前
|
存储 运维 监控
实时计算Flink版在稳定性、性能、开发运维、安全能力等等跟其他引擎及自建Flink集群比较。
实时计算Flink版在稳定性、性能、开发运维和安全能力等方面表现出色。其自研的高性能状态存储引擎GeminiStateBackend显著提升了作业稳定性,状态管理优化使性能提升40%以上。核心性能较开源Flink提升2-3倍,资源利用率提高100%。提供一站式开发管理、自动化运维和丰富的监控告警功能,支持多语言开发和智能调优。安全方面,具备访问控制、高可用保障和全链路容错能力,确保企业级应用的安全与稳定。
65 0