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实现时间提醒模式,避免轮询:
消费者
生成者安全的队列:
redis列表经常被用来当作队列用于各个程序之间交换数据。一个程序使用lpop向队列中放入数据,另一个程序使用rpop从队列中取数据处理。但是这么做有时候不那么安全,例如当rpop取出数据,还没有来得及处理,程序崩溃了,那么这条数据就丢失了。这种情况下可以使用rpoplpush将一条待处理的数据在取出来处理的时候备份到备份队列。处理完使用lrem将备份删除即可。
循环队列:
如果rpoplpush的两个参数是一个key。那么就可以循环挨个遍历这个列表。这种情况适用于希望扫描整个列表而又不希望以此取出来。