LeanCache 使用指南
LeanCache 是云引擎提供的托管 Redis,开发者可以在云引擎中使用 Redis 客户端类库连接,访问完整的 Redis 功能,更多其他托管数据库请查看 云引擎服务总览。
LeanCache 使用 Redis 提供了高性能、高可用的 Key-Value 内存存储,主要用作缓存数据的存储,也可以用作持久化数据的存储。LeanCache 采用主从架构的 高可用 配置,通过 AOF 和 RDB 进行数据的持久化,还提供了在不中断服务的情况下在线扩容的能力。
点击展开 LeanCache 的使用场景
- 某些数据量少,但是读写比例很高,比如某些应用的菜单可以通过后台调整,所有用户会频繁读取该信息。
- 需要同步锁或者队列处理,比如秒杀、抢红包等场景。
- 多个云引擎节点的协同和通信。
恰当使用 LeanCache 不仅可以极大地提高应用的服务性能,还能 降低成本,因为某些高频率的查询不需要走存储服务(存储服务按调用次数收费)。你可以在 leanengine-nodejs-demos 中找到一些有关 LeanCache 的示例:
- associated-data 缓存关联数据
- leaderboard 实现排行榜
- limited-stock-rush 实现秒杀抢购
- redlock 实现分布式锁
点击展开 LeanCache 高可用详情
每个 LeanCache 实例使用 Redis Master-Slave 主从热备,其下的多个观察节点每隔 1 秒钟观察一次主节点的状态。如果「主节点」最后一次有效响应在 5 秒之前,则该观察节点认为主节点失效。如果超过总数一半的观察节点发现主节点失效,则自动将「从节点」切换为主节点,并会有新的从节点启动重新组成主从热备。这个过程对应用完全透明,不需要修改连接字符串或者重启,整个切换过程应用只有几秒钟会出现访问中断。
与此同时,从节点还会以 AOF 方式 将数据持久化存储到可靠的中央文件中,每秒刷新一次。如果很不巧主从节点同时失效,则马上会有新的 Redis 节点启动,并从 AOF 文件恢复,完成后即可再次提供服务,并且会有新的从节点与之构成主从热备。
当一个实例中的主节点失效,而最新的数据没有同步到对应的从节点时,主从切换会造成这部分数据丢失。当主、从节点同时失效,未同步到从节点和从节点未刷新到磁盘 AOF 文件中的数据将会丢失。
创建和管理实例
开发者可以在 开发者中心 > 你的游戏 > 游戏服务 > 云服务 > 云引擎 > 数据库 > LeanCache (Redis) 页面创建和管理 LeanCache 实例。
创建实例
LeanCache 实例一旦创建就会开始计费,如余额不足可能会导致账号因欠费被停用。
点击 创建实例 可在控制台中看到一些配置项:
- 实例名称 用于在云引擎中通过环境变量引用到该 LeanDB 实例,在账户下需唯一。
- 数据删除策略 内存用满时的删除策略,默认为
volatile-lru
,详见 数据删除策略。 - 实例容量 目前提供
128M
、256M
、512M
、1G
、2G
、4G
、8G
几种,代表不同的内存容量,是计费的基础。
在调整好规格后,可以在控制台上看到当前规格的价格。
点击展开 LeanCache 计费详情
LeanCache 按天进行扣费,使用时间不足一天也按一天计费,每天扣除前一天的费用。 LeanCache 基于开发者选择的实例规格进行计费,与实际用量无关(即使创建后未使用也会计费)。各规格的价格可以在创建 LeanCache 时或 价格页面查看,扣费记录可在 开发者中心的账单中查看。
如账号欠费停用超过一个月,LeanCache 及其中的数据会被彻底删除。
数据删除策略
详见 官方文档,下面是一个简单的概括:
noeviction
不删除,当内存满时,直接返回错误。allkeys-lru
优先删除最近最少使用的 key,以释放内存。volatile-lru
优先删除设定了过期时间的 key 中最近最少使用的 key,以释放内存。allkeys-random
随机删除一个 key,以释放内存。volatile-random
从设定了过期时间的 key 中随机删除一个,以释放内存。volatile-ttl
从设定了过期时间的 key 中删除最老的 key,以释放内存。
Redis 版本
目前 LeanCache 仅提供 Redis 6 版本。
在线扩容
你可以在线扩大(或者缩小)LeanCache 实例的最大内存容量。整个过程可能会持续一段时间,在此期间 LeanCache 会中断几秒钟进行切换,其他时间都正常提供服务。如果你的应用访问量较大的话,LeanCache 中断的这几秒可能会对你的云引擎实例产生较为明显的影响(例如内存增加),可以考虑将扩容安排在低峰时刻。
缩小容量之前,请务必确认现有数据体积小于目标容量,否则可能造成数据丢失。
管理共享
可以使用控制台上的「管理共享」功能将 LeanCache 实例共享给其他应用,被共享的应用的 LeanCache 页面可能看到这个实例,相关的环境变量也会出现在其他应用的云引擎中。
在云引擎中使用
LeanDB 所在的应用的云引擎在部署时,会被注入几个包含 Redis 连接信息的环境变量,包括:
REDIS_URL_<NAME>
其中 <NAME>
是你在创建 LeanDB 时为它指定的名字,如果你的 LeanDB 名为 MYRDB
的话,就会有名为 REDIS_URL_MYRDB
的环境变量。
- Node.js
- Python
- PHP
- Java
- .NET (C#)
首先添加相关依赖到云引擎应用中:
"dependencies": {
"ioredis": "^4.9.0"
}
然后可以使用下列代码获取 Redis 连接:(假定实例名称为 MYCACHE
)
const Redis = require("ioredis");
const client = new Redis(process.env["REDIS_URL_MYCACHE"]);
client.on("error", function (err) {
return console.error("redis err: ", err);
});
首先添加相关依赖到云引擎应用的 requirements.txt
中:
Flask>=0.10.1
leancloud-sdk>=1.0.9
...
redis
然后可以使用下列代码获取 Redis 连接:(假定实例名称为 MYCACHE
)
import os
import redis
r = redis.from_url(os.environ.get("REDIS_URL_MYCACHE"))
首先添加 redis 库的依赖,比如 predis:
composer require 'predis/predis:1.1.*'
然后在 PHP 应用中通过环境变量获取 Redis 地址并创建链接,如:(假定实例名称为 MYCACHE
)
use Predis;
$redis = new Predis\Client(getenv("REDIS_URL_MYCACHE"));
$redis->ping();
在 pom.xml
中添加 redis client 的依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>