4.Redis系列之常用数据类型列表list
1. 基本操作
# lpush/rpush从左边或右边插入一个或多个值
127.0.0.1:6379> lpush username shenjian domi
(integer) 2
# lpop/rpop从左边或右边抛出一个值
127.0.0.1:6379> rpop username 1
1) "shenjian"
# lrange按照索引下标从左到右获取元素
127.0.0.1:6379> lrange username 0 -1
1) "domi"
# rpoplpush <key1> <key2> 从key1列表右边抛出一个值,插到key2列表左边
127.0.0.1:6379> lpush user shen
(integer) 1
127.0.0.1:6379> rpoplpush user username
"shen"
127.0.0.1:6379> lrange username 0 -1
1) "shen"
2) "domi"
# lindex按照索引下标获取元素
127.0.0.1:6379> lindex username 1
"domi"
# llen获取列表长度
127.0.0.1:6379> llen username
(integer) 2
# linsert <key> before/after <value> <newvalue>在value前/后面插入newvalue
127.0.0.1:6379> linsert username before domi shenjian
(integer) 3
127.0.0.1:6379> lrange username 0 -1
1) "shen"
2) "shenjian"
3) "domi"
127.0.0.1:6379> lpush username shenjian
(integer) 4
# lrem <key> <n> <value>从左边删除n的value
127.0.0.1:6379> lrem username 1 shenjian
(integer) 1
# lset <key> <index> <value>key列表指定下标值为value
127.0.0.1:6379> lset username 0 shenjian
OK
2. 底层数据结构
127.0.0.1:6379> object encoding username
"quicklist"
List的数据结构为快速列表quicklist,由压缩列表ziplist[压缩列表结构本身就是连续的内存块]和普通的双向链表组成。每个双链表节点中保存一个ziplist,然后每个ziplist中存一批list中的数据,这样既可以避免大量链表指针带来的内存消耗,也可以避免ziplist更新导致的大量性能损耗。