List 列表

Redis 的列表是一种线性的有序结构, 可以按照元素被推入列表的顺序来存储元素, 这些元素即可以是文字顺序, 也可以是二进制顺序, 且元素可重复出现.

示例: 先入先出队列

许多电商网站都会在节日时推出一些秒杀活动, 这些活动会放出数量有限的商品供用户抢购, 秒杀系统的一个特点就是短时间内会有大量用户进行相同的购买操作, 如果使用事务或者锁去实现秒杀程序, 那么会因为锁和事务的重试性而导致性能低下, 并且由于重试的存在, 成功购买商品的用户可能并不是最早购买操作的用户, 因此这种秒杀系统并不公平.
解决方法之一就是把用户的购买操作都放入先进先出队列里面, 然后以队列的方式处理用户购买操作, 这样的程序就可以不使用锁或者事务实现秒杀系统, 且更加公平.

PYTHON
from redis import Redis

class FIFOqueue:
    def __init__(self, client, key):
        self.client = client
        self.key = key
    def enqueue(self, item):
        return self.client.rpush(self.key, item)
    def dequque(self):
        return self.client.lpop(self.key)

client = Redis(decode_responses=True)
q = FIFOqueue(client,   key="buy-request")

print("Enqueue:", q.enqueue("peter-buy-milk"), "peter-buy-milk")
print("Enqueue:", q.enqueue("john-buy-rice"), "john-buy-rice")
print("Enqueue:", q.enqueue("david-buy-keyboard"), "david-buy-keyboard")

print("Dequeue:", q.dequque())
print("Dequeue:", q.dequque())
print("Dequeeu:", q.dequque())
Click to expand and view more

示例: 分页

对于有一定规模的网站来说, 分页程序都是必不可少的; 新闻站点、博客、论坛、搜索引擎等, 都会使用分页程序将数量众多的信息分割为多个页面, 使得用户可以以页面为单位流览网站提供的信息, 并以此来控制网站每次取出的信息数量.

PYTHON
from redis import Redis

class Paging:
    def __init__(self, client, key):
        self.client = client
        self.key = key
    def add(self, item):
        self.client.rpush(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
        return self.client.lrange(self.key, start_index, end_index)
    def size(self):
        return self.client.llen(self.key)

client = Redis(decode_responses=True)
topics = Paging(client, "user-topics")

for i in range(1, 20):
    topics.add(i)

print(topics.get_page(1, 5))
print(topics.get_page(2, 5))
print(topics.get_page(1, 10))
print(topics.size())
Click to expand and view more

示例: 代办事项

使用两个列表分别记录代办事项和已完成事项:

PYTHON
from redis import Redis

def make_todo_list_key(user_id):
    return user_id + "::todo_list"

def make_done_list_key(user_id):
    return user_id + "::done_list"

class TodoList:
    def __init__(self, client, user_id):
        self.client = client
        self.user_id = user_id
        self.todo_list = make_todo_list_key(self.user_id)
        self.done_list = make_done_list_key(self.user_id)
    def add(self, event):
        self.client.lpush(self.todo_list, event)
    def remove(self, event):
        self.client.lrem(self.todo_list, 0, event) # 移除所有元素
    def done(self, event):
        self.remove(event)
        self.client.lpush(self.done_list, event)
    def show_todo_list(self):
        return self.client.lrange(self.todo_list, 0, -1)
    def show_done_list(self):
        return self.client.lrange(self.done_list, 0, -1)
    def clear(self):
        self.client.delete(make_todo_list_key(self.user_id))
        self.client.delete(make_done_list_key(self.user_id))

client = Redis(decode_responses=True)
todo = TodoList(client, "peter's todo list")

todo.add("go to sleep")
todo.add("buy some milk")
print("Todo list:", todo.show_todo_list())
print()

todo.done("buy some milk")
print("Todo list:", todo.show_todo_list())
print("Done list:", todo.show_done_list())

todo.clear()
Click to expand and view more

Start searching

Enter keywords to search articles

↑↓
ESC
⌘K Shortcut