万万哇 发表于 2025-3-29 13:35:28

Redis的List范例

一.List范例

简单介绍

列表的List相称于数组大概次序表。
列表两端插入和弹出操作:
https://i-blog.csdnimg.cn/direct/944907f1e9394a9398dfc519e5a18c84.png
列表的获取、删除操作:
https://i-blog.csdnimg.cn/direct/b5fe20b47e254b33b7c66ea4c9b7477f.png
二.List的常用命令

1.LPUSH

   按照次序进行依次进行头插元素
https://i-blog.csdnimg.cn/direct/018f0d4e686b46cd8762075e502f07b7.png
演示:
https://i-blog.csdnimg.cn/direct/e3e0739f16164eb78a4a2fa25c7172b4.png
2.LRANGE

   查看LIst中指定范围的元素
https://i-blog.csdnimg.cn/direct/41178b6581e6403d94e6ff1c46c24df0.png
https://i-blog.csdnimg.cn/direct/64652237820b498a9992ee64d0ef48b3.png
演示:
   此处的序号和下标无关,这个序号是专门给结果集使用的序号。在hash操作也大概会得到这种带有序号的结果,这种序号仅仅是标识返回元素的次序也和下标无关,hash范例无下标的概念。
https://i-blog.csdnimg.cn/direct/ddf5320c31f7459880090581d9b31aa1.png
注意:
   在Redis当中,没有采取当下标越界时,就返回一个非常的计谋,而是尽大概的获取给定区间的元素,如果给定区间非法,好比超出下标就会尽大概获取对应的内容:
https://i-blog.csdnimg.cn/direct/a6a1fae5a0c6458191d2b425644ab5bb.png
   当如果两个下标都越界了,此时就获取不到元素:
https://i-blog.csdnimg.cn/direct/63475f86d9a54440a973d812e9e89335.png
3.LPUSHX

   LPUSHX和LPUSH不同的是,LPUSHX只能在key存在的链表上进行头插,而不能在不存在的Key上进行头插
https://i-blog.csdnimg.cn/direct/3b833f9c2951417180b8b43c870d1601.png
演示:
https://i-blog.csdnimg.cn/direct/8bc0ffdfad7f48fca1ba31f371518896.png
4.RPUSH

   和LPUSH用法相同,只不外是尾插
https://i-blog.csdnimg.cn/direct/52d4aaab10ac429e93f53e9c57b127d5.png
演示:
https://i-blog.csdnimg.cn/direct/e40df736bad54aa7a8054674801a23ea.png
5.RPUSHX

   和LPUSHX结果雷同,只能在已存在的key上进行操作。
https://i-blog.csdnimg.cn/direct/44eaa26b2af04b75b8642efe62ec239a.png
演示:
https://i-blog.csdnimg.cn/direct/7ef699cf26d54b328bd02372f2122e12.png
6.LPOP

   头删
https://i-blog.csdnimg.cn/direct/17777cf764e84cb988ad9882ffe2a5d4.png
演示:
https://i-blog.csdnimg.cn/direct/cdca863cd3fa4a5b984c1537ece6857f.png
7.RPOP

   尾删
https://i-blog.csdnimg.cn/direct/b88b5ff4932749b1917adaf4ad4b6bac.png
演示:
必要注意的是此处的redis版本比较低,所以在RPOP命令中的count没办法使用,这个是后续版本出来的新功能,这里的redis版本较低不支持。
https://i-blog.csdnimg.cn/direct/c071bfcf1e35424ba623d646abd988f5.png
8.LINDEX

   获取从左边第index位置的元素
https://i-blog.csdnimg.cn/direct/30a5fb50acf74f8395f91f152f3dc1f2.png
演示:https://i-blog.csdnimg.cn/direct/576ffe1c0ca14291bc3e87633f0fadf2.png
9.LINSERT

   在特定位置插入元素
https://i-blog.csdnimg.cn/direct/2ea035070682484e93a8752fc0e63912.png
演示:
https://i-blog.csdnimg.cn/direct/b8b59a8029b440e9b24c47a240c78023.png
注意:
   LINSERT是找到一个基准值后,在它之前大概之后进行插入,如果此时有列表中有两个值都符合LINSERT中的基准值,此时会在列表中开始从左往右进行查找,开始查找到的就作为基准值。
https://i-blog.csdnimg.cn/direct/919979aeaedb4e7a8deb594f4c9c2077.png
10.LLEN

   查询列表key的长度
