Redis list(列表)相当于 Java 语言中的 LinkedList 结构,是一个链表而非数组,其插入、删除元素的时间复杂度为 O(1),但是查询速度欠佳,时间复杂度为 O(n)。
认识Redis List列表
Redis List是一个可以存储多个有序字符串的数据结构,他的底层是一个链表。我们可以通过左右两端追加、裁剪、查看元素,还可以通过列表的一些操作对列表中的元素进行加工。
Redis List常用命令
- lpush: 在列表左侧添加值
- rpush: 在列表右侧添加值
- lrange: 返回列表指定范围内的所有元素
- lindex: 获取列表指定索引位置的元素
- llen: 返回列表的长度
- lpop: 移除并返回列表的左侧第一个元素
- rpop: 移除并返回列表的右侧第一个元素
- lrem: 从列表中删除和值相等的元素
- lset: 设置列表指定索引位置的值
- ltrim: 修剪列表,只保留指定范围内的元素
- blpop/brpop: 阻塞式弹出元素
Redis List使用实例
我们通过一个实际的场景来演练 Redis List 的使用方法。
场景:假设有一个待办事项(todolist)应用,用户可以添加、删除、更新、查看待办事项。
我们将使用 Redis List 来实现这个应用。每个用户都有一个唯一的键名,一个用户的待办事项列表就是一个 Redis List.
添加待办事项
我们首先实现添加待办事项的功能。通过 lpush 命令在 Redis List 的左侧添加待办事项,即新的待办事项会显示在列表的最顶端。
import redis
# 连接 Redis 数据库
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
def add_todo_item(user_id, todo_item):
key = f'todo:{user_id}'
redis_client.lpush(key, todo_item)
print(f'User {user_id} added a todo item: {todo_item}')
在上述代码中,我们通过 lpush 命令在列表左侧添加待办事项,并打印了一行提示信息。
查看待办事项列表
我们接下来实现查看用户待办事项列表的功能。通过 lrange 命令获取待办事项列表中的某一范围元素,这里我们通过 lrange 命令获取整个列表。
def show_todo_list(user_id):
key = f'todo:{user_id}'
todo_list = redis_client.lrange(key, 0, -1)
print(f'Todo list for user {user_id}:')
for i, todo_item in enumerate(todo_list, start=1):
print(f'{i}. {todo_item.decode()}')
在上述代码中,我们通过 lrange 命令获取用户的待办事项列表,然后通过 for 循环遍历所有元素并打印出来。
删除待办事项
我们接下来实现删除某一个待办事项的功能。通过 lrem 命令删除列表中的某个元素。
def remove_todo_item(user_id, item_index):
key = f'todo:{user_id}'
item = redis_client.lindex(key, item_index - 1)
if item:
redis_client.lrem(key, count=0, value=item)
print(f'Removed todo item: {item.decode()}')
else:
print(f'Invalid item index: {item_index}')
在上述代码中,我们首先通过 lindex 命令获取某个索引位置的元素,然后通过 lrem 命令删除和该元素值相等的所有元素。
更新待办事项
我们接下来实现更新某一个待办事项的功能。通过 lset 命令设置列表指定索引位置的值。
def update_todo_item(user_id, item_index, new_todo_item):
key = f'todo:{user_id}'
redis_client.lset(key, item_index - 1, new_todo_item)
print(f'Updated todo item: {new_todo_item}')
在上述代码中,我们通过 lset 命令设置列表中指定索引位置的值。
到这里,我们已经完成了 Redis List 的一个小应用,下面我们来测试一下。
4. 测试代码
if __name__ == '__main__':
user_id = 10001
add_todo_item(user_id, 'Buy milk')
add_todo_item(user_id, 'Read book')
add_todo_item(user_id, 'Do laundry')
show_todo_list(user_id)
remove_todo_item(user_id, 2)
show_todo_list(user_id)
update_todo_item(user_id, 1, 'Buy bread')
show_todo_list(user_id)
在这个测试代码中,我们首先添加 3 个待办事项,然后查看待办事项列表,接着删除第二个待办事项,然后再次输出待办事项列表,最后修改第一个待办事项内容,再次输出待办事项列表。执行结果如下:
User 10001 added a todo item: Buy milk
User 10001 added a todo item: Read book
User 10001 added a todo item: Do laundry
Todo list for user 10001:
1. Do laundry
2. Read book
3. Buy milk
Removed todo item: Read book
Todo list for user 10001:
1. Do laundry
2. Buy milk
Updated todo item: Buy bread
Todo list for user 10001:
1. Buy bread
2. Do laundry
以上就是 Redis 列表的完整使用方法,希望能对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Redis list列表使用方法 - Python技术站