总目录:https://blog.csdn.net/qq_41106844/article/details/105553392
数据库子目录:https://blog.csdn.net/qq_41106844/article/details/105553331
list
string类型适合存储整体有关联的数据,hash类型适合存用来交互的数据,所有存储量就受到了限制。那么有没有一种类型可以存储大量的数据的同时也很灵活呢,这就是list类型。
list类型
- 数据存储需求:存储多个数据,并对数据进入空间的顺序进行区分
- 需要的存储结构:一个存储空间,保存多个数据。且通过数据可以体现进入顺序
- list类型:保存多个数据,底层通过双向链表实现。
基础操作
-添加/修改数据
因为list类型是双向链表实现的,所以就有了左侧写入和右侧写入的区别。
lpush key value1 value2...
rpush key value1 value2...
![20155953-3652e4b086548db8.png](https://i-blog.csdnimg.cn/blog_migrate/1e92cf122910ff624a733f4e30a40379.png)
- 获取数据
同样,redis的list和大部分编程语言的list一样,也是有索引的。
lrange key start top
lindex key index
llen key
![20155953-4af9f81f613ee894.png](https://i-blog.csdnimg.cn/blog_migrate/bac1888eea1c53db4f58fe96fea02029.png)
这样就能看出,左侧插入与右侧插入的不同了,左侧插入取出后的顺序会颠倒。
![20155953-9d529717930a161d.png](https://i-blog.csdnimg.cn/blog_migrate/fcb2585ce281a73b22c97d4ee3116061.png)
-删除数据(有返回值)
lpop key
rpop key
![20155953-f19b804edc8fcc51.png](https://i-blog.csdnimg.cn/blog_migrate/13de764dd84edb8cfd04e1c15210f33f.png)
删除操作会删除链表中最后一个数据。
扩展操作
- 规定时间内获取并移除数据
blpop key1 [ksy2] timeout
brpop key1 [key2] timeout
我们先pop一个不存在的value,过了我们设置的5s后,报错,中止操作。
然后我们再pop一下,但是给他设置一个稍微长一些的时间,然后再另一个命令行内push进去一个值,这样本来的命令行就会取到value,返回取到的值并删除。
![20155953-ffd56f4198663910.png](https://i-blog.csdnimg.cn/blog_migrate/79fdfc890c20b71e06fdd484aec9d128.png)
- 移除指定数量的指定数据
lrem key count value
![20155953-6dca6ae7193c435a.png](https://i-blog.csdnimg.cn/blog_migrate/f3b44fb1cd5bd6e4011418905e6729eb.png)
![20155953-5bc4aef1f06817ca.png](https://i-blog.csdnimg.cn/blog_migrate/0a4ba086865a521a786abd66b962a850.png)
注意事项
- list保存的数据类型都是string数据类型,容量最大是232-1
- list具有索引的概念,但是操作时是以队列的形式进行出队入队。
- list可以对数据进行分页操作,通常第一页数据以list形式展开,以后以数据库形式展开。
应用场景1
日志消息队列
公司内会有很多集群,每时每刻在产生格式不同的各类日志,但是突然集群宕机了,运维就需要去阅读日志,找出错误。
一般情况下日志都在各自集群内保存着,但是这样的话阅读起来阻碍很多,所以就需要一个统一的东西来保存所有的日志。
解决方案
- 依赖list的顺序特征
- 使用队列模式解决多路信息汇总合并的问题
- 使用栈模型结局最新消息的问题