基本的数据类型,列表
在Redis中,我们可以把list当作栈,队列,或者阻塞队列来使用!
什么叫作栈,什么叫作队列,什么叫作阻塞队列?
画图理解
接下来,我们往redis里面来新增我们的List
所有的list命令,需要配合l或者r来使用
当使用lpush命令时,数据是从左往右插入
拿的时候,是从右往左拿,就是一个栈
127.0.0.1:6379> lpush list one (integer) 1 127.0.0.1:6379> lpush list two (integer) 2 127.0.0.1:6379> lpush list three (integer) 3 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "two" 3) "one"当使用rpush命令时,数据是从左往右插入
拿的时候,是从右往左拿,就是一个栈
127.0.0.1:6379> rpush list one (integer) 1 127.0.0.1:6379> rpush list two (integer) 2 127.0.0.1:6379> rpush list three (integer) 3 127.0.0.1:6379> lrange list 0 -1 1) "one" 2) "two" 3) "three" 127.0.0.1:6379>如果移除,左边的或右边的元素!该如果移除呢?
使用lpop或者rpop
127.0.0.1:6379> lrange list 0 -1 1) "one" 2) "two" 3) "three" ##从右边移除元素 127.0.0.1:6379> rpop list "three" ##从左边移除元素 127.0.0.1:6379> lpop list "one" 127.0.0.1:6379> lrange list 0 -1 1) "two" 127.0.0.1:6379>如果想要获取数组的某一个下标,可以使用
lindex命令
##这里我是从右往左插入的数据 127.0.0.1:6379> rpush list1 one two three (integer) 3 ##数据排列应该为这样 ##one two three 127.0.0.1:6379> lrange list1 0 -1 1) "one" 2) "two" 3) "three" ##下标为0的元素为one 127.0.0.1:6379> lindex list1 0 "one" ##下标为1的元素为two 127.0.0.1:6379> lindex list1 1 "two" ##下表为2的元素为three 127.0.0.1:6379> lindex list1 2 "three" ##没有下标为4的元素,总共就插入了3个元素 127.0.0.1:6379> lindex list1 3 (nil) 127.0.0.1:6379>查看list的长度
之前的查看String长度的命令前加一个l即可!
llen
127.0.0.1:6379> lpush list one two three (integer) 3 127.0.0.1:6379> keys * 1) "list" ##查询list长度 127.0.0.1:6379> llen list (integer) 3 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "two" 3) "one" 127.0.0.1:6379>lrem命令
##查看所有的key 127.0.0.1:6379> keys * (empty array) ##从左边插入元素 127.0.0.1:6379> lpush list one two three three (integer) 4 ##取出0~-1下标的元素 127.0.0.1:6379> lrange list 1 -1 1) "three" 2) "two" 3) "one" ##从左边新增一个元素 127.0.0.1:6379> lpush list three (integer) 5 ##取出0~-1下标的元素 127.0.0.1:6379> lrange list 1 -1 1) "three" 2) "three" 3) "two" 4) "one" ##移除key为list的2个three元素 127.0.0.1:6379> lrem list 2 three (integer) 2 ##取出0~-1下标的元素 127.0.0.1:6379> lrange list 1 -1 1) "two" 2) "one" ##移除key名为list的1个one元素 127.0.0.1:6379> lrem list 1 one (integer) 1 ##取出0~-1下标的元素 127.0.0.1:6379> lrange list 1 -1 1) "two" 127.0.0.1:6379>在Java中我们利用trim方法来截取空格,来获取一部分元素,在redis中也相同,使用ltrim来阶截断List,被ltrim的list会改变
##添加list的key与value 127.0.0.1:6379> lpush list one two three (integer) 3 #添加list的value 127.0.0.1:6379> lpush list four five (integer) 5 ##获取下标范围为0~-1的元素 127.0.0.1:6379> lrange list 0 -1 1) "five" 2) "four" 3) "three" 4) "two" 5) "one" ##截取list,从下标0-2 ##截取之后,原有的list会改变 127.0.0.1:6379> ltrim list 0 2 OK ##获取下标范围为0~-1的元素 127.0.0.1:6379> lrange list 0 -1 1) "five" 2) "four" 3) "three" 127.0.0.1:6379>rpoplpush
移除列表的最后一个元素,并将该元素的添加到新的列表中作为第一个元素
127.0.0.1:6379> lrange list 0 -1 1) "five" 2) "four" 3) "three" ##移除列表的最后一个元素,并将该元素添加到新的list中并作为第一个元素 ##rpoplpush soure destination 127.0.0.1:6379> rpoplpush list mylist "three" 127.0.0.1:6379> lrange list 0 -1 1) "five" 2) "four" 127.0.0.1:6379> lrange mylist 0 -1 1) "three" 127.0.0.1:6379>exists
##判断list是否存在 127.0.0.1:6379> exists list (integer) 0 ##使用lset往list中指定的下标添加value ##如果没有这个key,是不能添加的! 127.0.0.1:6379> lset list 0 one (error) ERR no such key ##现在我们来新增一个list 127.0.0.1:6379> lpush list one (integer) 1 ##判断List是否存在 127.0.0.1:6379> exists list (integer) 1 ##lset往list中新增数据 ##如果没有对对应的下标,也会报异常 127.0.0.1:6379> lset list 1 two (error) ERR index out of range ##lset新增元素,该下标存在 127.0.0.1:6379> lset list 0 two OK ##覆盖了之前小标为0的Value值 127.0.0.1:6379> lrange list 0 -1 1) "two" 127.0.0.1:6379>linsert命令 往key的前面的元素或者后面元素插入一个值
linsert key BEFORE|AFTER pivot element 127.0.0.1:6379> keys * 1) "list" 127.0.0.1:6379> lrange list 0 -1 1) "four" 2) "three" 3) "two" 4) "one" ##往list的four元素前面插入元素before 127.0.0.1:6379> linsert list before four before (integer) 5 127.0.0.1:6379> lrange list 0 -1 1) "before" 2) "four" 3) "three" 4) "two" 5) "one" ##往list的four元素后面插入元素after 127.0.0.1:6379> linsert list after four after (integer) 6 127.0.0.1:6379> lrange list 0 -1 1) "before" 2) "four" 3) "after" 4) "three" 5) "two" 6) "one" 127.0.0.1:6379>list为一个列表
实际上为一个链表
before after left right 都可以插入值!
如果这个list不存在,则要创建一个list,再进行插入…操作
如果移除了key,或者为一个空链表,也代表不存在
在list的左边或右边插入元素效率最高,更新元素效率也高,在中间插入元素,效率会偏低!
在项目中
可以作为一个消息队列 或者栈来使用