背景描述
Memcached 标准协议存在部分缺陷,其 Get 操作没有设计返回码,不能明确说明拉取数据失败的具体情况,所以 Memcached API 返回 NO_DATA 时,有可能是网络原因造成的。
注意
使用如下流程将造成用户数据初始化,须谨慎操作:nif(NO_DATA) InitData();
解决方案
1. 为解决上述问题,开发者在存储数据时,需区分 add 和 set 操作:nadd 操作:按照相应的 <key> 存储数据,只有在该数据不存在时才保存该数据。nset 操作:按照相应的 <key> 存储数据,无论数据是否存在。
注意
在新增数据时必须使用 add 接口,不能使用 set 接口,否则会造成用户数据重置,给业务带来损失。
2. 云数据库 Memcached 提供了 Memcached 文本扩展协议,详见 兼容的协议说明,增加两个扩展的命令 get_ext, gets_ext,使客户端可以根据返回码判断数据是否存在。 这样可以避免网络和设备故障时 get 不到数据而导致用户数据被误初始化。需要注意的是,使用扩展协议需要用户自己修改 API 来支持。
案例
1. 某业务 A 没有区分新增和修改,在变更接入层时造成部分连接断连,影响查询,导致初始化了部分用户数据。
2. 某业务 B 没有区分新增和修改,在云数据库 Memcached 设备故障时,查询不到数据,导致初始化了部分用户数据。
3. 某业务 C 经常反映部分数据重置的情况,经查证是使用 set 增加数据,在网络闪断时导致重置数据。n以上案例均给业务带来极大的伤害和损失,均停止服务数小时进行回滚。因此请开发者务必注意在新增数据时必须使用 add 接口。