Redis第六弹-List列表-(相当于数组/顺序表)Lpush key element-一次可以插入多个元素(假如key已经存在,并且key对应的value并非是list,则会报错)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis第六弹-List列表-(相当于数组/顺序表)Lpush key element-一次可以插入多个元素(假如key已经存在,并且key对应的value并非是list,则会报错)

List列表-(相当于数组/顺序表)

list内部编码方式,并非是非常简单的数组,而是更接近双端队列,list有序,有序的意思不是大小方面,而是说,假如我们去调换顺序,那么两个list不想等,这也叫有序

这种情况,也出现在我们学数据结构的栈和堆(JVM还是数据结构数组形式,parent=(child-1)/2)

栈是数据结构的栈(先进后出)还是操作系统的栈

List的头和尾都可插入,那么我们可以按照队列或者栈的方式去模拟,比如左边插入,然后左边删除(栈),左边插入,右边删除(队列)

Lpush key element-一次可以插入多个元素(假如key已经存在,并且key对应的value并非是list,则会报错)

这里有个小细节:他的内部是怎么插入的,我十分好奇,因为我没想明白他的下标怎么回事,他是从左边开始读的,lpush也是左边开始插入,1在最左边,然后像是推箱子似的,2把1推进去,3把2推里面,4把3推里面

lrange key start stop -此处是闭区间

同样支持负数,注意哈,你这个左边插入,那么找范围也是从左开始,换句话说只能-2到-1,不能-1 到-2

当出现下标越界的情况,redis将如何处理呢?

我们可以看到,他并不像是C++,java(异常)报错,而是正常返回了,换句话说,他会尽可能获取到给定区间的下标,如果给定区间非法,比如说超出下标,就会获取目前全部内容。

Rpush-将一个元素,从右侧插入到list里面

Lpop-从list左侧弹出元素

Rpop-从list右侧弹出元素

在redis6.2版本,新增了count参数(lpop key4),list双端队列,两头插入/删除都是十分有效的。

Lindex key index-给定下标获取所对应的参数

LInsert key before 3 100->在3这个元素之前,插入100这个元素-返回值,是返回得到的新的list长度

这里万一插入的列表,基准值(3)存在多个怎么办呢?linsert-进行拆入的时候,要根据基准值,找到对应的位置,从左往右找,找到第一个符合基准值的位置即可。

Llen-直接获取列表中元素

Lrem key count element-删除的几个这样的值

返回值,删除了几个数是他的返回值

count>0 从左往右

count<0 从右往左找

count=0 删除所有相同的元素

Ltrlm key start stop-保留start ,stop之间区间内的元素

官网文档上ACL:@write ,@list,@slow(慢)

Lset key index value根据下标修改元素

Blpop和Brpop是lpop和rpop的阻塞版本

阻塞:线程不走,直到满足某些条件,才会唤醒自己,注意,他会有一个超时时间

之前的线程阻塞:

1.线程安全

2.阻塞

        1)队列为空,尝试出队列,就会产生阻塞,队列不空,阻塞解除

        2)队列为满,尝试入队列,也会产生阻塞,队列不满,则阻塞会解除

Redis:

        list也是相当于阻塞队列一样,线程安全通过单线程模型是支持的,阻塞,则支持队列为空的情况,不考虑队列满,list中有元素则正常删除,无元素则会阻塞(可以设置阻塞时间,阻塞版本会跟timeout,阻塞一段时间,起见redis可执行其他的命令)

blpop,brpop会尝试获取多个key的列表的元素,多个客户端同时一个pop,则最开始执行命令的客户端会得到弹出的元素。

一方面告诉我们当前数据来自哪个key,一方面告诉我们获取到的数据是啥?

1.针对非空列表进行操作,2.针对一个空的列表进行操作,3.针对多个key进行操作

list内部编码

旧时代:ziplist-压缩列表,LinkedList-链表

新时代:quicklist(二者结合)-链表的每个节点是一个lindedList链表(压缩列表),每个列表都不让他太大,同时再把多个压缩列表,通过链式结构连起来。

ziplist:把数据按更紧凑的压缩形式,进行表示的,节省空间当元素个数多了,操作效率会下降

List类型应用场景

list作为数组,这样的结构来存储多个元素

mysql:表示学生和班级信息

studentI class Name  
...
...
...

有一个通道,传输短视频,弹幕各走各的,彼此不去相互影响

pipeline(流水线,管道)多个redis命令,但把这些命令合并成一个网络请求进行,通信数量大大降低了彼此交互次数。


相关文章
|
6月前
|
缓存 NoSQL Java
Redis应用—6.热key探测设计与实践
热key问题在高并发系统中可能导致数据层和服务层的严重瓶颈,如Redis集群瘫痪和用户体验下降。为解决此问题,京东开发了JdHotkey热key探测框架,具备实时性、准确性、集群一致性和高性能等特点。该框架由etcd集群、Client端jar包、Worker端集群和Dashboard控制台组成,通过分布式计算快速识别热key并推送至应用内存,有效减轻数据层负载,提升服务性能。JdHotkey适用于多种场景,安装部署简便,支持毫秒级热key探测和集群一致性维护。
315 61
Redis应用—6.热key探测设计与实践
|
3月前
|
NoSQL 测试技术 Redis
Redis批量删除Key的三种方式
Redis批量删除Key是优化数据库性能的重要操作,本文介绍三种高效方法:1) 使用通配符匹配(KEYS/SCAN+DEL),适合不同数据规模;2) Lua脚本实现原子化删除,适用于需要事务保障的场景;3) 管道批量处理提升效率。根据实际需求选择合适方案,注意操作不可逆,建议先备份数据,避免内存溢出或阻塞。
|
6月前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
330 1
Java 中数组Array和列表List的转换
|
8月前
|
NoSQL API Redis
在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描
通过上述步骤,可以在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描。利用LevelDB的迭代器,可以高效地遍历和处理数据库中的大量键值对。该实现方法不仅简单易懂,还具有良好的性能和扩展性,希望能为您的开发工作提供实用的指导和帮助。
115 7
|
10月前
|
消息中间件 缓存 NoSQL
Redis 高并发竞争 key ,如何解决这个难点?
本文主要探讨 Redis 在高并发场景下的并发竞争 Key 问题,以及较为常用的两种解决方案(分布式锁+时间戳、利用消息队列)。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Redis 高并发竞争 key ,如何解决这个难点?
|
10月前
|
存储 监控 NoSQL
Redis大Key问题如何排查?如何解决?
Redis大Key问题如何排查?如何解决?
437 0
Redis大Key问题如何排查?如何解决?
|
10月前
|
存储 NoSQL 算法
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?
|
10月前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
11月前
|
NoSQL 关系型数据库 MySQL
Redis 列表(List)
10月更文挑战第16天
117 2
|
11月前
|
NoSQL Unix Redis
Redis 键(key)
10月更文挑战第15天
118 1