https://i-blog.csdnimg.cn/direct/251daa53347b4e99a60d235526301435.png
演示:
https://i-blog.csdnimg.cn/direct/8037bf7ab48a474a822b7395fb79dd07.png
11.LREM

   LREM => List Remove 删除,count表现要删除的个数,element表现要删除的值


[*]count > 0,列表从左往右删除count个符合element的元素
[*]count < 0,列表从右往左删除 |count|个 符合element的元素
[*]count = 0,删除列表中全部符合element的元素
https://i-blog.csdnimg.cn/direct/a0ae2f17ad1e48948e2dbd57191beddf.png
演示:


[*]count > 0:
https://i-blog.csdnimg.cn/direct/622de32c57694a57941e50a16a5001f9.png


[*] count < 0:
https://i-blog.csdnimg.cn/direct/daa5a06cbc8344ae846d75a589dfb929.png
[*] count = 0:
https://i-blog.csdnimg.cn/direct/72c6b5d690de4bffa1c1d391f68c5e35.png
12.LTRIM

   删除指定下标范围外的所有元素
https://i-blog.csdnimg.cn/direct/a42c25e3dec04d20a0798bee0929c6c2.png
https://i-blog.csdnimg.cn/direct/efb2ead2390247b7b16eec851f2dccea.png
演示:
https://i-blog.csdnimg.cn/direct/f339f472f93f47749835e3d31085c8e9.png
13.LSET

   根据下标修改元素
https://i-blog.csdnimg.cn/direct/52f081e880394f40ac50b2fa268a87f8.png
演示:
https://i-blog.csdnimg.cn/direct/9e0f676b24d4419c832d565f3b04d910.png
注意:
lindex可以很好的处理下标越界的情况,直接返回nil,对于lset来说会直接报错。
https://i-blog.csdnimg.cn/direct/5baf2585b38a4c738707cb76980ac42d.png
三.阻塞命令

BRPOP和BLPOP阻塞版本的命令,对应的就是LPOP和RPOP这两个不是阻塞版本的命令。
如果list中存在元素,BLPOP和BRPOP 就和 LPOP and RPOP的功能相同。
如果list中不存在元素,BLPOP和BRPOP 就会产生阻塞,一直阻塞到list插入元素为止。
但是阻塞版本的命令会根据timeout阻塞一段时间,因为BLPOP和BRPOP可以设置阻塞时间,而且,期间redis可以实行其他命令。
此处的BLPOP和BRPOP看起来好像会因为阻塞的问题斲丧很多时间,但是现实上并不会对redis服务器产生负面影响。
在使用BLPOP和BRPOP的命令中如果设置了多个key,那么会从左往右进行遍历key,一旦有一个key对应的列表中可以弹出元素,命令立即返回。
Redis新版的等待时间支持小数,旧版本不支持小数。
1.BRPOP

   阻塞命令的尾删
https://i-blog.csdnimg.cn/direct/4a5da44760994ecda425b6d96f0b3c83.png
演示:
(i)针对不是空的列表进行操作:

https://i-blog.csdnimg.cn/direct/2c757b5316f54090be502b07924f37da.png
(ii)针对空列表进行操作:

https://i-blog.csdnimg.cn/direct/fd9cd050b2904f1ca9e415245415770a.png
(iii)针对空列表使用阻塞命令:

针对空列表使用阻塞命令时,使用另一个reids客户端进行插入数据则可以将实行BRPOP的客户端的阻塞给结束。
此时还没有在另一个reids客户端进行插入数据操作,此时第一个redis客户端使用了BRPOP则处于阻塞状态。
https://i-blog.csdnimg.cn/direct/3448d64604404226b3884f7d3870c9d4.png
当第二个redis客户端将数据插入时,第一个redis客户端此时的阻塞就结束了。
https://i-blog.csdnimg.cn/direct/455ec94b9b874c3c9719cd5fe6c71e35.png
(iv)针对多个key进行操作

https://i-blog.csdnimg.cn/direct/593e2a108aa0499f88b52935b7252864.png
2.BLPOP

   阻塞命令的头删
