前两节学习了String和Hash, Hash可以把关连性的字段组合到一起用一个KEY, key值多同样会耗费内存和CPU, 在这点上Hash要优于String, 当然String在字符操作上如追加、部分值更新、Key 过期上更加灵活, 都是为特定的场景制定,这里学习另一个数据结构LIST列表,List顾名思义可以认为左右延伸的队列,一种有序存放的数据结构。
常用的操作有
推入
LPUSH:将元素推入到列表左端
RPUSH:将元素推入到列表右端
LPUSHX、RPUSHX:只对已存在的列表执行推入操作
移除
LPOP:弹出列表最左端的元素
RPOP:弹出列表最右端的元素
RPOPLPUSH:将右端弹出的元素推入到左端
测试命令
[root@MiWiFi-R2100-srv ~]# redis-cli 127.0.0.1:6379> lpush Order u1 (integer) 1 127.0.0.1:6379> lpush Order u2 (integer) 2 127.0.0.1:6379> lpush Order u3 (integer) 3 127.0.0.1:6379> lrange Order 0 -1 1) "u3" 2) "u2" 3) "u1" 127.0.0.1:6379> rpush Order u5 (integer) 4 127.0.0.1:6379> lrange Order 0 -1 1) "u3" 2) "u2" 3) "u1" 4) "u5" 127.0.0.1:6379> lindex Order 0 "u3" 127.0.0.1:6379> lindex Order 1 "u2" 127.0.0.1:6379> rpush Order 9 (integer) 5 127.0.0.1:6379> rpush Order u1 (integer) 6 127.0.0.1:6379> rpush Order u9 (integer) 7 127.0.0.1:6379> lrange Order 0 -1 1) "u3" 2) "u2" 3) "u1" 4) "u5" 5) "9" 6) "u1" 7) "u9" 127.0.0.1:6379> rpushx Order u9 (integer) 8 127.0.0.1:6379> rpushx Order u10 (integer) 9 127.0.0.1:6379> lrange Order 0 -1 1) "u3" 2) "u2" 3) "u1" 4) "u5" 5) "9" 6) "u1" 7) "u9" 8) "u9" 9) "u10" 127.0.0.1:6379> rpushx Order u10 (integer) 10 127.0.0.1:6379> lrange Order 0 -1 1) "u3" 2) "u2" 3) "u1" 4) "u5" 5) "9" 6) "u1" 7) "u9" 8) "u9" 9) "u10" 10) "u10" 127.0.0.1:6379> rpushx Order u11 (integer) 11 127.0.0.1:6379> lrange Order 0 -1 1) "u3" 2) "u2" 3) "u1" 4) "u5" 5) "9" 6) "u1" 7) "u9" 8) "u9" 9) "u10" 10) "u10" 11) "u11" 127.0.0.1:6379> rpushx Order1 u11 (integer) 0 127.0.0.1:6379> lrange Order1 0 -1 (empty array) 127.0.0.1:6379> lpush Order u100 u200 u300 (integer) 14 127.0.0.1:6379> lrange Order1 0 -1 (empty array) 127.0.0.1:6379> lrange Order 0 -1 1) "u300" 2) "u200" 3) "u100" 4) "u3" 5) "u2" 6) "u1" 7) "u5" 8) "9" 9) "u1" 10) "u9" 11) "u9" 12) "u10" 13) "u10" 14) "u11" 127.0.0.1:6379> lpop u300 (nil) 127.0.0.1:6379> lpop Order "u300" 127.0.0.1:6379> lrange Order 0 -1 1) "u200" 2) "u100" 3) "u3" 4) "u2" 5) "u1" 6) "u5" 7) "9" 8) "u1" 9) "u9" 10) "u9" 11) "u10" 12) "u10" 13) "u11" 127.0.0.1:6379> lpop Order "u200" 127.0.0.1:6379> lpop Order "u100" 127.0.0.1:6379> lrange Order 0 -1 1) "u3" 2) "u2" 3) "u1" 4) "u5" 5) "9" 6) "u1" 7) "u9" 8) "u9" 9) "u10" 10) "u10" 11) "u11" 127.0.0.1:6379> rpop Order "u11" 127.0.0.1:6379> rpop Order "u10" 127.0.0.1:6379> rpoplpush Order Last "u10" 127.0.0.1:6379> rpoplpush Order Last "u9" 127.0.0.1:6379> rpoplpush Order Last "u9" 127.0.0.1:6379> lrange Order 0 -1 1) "u3" 2) "u2" 3) "u1" 4) "u5" 5) "9" 6) "u1" 127.0.0.1:6379> lrange Last 0 -1 1) "u9" 2) "u9" 3) "u10" 127.0.0.1:6379> llen Order (integer) 6 127.0.0.1:6379> llen last (integer) 0 127.0.0.1:6379> llen LAST (integer) 0 127.0.0.1:6379> llen Last (integer) 3
应用场景
FIFO 队列,如下发短信,或秒杀活动
import redis
import json
client = redis.Redis()
for i in range(100):
print('telnum {0:011d} add completed!'.format(i))
client.rpush('phone_queue',json.dumps('{"telnum":"'+str(i).zfill(011)+'"}'))
telnum 00000000000 add completed!
2L
telnum 00000000001 add completed!
3L
telnum 00000000002 add completed!
下发短信
import redis
import json
client = redis.Redis()
def send_sms(tel):
print('----{%s}----'.format(tel))
next_phone_info = ''
while True:
phone_bytes = client.lpop('phone_queue')
if not phone_bytes:
print('All message send completed!')
break
phone_info = json.loads(phone_bytes)
retry = phone_info.get('retry', 0)
telnum = phone_info['telnum']
rest = send_sms(telnum)
if rest:
print('The telnum {} send completed...'.format(telnum))
continue
if retry >= 3:
print('The telnum {} send failed. try 3 times'.format(telnum))
continue
next_phone_info = {'telnum':telnum, 'retry': retry+1}
client.rpush('phone_queue', json.dumps(next_phone_info))
同样也可以做分页查询
[root@MiWiFi-R2100-srv list]# vi paging.py
class Paging:
def __init__(self, client, key):
self.client = client
self.key = key
def add(self, item):
self.client.lpush(self.key, item)
def get_page(self, page_number, item_per_page):
"""
"""
start_index = (page_number - 1) * item_per_page
end_index = page_number * item_per_page - 1
return self.client.lrange(self.key, start_index, end_index)
def size(self):
"""
"""
return self.client.llen(self.key)
[root@MiWiFi-R2100-srv list]# python paging.py
[root@MiWiFi-R2100-srv list]# python
Python 2.7.5 (default, Nov 20 2015, 02:00:19)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from redis import Redis
>>> from paging import Paging
>>> client = Redis(decode_responses=True)
>>> topics = Paging(client, "user-topics")
>>> for i in range(20):
... topics.add(i)
...
>>> topics.get_page(2, 5)
[u'14', u'13', u'12', u'11', u'10']
–over —