LeanCache 是为云引擎用户提供的高性能、高可用的内存存储服务。与我们以往的数据存储服务相比,它不仅能够处理更多的并发连接和请求数,极大地提高应用性能,而且还能降低数据存储的使用成本。像秒杀、抢红包、数据量少但读写比例很高等场景都适合使用 LeanCache。

leancache_arch

在云引擎中访问一个容量为 2GB 的 LeanCache 实例,每秒可以处理将近 70,000 次的请求,而一般情况下访问存储服务的请求峰值为 320 次/秒,相差 200 多倍。除了更高的性能,LeanCache 还可以帮助用户节省费用。因为交由 LeanCache 处理的请求不计入存储 API 调用次数,所以用户可以把一些高频率的查询从按 API 调用次数收费的存储服务分流至 LeanCache 上,通过降低总的 API 调用次数来减少费用。

LeanCache 基于 Redis 技术,同时支持缓存数据存储和持久化存储,可以在不中断服务的情况下在线扩容。同时,LeanCache 支持在多个应用之间共享数据,所以如果多个云引擎节点需要协同工作和通信,LeanCache 也是正确的选择。

创建节点

进入 控制台 >(选择应用)> 存储 > 云引擎 > LeanCache,点击 创建节点 来创建新的 LeanCache 节点。如下图所示:

leancache_enter

创建实例时可选参数:

  • 实例名称:最大长度不超过 32 个字符,限英文、数字、下划线,且不能以数字开头。每个开发者账户下 LeanCache 实例名称**必须唯一**,不填则为随机字符串。
  • 最大容量:当前可选的容量大小有:128 MB、256 MB、512 MB、1 GB、2 GB、4 GB、8 GB。
  • 删除策略:内存满时对 key 的删除策略默认为**volatile-lru**(优先删除设定了过期时间的 key 中最近最少使用的 key)。关于删除策略的详细内容请参考 LeanCache 使用指南6

使用

LeanCache 目前仅支持通过云引擎访问。实例创建完毕后,云引擎应用就可以从环境变量中获取 REDIS_URL_<实例名称> 的 Redis 连接字符串,通过该信息连接并使用 LeanCache。

LeanCache 实例在开发者账户内全局可见,并不与某个应用固定绑定。所以在某个应用内创建的 LeanCache 实例,其他应用也一样可以使用。对于某些使用场景,譬如 O2O 行业的用户端和管理端,或者网络租约车平台的乘客端和司机端,需要多个应用共享同一份数据,这一点将会非常有用。

可靠性

LeanCache 实例使用 Redis Master-Slave 主从热备,有多个观察节点每隔 1 秒钟观察一次主节点的状态。如果「主节点」最后一次有效响应在 5 秒之前,则该观察节点认为主节点失效。如果超过总数一半的观察节点发现主节点失效,则自动将「从节点」切换为主节点,并会有新的从节点启动重新组成主从热备。这个过程对应用完全透明,不需要修改连接字符串或者重启,整个切换过程应用只有几秒钟的访问中断。

与此同时,从节点还会以 AOF 方式3 将数据持久化存储到可靠的中央文件中,每秒刷新一次。如果很不巧主从节点同时失效,则马上会有新的 Redis 节点启动,并从 AOF 文件恢复,完成后即可再次提供服务,并且会有新的从节点与之构成主从热备。

价格

LeanCache 服务现在已经上线,我们将从 2015 年 12 月 7 日 开始对它收费。结算方式为按天扣费,使用时间不足一天按一天收费。因为用户可能需要调整容量,所以为了方便计算,我们按照用户当天所使用的「最大容量」来结算,次日凌晨从账户余额中扣款。同时,为了防止 LeanCache 节点被随意创建而浪费不必要的服务器资源,我们要求开发者账户留有足够的余额。

若想了解更多技术细节,请阅读《LeanCache 使用指南27》。

本主题已全局置顶,它将始终显示在它所属分类的顶部。可由职员对所有人解除置顶,或者由用户自己取消置顶。

请问,本地程序改动服务器上的LeanCache数据,这个为什么不能实现?

因为 LeanEngine 和 LeanCache 是通过 TCP 链接,为了安全考虑,我们没有将 LeanCache 的 TCP 直接对公网开放,所以不能从本地直接连接。如果本地使用,建议直接启动一个 redis-server。

然后通过 NODE_ENV 这个环境变量让程序判断自己当前是运行在什么环境,来决定是连接本机的 redis-server 还是 服务端的 LeanCache。

如果是简单的做一些数据操作,可以直接使用命令行工具,这个工具其实是我们使用 http 对 LeanCache 做了包装,只能满足简单的数据操作。

本主题已被解除置顶,它将不再显示在它所属分类的顶部。

我使用的是Python SDK, Python环境下怎么知道是否运行在本地,是这么写么?

if 'LC_APP_ENV' not in os.environ or os.environ['LC_APP_ENV'] == 'development':
    r = redis.StrictRedis()
else:
    r = redis.from_url(os.environ.get('XXXX'))

@frogcjn 这么写没有问题的 👍

另外建议可以在每个分支里加一些打印,防治后续代码出问题时候的拍错。

请问这个与自己在global context里维护一个hash有什么区别?global context的最大内存是多少?

云引擎后续即将推出付费版本,届时最小的规格可以有 512M 的内存,最大的规格可以有 2048M 的内存,你也可以运行多个实例(例如两个 512M 的实例)。

和自己维护一个 Hash Table 比起来,Redis(LeanCache)可以提供的优势包括:

  • 多实例之间的数据共享,云引擎后续可以运行多实例,自行维护的 Hash Table 数据无法在实例中共享
  • 持久化,在程序重启或重新部署后数据不会丢失,Redis 会帮你完成数据持久化的工作,LeanCache 还会为你的 Redis 做热备,具有非常高的可靠性。
  • 原子操作和性能,Redis 提供了常见的数据结构和大量原子的操作符,在文档上清除地列出了每个操作符的时间复杂度,而自行实现的 Hash Table 性能则很大程度地依赖于具体语言的实现(例如 V8 中 Array 其实是以 Hash Map 实现的)。

如何调整catch 删除策略,没看到调整的选项

Cache 的目的就是要快,通过网络在访问云里的 Cache,网络访问这一步因为不是局域网,速度肯定会很慢,何况每秒几千上万次的广域网访问 Cache,不知道云的 Cache 更合适什么场景使用?

LeanCache 是专供云引擎使用的,它们是在同一个私有网络中的(延迟小于一毫秒),额外的性能损耗还是相对较低的。