【Redis实战】列表类型(List)

简介: Redis的列表类型(List)

1、向列表两端增加元素(LPUSH和RPUSH)

  LPUSH命令用来向列表左边增加元素,返回值表示增加元素后列表的长度。
  RPUSH命令用来向列表后边增加元素,返回值表示增加元素后列表的长度。

127.0.0.1:6379> LPUSH numbers 1
(integer) 1
127.0.0.1:6379> LPUSH numbers 2 3
(integer) 3
127.0.0.1:6379> RPUSH numbers 0 -1
(integer) 5

2、从列表两端弹出元素(LPOP和RPOP)

  LPOP命令可以从列表左边弹出一个元素,返回被移除的元素值。
  RPOP命令可以从列表右边弹出一个元素,返回被移除的元素值。

127.0.0.1:6379> LPOP numbers
"3"
127.0.0.1:6379> RPOP numbers
"-1"

3、获取列表中元素的个数(LLEN)

  当键不存在时,LLEN会返回0。

127.0.0.1:6379> LLEN numbers
(integer) 3

4、获取列表片段(LRANGE)

  LRANGE命令将返回索引从start到stop之间所有的元素(包含两端的元素)。

127.0.0.1:6379> LRANGE numbers 0 2
1) "2"
2) "1"
3) "0"

  LRANGE命令也支持负索引,表示从右边开始计算序数。

127.0.0.1:6379> LRANGE numbers -2 -1
1) "1"
2) "0"

  LRANGE numbers 0 -1可以获取列表中的所有元素。另外,如果start的索引位置比stop的索引位置靠后,则会返回空列表;如果stop大于实际的索引范围,则会返回到列表最后边的元素。

127.0.0.1:6379> LRANGE numbers 1 999
1) "1"
2) "0"

5、删除列表中指定的值(LREM)

  LREM命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数。根据count值的不同,LREM命令的执行方式会略有差异。
  1、当count>0时,LREM命令会从列表左边开始删除前count个值为value的元素。
  2、当count<0时,LREM命令会删除所有值为value的元素。
  3、当count=0时,LREM命令会删除所有值为value的元素。

127.0.0.1:6379> RPUSH numbers 2
(integer) 4
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "2"
127.0.0.1:6379> LREM numbers -1 2
(integer) 1
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"

6、获得/设置指定索引的元素值(LINDEX)

  LINDEX命令用来返回指定索引的元素,索引从0开始;如果index是负数则表示从右边开始计算的索引,最后边元素的索引是-1。

127.0.0.1:6379> LINDEX numbers 0
"2"
127.0.0.1:6379> LINDEX numbers -1
"0"

  LSET是另一个通过索引操作列表的命令,它会将索引为index的元素赋值为value。

127.0.0.1:6379> LSET numbers 1 7
OK
127.0.0.1:6379> LINDEX numbers 1
"7"

7、只保留列表指定片段(LTRIM)

  LTRIM命令可以删除指定索引范围之外的所有元素,其指定列表范围的方法和LRANGE命令相同。

127.0.0.1:6379> LRANGE numbers 0 -1
1)"1"
2) "2"
3) "7"
4) "3"
127.0.0.1:6379> LTRIM numbers 1 2
OK
127.0.0.1:6379> LRANGE numbers 0 1
1) "2"
2) "7"

  LTRIM命令常和LPUSH命令一起使用来限制列表中元素的数量,比如记录日志时我们希望只保留最近的100条日志,则每次加入新元素时调用一次LTRIM命令即可。

LPUSH logs $newLog
LTRIM logs 0 99

8、向列表中插入元素(LINSERT)

  LINSERT命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
  LINSERT命令的返回值是插入后列表的元素个数。

127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "7"
3) "0"
127.0.0.1:6379> LINSERT numbers AFTER 7 3
(integer) 4
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "7"
3) "3"
4) "0"
127.0.0.1:6379> LINSERT numbers BEFORE 2 1
(integer) 5
127.0.0.1:6379> LRANGE numbers 0 -1
1) "1"
2) "2"
3) "7"
4) "3"
5) "0"

9、将元素从一个列表转到另一个列表(RPOPLPUSH)

  RPOPLPUSH是个很有意思的命令,从名字就可以看出它的功能:先执行RPOP命令再执行LPUSH命令。RPOPLPUSH命令先会从source列表类型键的右边弹出一个元素,然后将其加入到destination列表类型键的左边,并返回这个元素的值,整个过程是原子的。其具体实现可以表示为伪代码:

def rpoplpush ($source,$destination)
    $value=RPOP $resource
    LPUSH $destination,$value
    return $value

  当把列表类型作为队列使用时,RPOPLPUSH命令可以很直观地在多个队列中传递数据。当source和destination相同时,RPOPLPUSH命令会不断地将队尾的元素移动队首,借助这个特征我们可以实现一个网站监控系统:使用一个队列存储需要监控的网址,然后监控程序不断地使用RPOPLPUSH命令循环取出一个网址来测试可用性。这里使用RPOPLPUSH命令的好处在于程序执行过程中依然可以不断地向网址列表中加入新网址,而且整个系统容易扩展,允许多个客户端同事处理队列。

相关文章
|
4月前
|
存储 NoSQL 前端开发
Redis专题-实战篇一-基于Session和Redis实现登录业务
本项目基于SpringBoot实现黑马点评系统,涵盖Session与Redis两种登录方案。通过验证码登录、用户信息存储、拦截器校验等流程,解决集群环境下Session不共享问题,采用Redis替代Session实现数据共享与自动续期,提升系统可扩展性与安全性。
302 3
Redis专题-实战篇一-基于Session和Redis实现登录业务
|
4月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
246 1
Redis专题-实战篇二-商户查询缓存
|
10月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
1083 0
分布式爬虫框架Scrapy-Redis实战指南
|
4月前
|
存储 消息中间件 NoSQL
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
本文将系统探讨 Redis List 的核心特性、完整命令体系、底层存储实现以及典型实践场景,为读者构建从理论到应用的完整认知框架,助力开发者在实际业务中高效运用这一数据结构解决问题。
|
7月前
|
缓存 监控 NoSQL
Redis 实操要点:Java 最新技术栈的实战解析
本文介绍了基于Spring Boot 3、Redis 7和Lettuce客户端的Redis高级应用实践。内容包括:1)现代Java项目集成Redis的配置方法;2)使用Redisson实现分布式可重入锁与公平锁;3)缓存模式解决方案,包括布隆过滤器防穿透和随机过期时间防雪崩;4)Redis数据结构的高级应用,如HyperLogLog统计UV和GeoHash处理地理位置。文章提供了详细的代码示例,涵盖Redis在分布式系统中的核心应用场景,特别适合需要处理高并发、分布式锁等问题的开发场景。
503 41
|
7月前
|
机器学习/深度学习 存储 NoSQL
基于 Flink + Redis 的实时特征工程实战:电商场景动态分桶计数实现
本文介绍了基于 Flink 与 Redis 构建的电商场景下实时特征工程解决方案,重点实现动态分桶计数等复杂特征计算。通过流处理引擎 Flink 实时加工用户行为数据,结合 Redis 高性能存储,满足推荐系统毫秒级特征更新需求。技术架构涵盖状态管理、窗口计算、Redis 数据模型设计及特征服务集成,有效提升模型预测效果与系统吞吐能力。
834 10
|
10月前
|
缓存 NoSQL Java
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
954 79
|
7月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
2134 7
|
10月前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
785 1
Java 中数组Array和列表List的转换
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
406 14