![e8a944c120f3761bcf8e82b533c2afe4.png](https://i-blog.csdnimg.cn/blog_migrate/969c82e1f2ada22c4039a93707668ce1.jpeg)
如果你是一位 Python 开发者, 那么你肯定使用过 Redis , 并且认为它是一个很棒的缓存。 虽然你的印象没有错, Redis 的确是一个很棒的缓存, 但使用 Redis 能够解决的问题并不仅限于缓存。
我们将探索 Redis 和 Redis Enterprise 的一些其他用途。 为了找点乐子, 我将使用之前《 使用 Redis 储存地理位置数据 》一文中的大脚怪(Bigfoot)数据。 此外, 由于这篇文章的读者都是 Python 开发者, 所以我将使用 Python 来编写本文的所有代码!
我在接下来展示的代码中使用了 aioredis 客户端库, 因为它对 async/await 提供了非常棒的支持。 如果你对 async/await 不熟悉的话, 那么可以去看看 这篇文章 , 里面提到了 async/await 对提升性能的帮助。
使用 Redis 构建队列
Redis 提供了字符串、哈希、集合和列表等多种数据结构可供使用。 这些数据结构都是储存数据的好帮手, 其中列表就可以用作一个非常棒的队列(queue)。
为了将列表用作队列, 我们需要使用 RPUSH 将新项目推送至列表末尾, 然后使用 LPOP 或者 BLPOP 将它们从列表的前面弹出。 由于 Redis 对数据库的所有修改都是在单个线程里面完成的, 所以这些操作都是原子的。
![79076d8499cea192858c3f46e8ccfa43.png](https://i-blog.csdnimg.cn/blog_migrate/e8288e8441a9845a056cc5958515a698.jpeg)
作为例子, 下面这段在队列里面添加了一些大脚怪的踪迹。
import asyncio import aioredis async def main(): redis = await aioredis.create_redis('redis://:foobared@localhost:6379/0', encoding='utf-8') await asyncio.gather( add_to_queue(redis, 'Possible vocalizations east of Makanda'), add_to_queue(redis, 'Sighting near the Columbia River'), add_to_queue(redis, 'Chased by a tall hairy creature') ) redis.close() await redis.wait_closed() def add_to_queue(redis, message): return redis.rpush('bigfoot:sightings:received', message) asyncio.run(main())
这个程序非常直接。 我们只需要在第 18 行调用 redis.rpush , 就能够将指定的元素推入到队列。 接下来是从队列另一端读取元素的代码, 同样非常简单。
import asyncio import aioredis from pprint import pp async def main(): redis = await aioredis.create_redis('redis://:foobared@localhost:6379/0', encoding='utf-8') while True: sighting = await redis.blpop('bigfoot:sigh