Redis的数据结构——列表(list)
存储list:
- ArrayList使用数组方式
- LinkedList使用双向链表方式
- 双向链表中添加数据
- 双向链接中删除数据
ArrayList使用数组的方式存储数据,所以根据索引查询的速度是相当快的;但是新增和删除操作涉及到位移操作,所以比较慢。
LinkedList使用双向链表方式存储数据,每个元素都记录前后元素的指针,所以插入和删除数据的时候,只是改变了前后元素指针所指向即可,速度就非常快了。
存储list常用命令:
- 两端添加
- 两端弹出
- 查看列表
- 获取列表元素个数
- 扩展命令
lpushx [listname] [value1] [value2]....列表[listname]存在、则在左端加入值
rpush [listname] [value1] [value2]....列表右端加入值
rpushx [listname] [value1] [value2]....列表[listname]存在、则在右端加入值
lrange [listname] [start] [stop] 获取区间内的值
lpop [listname] 弹出最左端值
rpop [listname] 弹出最右端值
llen [listname] 获取列表长度
lrem [listname] [count] [value] 删除count个指定值,count=0删除所有,count>0从左至右删除count个值,count<0从右至左删除count个值
lset [listname] [index] [value] 设置相应index的值 0:第一个,-1:最后一个linsert [listname] [before/after] [keyvalue] [value]
在第一个[keyvalue]的[之前/之后]插入[value]rpoplpush [listname1] [listname2] 将[listname1]
最右端的值弹出压入[listname2]最左端
rpoplpush使用场景:
Redis列表经常用于消息队列的一些服务来完成多个程序之间的一个消息的交互。那么,假设一个应用程序正在执行lpush向列表中添加新的元素,我们通常将这样的程序称之为生产者。另外一个程序正在执行rpop操作从列表中取出元素,我们称之为消费者。那么,与此同时消费者程序在取出元素后,立刻崩溃。由于该消息已经被取出且没有被正常处理。那么我们就可以认为这个消息已经丢失了。那么由此可能会导致业务数据的丢失或者业务状态不一致等现象的发生。然而可以通过我们的rpoplpush这个命令,那么消费者程序在主消息队列中取出元素后,再将它插入到一个备份的队列当中,直到我们的消费者程序完成正常的逻辑处理后,再将消息从备份队列中删除。这样的话我们可以提供一个守护的线程。然后当发现备份队列中的消息过期的时候,可以重新将它放回到主消息的队列当中。以便其他的一些消费者可以继续处理。