文档中心 云数据库 Memcached 快速入门 使用限制类 标准协议缺陷解决方案说明

标准协议缺陷解决方案说明

最近更新时间:2019-07-22 11:22:50

背景描述

Memcached的标准协议存在部分缺陷,其Get操作没有设计返回码,不能明确说明拉取数据失败的具体情况,所以Memcached API返回NO_DATA时,有可能是网络原因造成的,不能完全信任。

使用如下流程将是非常危险的,将造成用户数据初始化:
if(NO_DATA) InitData();

解决方案

(1)为解决上述问题,开发者在存储数据时,需区分add和set操作

add操作:按照相应的存储数据,只有在该数据不存在时才保存该数据。

set操作:按照相应的存储数据,无论数据是否存在。

在新增数据时必须使用add接口,不能使用set接口,否则会造成用户数据重置,给业务带来损失。

(2)云缓存Memcached还提供了Memcached文本扩展协议(详见云缓存Memcached兼容的协议说明),增加两个扩展的命令get_ext, gets_ext,使客户端可以根据返回码判断数据是否存在。 这样可以避免网络和设备故障时get不到数据而导致用户数据被误初始化。需要注意的是,使用扩展协议需要用户自己修改API来支持。

真实案例

  1. 某业务A没有区分新增和修改,在变更接入层时造成部分连接断连,影响查询,导致初始化了部分用户数据。
  2. 某业务B没有区分新增和修改,在云缓存Memcached设备故障时,查询不到数据,导致初始化了部分用户数据。
  3. 某业务C经常反映部分数据重置的情况,经查证是使用set增加数据,在网络闪断时导致重置数据。
    以上案例均给业务带来极大的伤害和损失,均停止服务数小时进行回滚。因此请开发者务必注意在新增数据时必须使用add接口。