https://i-blog.csdnimg.cn/direct/0282bf619dfa44c69edd482bf6d8e91a.png
https://i-blog.csdnimg.cn/direct/3f32d17bc42645fa9b35d544d75bdf80.png
https://i-blog.csdnimg.cn/direct/4ddc80c2c3e84dc9b058bfcbc2af31a2.png
https://i-blog.csdnimg.cn/direct/d111e33dbcaf4a68a0e94e00965345b8.png
https://i-blog.csdnimg.cn/direct/cd2a5270180841219c45556bfc10e192.png
演示:
和BRPOP用法相同就不再重复。
四.List的内部编码

现在List的内部编码不再是之前的老版本的ziplist和Linkedlist了,现在最新的版本是使用的quicklist,quicklist是基于ziplist和Linkedlist的结合体。
https://i-blog.csdnimg.cn/direct/757930b3711f48e2a500faaed2b0d1d1.png
五.List的应用场景

1.List作为数组来存储多个元素

在MySQL中表现学生和班级信息是通过两张表进行的:
https://i-blog.csdnimg.cn/direct/9dd3b0226b6e478e8a0d06ad6343cfa8.png#pic_center
如果此时必要查询制定班级中有哪些同砚,那么在redis中就可以通过图中的方式进行筹划:https://i-blog.csdnimg.cn/direct/35aa1a1baa974243a9eda08c34c4303b.png
存储班级和学生的信息的那张表格中,是通过hash范例进行存储的,下面的表格则是通过列表来进行生存classId = 1时,有哪些学生是这个班级的。
此时这个情势是列表,列表雷同于数组来存储学生的id,如果不使用第一个表格的hash范例来存储学生和班级的信息的话,也可以使用JSON的方式放在列表当中,就可以不必要在通过hash范例的表格来进行存储。
2.作为消息队列

只有一个斲丧者能够抢到元素,抢到元素是通过谁先实行brpop的次序来排序的,所以谁先实行brpop命令,谁开始抢到元素。
假设现在斲丧者的次序是1,2,3 生产者进行 lpush 时,斲丧者1就会开始抢到元素,此时斲丧者1拿到元素之后,如果还想继续抢元素,就必须重新实行brpop的命令。
当斲丧者1重新实行brpop后,此时的斲丧者次序就变成了2,3,1了,此时生产者再来一个元素,斲丧者2就能够抢到元素,此时如果你斲丧者2又想抢到元素,也必要重新实行brpop命令。
此时的斲丧者的次序就是3,2,1了,之后就是以此类推。
https://i-blog.csdnimg.cn/direct/5f5abe01af644c808e6a55ef4e871912.png
3.多频道消息队列

多个频道/列表的使用在日常中是非经常见的,好比说现在大家每天都在刷的短视频,就是基于这种消息队列进行实现的一些功能。
好比说,使用一个通道来进行传输短视频的数据,还可以使用一个通道来传输弹幕,还可以使用一个频道来传输点赞,转发,收藏的数据……
https://i-blog.csdnimg.cn/direct/3d1f97314de54bceabbe5fd86f060a32.png
4.微博Timeline

1)每篇微博使用hash来进行存储,比方微博的3个属性:title、timestamp、content:
https://i-blog.csdnimg.cn/direct/dc7e3f0c94a3405aba7013bd414fa209.png
2)向用户Timeline添加微博,user::mblogs作为微博的键:https://i-blog.csdnimg.cn/direct/0ceb0cc8fb5548a1aea221be909177fb.png
3)分页获取用户的Timeline,比方获取用户1的前10篇微博:
https://i-blog.csdnimg.cn/direct/3638dd9201f74f7faec09f230b8faa3c.png
情况1:
在第三步进行分页获取用户的微博时,多次使用hgetall操作,大概会导致循环次数比较多,因为不确定一页中的数据是多少,所以就会触发很多次hgetall,就会有很多的网络请求。
此时可以通过pipeline流水线(管道)的方式来进行解决这种很多的网络请求,因为此时有很多个redis命令,所以可以通过pipeline来把这些redis命令合并成一个网络请求进行通信,大大降低了客户端和服务器之间的交互次数。
情况2:
分裂文章时,使用lrange在列表的两端表现会比较好,但是如果获取列表的中心元素就会表现比较差,此时可以考虑将列表进行划分。
假设某个用户发了1w个微博,此时list的长度就是1w,就可以把这个1w个微博进行拆成10份,每个就是1k个微博。
5.栈和队列的命令组合

https://i-blog.csdnimg.cn/direct/1450c25cbc9d47e3a605ef259be3408f.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Redis的List范例