问题起源

有一个简单的需求,当用户购买相关的服务后,用户对应的预算热量会采用新的算法进行,服务结束后恢复原来的热量。由于预算热量在各个业务系统中是通用的,内部对用户基础信息做了一层封装,提供了一个gem包去进行写入和读取的操作。

根据上述描述,自己的解决思路如下:

  1. 将用户当前的预算热量暂存到其他地方
  2. 更新用户当前的预算热量

两次操作在gem包中实际上都是使用了redis的hset操作,伪代码如下:

1
2
3
if save_the_old_budget_calorie
  update_the_new_budget_calorie
end

问题所在

当在测试环境中测试时,发现用户的预算热量并没有按照预期设置成功。表现为新用户第一次是可以的,后续就会失败。于是自己就在console中测试了一下,发现了问题所在,save_the_old_budget_calorie方法第一次返回了true值,后续返回了false。因为内部是使用了redis的hset操作,就去查看了相关的文档,发现了问题所在。

  • 1 if field is a new field in the hash and value was set.
  • 0 if field already exists in the hash and the value was updated.

也就是当对应的key已经存在时,就算更新成功了也是返回0值;而对应使用了redis这个gem包将值转换成了boolean值,也就是返回了false。哈,找到了问题,最后修改一下逻辑就解决问题了。