《Redis应用实例》书摘(4):缓存二进制数据¶
除了缓存文本数据之外,Redis还经常被用于缓存二进制数据,比如图片、视频、音频等。
代码清单 CODE_BINARY_CACHE 展示了一个通用的二进制文件缓存程序:它接受二进制文件的路径作为参数,接着打开并读取该文件的内容,然后将其缓存到Redis中,而具体的缓存操作则是通过复用之前的缓存程序来实现。
代码清单 CODE_BINARY_CACHE 二进制文件缓存程序 binary_cache.py
from cache import Cache
class BinaryCache:
def __init__(self, client):
self.cache = Cache(client)
def set(self, name, path, ttl=None):
"""
根据给定的名字和文件路径,缓存指定的二进制文件数据。
可选的ttl参数用于设置缓存的生存时间。
"""
# 以二进制方式打开文件,并读取文件中的数据
file = open(path, "rb")
data = file.read()
file.close()
# 缓存二进制数据
self.cache.set(name, data, ttl)
def get(self, name):
"""
尝试获取指定名字的缓存内容,若缓存不存在则返回None。
"""
return self.cache.get(name)
class Cache:
def __init__(self, client):
self.client = client
def set(self, name, content, ttl=None):
"""
为指定名字的缓存设置内容。
可选的ttl参数用于设置缓存的生存时间。
"""
if ttl is None:
self.client.set(name, content)
else:
self.client.set(name, content, ex=ttl)
def get(self, name):
"""
尝试获取指定名字的缓存内容,若缓存不存在则返回None。
"""
return self.client.get(name)
作为例子,以下代码展示了如何使用这个程序缓存一个图片文件,然后再从缓存中取出该图片的数据并查看其中的前10个字节:
>>> from redis import Redis
>>> from binary_cache import BinaryCache
>>> client = Redis()
>>> cache = BinaryCache(client)
>>> cache.set("redis-logo", "./redis-logo.png") # 缓存数据
True
>>> cache.get("redis-logo")[:10] # 读取被缓存数据的前10个字节
b'\x89PNG\r\n\x1a\n\x00\x00'