关于线性表、顺序表、链表、双向链表这几种数据结构的温习:

关于双向链表,即每个人记住自己前后的两个人是谁,来个示意图:

存储多个数据,并对数据进入存储空间的顺序进行区分,底层使用了双向链表进行存储。(value是一个list)

经典特点:
- 添加/修改数据
lpush key value1 value2 …
rpush key value1 value2 …
- 获取数据
lrange key start stop --获取指定范围
lindex key index --获取指定索引
llen key --获取key对应的value链表的长度
- 获取并移除一个数据
lpop key
rpop key
举例:
***注意左push和有push的效果
127.0.0.1:6379> lpush list01 1 2 3
(integer) 3
127.0.0.1:6379> lrange list01 0 2
1) "3"
2) "2"
3) "1"
右进左出
127.0.0.1:6379> rpush list02 1 2 3
(integer) 3
127.0.0.1:6379> lrange list02 0 -1 //-1即最后一个value
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> rpop list02
"3"
127.0.0.1:6379> lrange list02 0 -1
1) "1"
2) "2"
- 规定时间内获取并移除数据。b即block阻塞
blpop key1 [key2] timeout
brpop key1 [key2] timeout
- 移除指定数据
lrem key count value --移除哪个value,移除几个
举例:
127.0.0.1:6379> lpush mq a b
(integer) 2
127.0.0.1:6379> blpop mq 5
1) "mq"
2) "b"
127.0.0.1:6379> blpop mq 5
1) "mq"
2) "a"
127.0.0.1:6379> blpop mq 5
(nil)
(5.06s)
//此时若在等待1s的时候,在另一个窗口插入了一个value,则任务终止,并返回

127.0.0.1:6379> rpush mq a b c d q w e a s a d a
(integer) 12
//移除a,移除3个
127.0.0.1:6379> lrem mq 3 a
(integer) 3
127.0.0.1:6379> lrange mq 0 -1
1) "b"
2) "c"
3) "d"
4) "q"
5) "w"
6) "e"
7) "s"
8) "d"
9) "a"
//移除的是前三个a,右进左出!
注***
场景一:朋友圈点赞与取消点赞
微信朋友圈点赞,要求按照点赞顺序显示点赞好友信息, 如果取消点赞,移除对应好友信息

lrem指令去实现这个效果,redis可应用于具有操作先后顺序的数据控制。
场景二:用于最新消息的展示
使用list类型使得数据具有顺序的特征,从而解决多路信息合并汇总后仍有顺序的问题:
实际场景:
企业运营过程中,系统将产生出大量的运营数据,比如运维日志,其存于多台服务器,而最终又想按照顺序汇总查看,则可利用redis的list类型
