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

本文涉及的产品
云数据库 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命令,但把这些命令合并成一个网络请求进行,通信数量大大降低了彼此交互次数。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1天前
|
NoSQL Java 应用服务中间件
蓝易云 - Spring redis使用报错Read timed out排查解决
以上都是可能的解决方案,具体的解决方案可能会因具体情况而异。
7 2
|
2天前
|
NoSQL Redis
蓝易云 - redis报错WRONGTYPE Operation against a key holding the wrong kind of value
解决这个问题的方法是检查你的代码,确保你对每个键使用的命令与该键的类型匹配。你可以使用 `TYPE`命令来确定一个键的类型。例如,`TYPE mykey`将返回 `mykey`的类型。
10 3
|
10天前
|
NoSQL Redis 存储
Redis大key问题 - 优化、清理
【6月更文挑战第14天】Redis内置命令如STRLEN、LLEN等用于检测不同类型Key的大小。避免使用DEBUG OBJECT和MEMORY USAGE因高资源消耗。大Key优化包括业务设计避免大Key、数据拆分、更换存储方案、数据压缩和合理清理。清理大Key应选低峰期或分批异步进行,以减少阻塞。使用如HSCAN、SREM等命令避免一次性操作大量数据。
14 1
|
6天前
|
存储 缓存 运维
Redis的热Key问题
【6月更文挑战第18天】Redis中的热Key是高访问频率的Key,如QPS高、大带宽使用或CPU密集型操作。热Key可能导致CPU占用过高、访问倾斜、缓存击穿和系统性能下降。爆款商品、热点事件等可引发热Key。检测热Key可借助云服务、`redis-cli hotkeys`、业务层监控或`MONITOR`命令。优化策略包括复制热Key到多分片、采用读写分离,但需权衡代码复杂性和数据一致性。
16 0
|
6天前
|
存储 NoSQL Redis
redis大key对持久化的影响
redis大key对持久化的影响
13 0
|
1月前
|
NoSQL Linux Redis
Redis -- 安装客户端redis-plus-plus
Redis -- 安装客户端redis-plus-plus
57 0
|
7天前
|
NoSQL Redis Windows
win10下Redis安装、启动教程
win10下Redis安装、启动教程
17 2
|
9天前
|
消息中间件 缓存 NoSQL
Redis单实例安装
Redis单实例安装
17 1
|
11天前
|
NoSQL Linux 网络安全
基于 centOS7 的 redis 安装
基于 centOS7 的 redis 安装
47 1