Skip to content

缓存策略

缓存策略

在当前版本的 maimai.py 中,共有 9 类数据会被缓存,如下表所示。

参数名说明缓存场景默认缓存数据源
songs曲目获取曲目列表或获取分数时依赖曲目信息HybridProvider
aliases曲目别名获取曲目列表或获取分数时依赖曲目信息YuzuProvider
curves曲目拟合获取曲目列表或获取分数时依赖曲目信息None
icons头像获取头像列表或获取分数时依赖头像LXNSProvider
nameplates姓名框获取姓名框列表或获取分数时依赖姓名框LXNSProvider
frames背景获取背景列表或获取分数时依赖背景LXNSProvider
trophies称号获取称号列表或获取分数时依赖称号LocalProvider
charas旅行伙伴获取旅行伙伴列表或获取分数时依赖旅行伙伴LocalProvider
partners搭档获取搭档列表或获取分数时依赖搭档LocalProvider

当遇到缓存场景时,会先检查缓存是否存在,如果存在则直接返回缓存数据,否则会向数据源请求数据并缓存。

需要注意的是,当对默认数据源进行覆写时,会使用您主动指定的数据源刷新缓存,同时替换默认数据源。

因此,您可以通过主动调用方法来手动指定数据源,并且提前将数据进行缓存,例如:

python
# 第一次获取分数,被动缓存曲目信息,选用默认缓存数据源(HybridProvider, YuzuProvider, DivingFishProvider)
my_scores = await maimai.scores(PlayerIdentifier(friend_code=664994421382429), provider=lxns)
# 再获取一次分数,因为曲目信息已经被缓存,所以不会再次请求曲目信息
my_scores = await maimai.scores(PlayerIdentifier(friend_code=664994421382429), provider=lxns)
# 手动获取曲目信息,因为覆写了Provider,将进行主动缓存刷新,选用数据源(DivingFishProvider, YuzuProvider, DivingFishProvider)
songs = await maimai.songs(provider=DivingFishProvider())
# 再获取一次分数,因为曲目信息已经被缓存,所以不会再次请求曲目信息
my_scores = await maimai.scores(PlayerIdentifier(friend_code=664994421382429), provider=lxns)
# 再获取一次曲目信息,因为曲目信息已经被缓存,所以不会再次请求曲目信息
songs = await maimai.songs()

缓存刷新

maimai.py 的缓存遵循生存周期,默认的生存周期为24小时,您可以通过 MaimaiClientcache_ttl 参数来设置缓存的生存周期。

如果您需要手动刷新缓存,可以通过获取 MaimaiClient_cache 属性来获取缓存对象,并调用 clear 方法来清除缓存。

然而,我们不推荐您主动调用 clear 方法,如果您在开发Web应用,这可能会导致没有关闭的连接无法找到缓存资源。

关于Redis

maimai.py 的缓存默认使用内存缓存,如果您需要使用 Redis 缓存,可以通过 MaimaiClientcache 参数来使用 Redis 。

python
# ✅ 支持使用 Redis 缓存, 重启后不会丢失
maimai = MaimaiClient(cache=RedisCache(serializer=PickleSerializer()))

async def quick_start():
    songs: MaimaiSongs = await maimai.songs() # 命中缓存
    songs: MaimaiSongs = await maimai.songs() # 命中缓存

asyncio.run(quick_start())

性能建议

如果您正在开发Web应用,我们建议您用类似下面的方式来使用 maimai.py:

python
from fastapi import FastAPI
import asyncio
from maimai import MaimaiClient, DivingFishProvider

app = FastAPI()
maimai = MaimaiClient()

@app.get("/songs/list", response_model=list[Song])
async def get_songs():
    return await maimai.songs() # 这里会从缓存中按需加载数据,不会造成额外的请求和性能损失

创建 MaimaiSongs 不会引入额外的性能损失,因为所有的曲目信息都已经被缓存,并且只有在需要的时候才会被加载。

INFO

关于 Web 应用的更多信息,请参考我们的内置 Web 实现 api.py

MIT License