Redis---list类型
list的实现并非一个简单的数组而是个接近于“双端队列”(std::deque)列表中的元素是有序的这里的有序不是指的顺序而是指的因顺序变更得到的结果与变更之前是不等价的列表中元素是可以重复的hash中元素是不以重复的意思是一个列表中可以有多个相同的值LPUSH对列表进行头插操作格式lpush key element [element...]返回值插入后list的长度时间复杂度O(1)举个例子lpush key1 element1 element2 element3LRANGE获取从strent到end区间所有的元素左闭右闭下标支持负数操作格式lange key start end举个例子lpush key1 element1 element2 element3 //获取还列表上的全部数据 lrange key 0 -1如果取的数值越界了怎么办redis的做法是直接尽可能的获取给定区间元素如果给定区间越界就会尽可能的获取对应内容LPUSHX如果key存在则完成头插操作如果key不存在则返回空与EX特性比较相似返回值插入后list的长度时间复杂度O(1)RPUSH/RPUSHXX---exists与LPUSH/LPUSHX一样LPOP头删操作格式lpop key [count]在redis6.2版本新增的count属性原先是没有的表示一次删除几个元素举个例子返回值删除的元素或者为nil时间复杂度O(1)举个例子lpush key1 element1 element2 element3 lpop key1 3RPOP尾删操作格式rpop key [count]注意在redis6.2版本新增的count属性原先是没有的表示一次删除几个元素举个例子rpush key1 element1 element2 element3 rpop key1 3LINDEX获取从左数第index位置的元素操作格式lindex key index返回值取出的元素或者nil时间复杂度O(N)N为删除元素的个数效率上一般情况下可以理解为O(1)举个例子lpush key element1 element2 element3 element4 element5 //取下标为前5的元素并不拿第5个元素这里的5可以理解为拿前5个元素 lindex key1 5LINSERT进行任意位置的插入操作格式linsert key beffore | after pivot elementpivot在什么位置插入beffore | after在该位置的前或者后插入举个例子linsert key before 4 100返回值list新长度万一插入的列表中基准值存在多个怎么办linsert进行插入的时候要根据基准值找到对应的位置从左往右找找到第一个复合基准值的位置即可时间复杂度O(N)因为需要遍历列表N表示列表的长度LLEN获取list的长度操作格式llen key返回值list的长度若该key不存在长度返回0时间复杂度O(1)LREMrem---remove删除多个相同元素的值操作格式lrem key count element时间复杂度O(N M)N是元素个数M是你要删除的个数可以理解为O(N)count 0含义为从左往右找count 0含义为从右往左找count 0含义为element的全部元素举个例子rpush key1 1234 lrem key1 -1 2LTRM保留start到end之间的元素区间外的全部被删除操作格式ltrem key start end时间复杂度O(N)举个例子lpush key1 1 2 3 4 5 ltrem key 2 5LSET根据下标修改元素操作格式lset key index element时间复杂度O(N)举个例子lset key1 0 3lset插入越界值的话会报错阻塞版本命令BLPOP/BRPOP在list中有元素的时候与lpop/rpop并无区别但是在没有元素的时候会进行阻塞等待在等待期间redis可以执行其他命令同时可以设置阻塞时间不需要进行无休止的等待blpop/brpop都是可以同时去尝试删除多个key列表上的元素多个key对应多个list这么多个list哪个有元素了执行删除立刻返回并不是将所有的key都删除一遍而是多个中成功删除一次就行返回值被删除的元素操作格式blpop/brpop key[key...] timeouttimeout单位是秒redis6中单位允许设置成小数redis5中时间只能设置成整数举个例子lpush key 1 2 3 4 5 bloop key 10该组命令主要用途是做消息队列list内部编码在早些版本list的内部编码为ziplist当存储内容长度小于配置的长度字节数默认64字节且元素个数也小于配置长度默认为512个元素时选用ziplist作为list的内部编码原因要求内容元素长度较短的原因是因为会对内容进行压缩那么就一定涉及到解压缩内容过长就意味着解压缩时间过长就会影响效率所以在这时还不容不进行压缩使用linklist效率高元素少就更好理解了元素数量过多就意味着遍历到目标元素的时间越长进而影响效率linkedlist正常的链表格式现在使用的编码格式quicklistquicklist相当于链表和压缩链表的结合整体还是一个链表链表的每个节点是一个压缩列表list应用场景1.2.使用list做消息队列3.可以实现栈队列