redis列表类型

1.问题引入

衣服存储已经确定了使用redis数据库。一切似乎显得那么正常。使用了一段时间后,经理需要1.盘点一下现在库存总共有多少件衣服。2.找出最近入库的10件衣服3.找出最早入库的10件衣服打折销售。

2.使用散列表解决

hset clothes count 0//新增一个计数变量,每次增加衣服就增加这个变量,减少就减少这个变量

hmset clothes:1 num a color red price 100//入库一件衣服

hincrby clothes count 1//计数变量加一

获取最早入库的十件,只能从遍历取出编码最小的十件。

3.使用列表解决

这个例子证明了数据结构对应用功能的影响。如果使用列表解决。

每次新增一件衣服,将衣服的编码同时存到一个列表中。售出一件衣服要从散列表里面删除,同时从列表中删除衣服编码。

hmset clothes:1 num a color red price 100//入库一件衣服

lpush clothes clothes:1//将键加入到列表中

这样就可以通过列表的方法去实现以上功能了。

llen clothes//获取总量

因为列表有序,所以可以通过

lrange clothes 0 9//获取最新的十件

4.常用模式

blpop:blpop是阻塞式的lpop。blpop操作的列表如果为空,命令将阻塞到命令指定的超时时间。blpop key1[key2...]

使用blpop实现时间提醒模式,避免轮询:

消费者

LOOP forever
    WHILE SPOP(key) returns elements
        ... process elements ...
    END
    BRPOP helper_key
END
生成者

MULTI
    SADD key element
    LPUSH helper_key x
EXEC

安全的队列:

redis列表经常被用来当作队列用于各个程序之间交换数据。一个程序使用lpop向队列中放入数据,另一个程序使用rpop从队列中取数据处理。但是这么做有时候不那么安全,例如当rpop取出数据,还没有来得及处理,程序崩溃了,那么这条数据就丢失了。这种情况下可以使用rpoplpush将一条待处理的数据在取出来处理的时候备份到备份队列。处理完使用lrem将备份删除即可。

循环队列:

如果rpoplpush的两个参数是一个key。那么就可以循环挨个遍历这个列表。这种情况适用于希望扫描整个列表而又不希望以此取出来。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值