持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
🍊作者简介:少年不想说话,努力长大
🍊往期回顾:从零开始Redis(三)
🍊近期目标:写完基础源码,点赞👍🏼、收藏⭐、留言📩
上讲我们说完了Redis的String类型的特性,今天我们继续看看redis的数据结构!!!
今天我们要说的是它的列表List,话不多说list可以做啥?
数据结构list
list首先是一个链表,在Redis中比如我们要分析文件,而一个文件夹下会有很多文件,为了让多台机器分析不同的文件我们必须使用中间件才存储这些内容,此时我们可以将文件的路径遍历然后存入该list中如果文件有序我们就先进先出顺序取出,redis支持取出命令并删除该list位置的路径我们先简单理解成指针路由,命令我们稍后说;对于该list结构我们可以去看下服务的src目录下有ziplist.c和quicklist.c两个文件夹;
我们打开ziplist文件可以发现第一句话是ziplist是一种特殊编码的双链表,非常节省内存(因为存的是entry,有兴趣大家自行深入);但是ziplist它是占用一块连续内存而不是节点指向可能的下一个内存块;
我们打开quicklist.c第一句是- A doubly linked list of ziplists,它依然是用ziplists来存储数据,每一个节点是一个quicklistNode去指向ziplist,它包含prev和next指针,是的,quicklist对ziplist做了封装,达到性能的同时尽量占用最少的内存;
这里我们要注意,如果list类型的value值取为空了,那么该key也会被清掉的;
下面我们看看具体的命令是如何操作的lpush左边塞值,rpush右边塞值,lrange取值;
127.0.0.1:6379> LPUSH myEle 1 2 3 4 5 6 7
(integer) 7
127.0.0.1:6379> RPUSH myEle 8
(integer) 8
127.0.0.1:6379> LRANGE myEle 0 -1
1) "7"
2) "6"
3) "5"
4) "4"
5) "3"
6) "2"
7) "1"
8) "8"
这里的lrange的0表示左边第一个, -1表示右边第一个;
下面我们要进行取值了,对照着上面的看lpop左取,rpop右取;
127.0.0.1:6379> LPOP myEle
"7"
127.0.0.1:6379> RPOP myEle
"8"
接着下面按顺序是获取指定位置值,获取list长度,将指定位置的值替换;
127.0.0.1:6379> LINDEX myEle 3
"3"
127.0.0.1:6379> LRANGE myEle 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> LLEN myEle
(integer) 6
将指定位置的值替换
127.0.0.1:6379> LSET myEle 3 new3
OK
127.0.0.1:6379> LRANGE myEle 0 -1
1) "6"
2) "5"
3) "4"
4) "new3"
5) "2"
6) "1"
好了,List这块说的差不多了,list在实际项目中还是有很大用处的,比如我上面举例的串行分析文件,其次list优秀的底层设计结构也是可以借鉴的,它淘汰了linkedlist转而选择封装ziplist保证性能和内存🥗🥗🥗;
结束结束,那就🛴🛴🛴
如果对你有所帮助
点个赞呗