不要根据MemcacheClient的delete结果来决定是否删除数据库记录
来源:互联网 发布:马刺 米尔斯 知乎 编辑:程序博客网 时间:2024/05/08 18:34
今天在给同事做CodeReview时,发现了一个问题。代码大致如下:
public boolean delete(String key){boolean isCacheDeleted = memcachedClient.delete(key);if(isCacheDeleted){ //delete stuffs from DB}//other stuffs}
1.Memcache客户端采用的gwhalin / Memcached-Java-Client v2.6.3:https://github.com/gwhalin/Memcached-Java-Client
2.问题分析:
若对应的key在缓存服务器中已经不存在,或者memCachedClient.get(key)返回值为null,那么delete()方法的返回值为false。试想,如果缓存过期、或被算法逐出、或因故障缓存数据丢失等等情况,这些情况发生时memCachedClient.get(key)都会返回null,memCachedClient.delete(key)都会返回false,所以以上代码块中的delete stuffs from DB分支都无法执行。
所以根据delete的返回值来决定是否进行DB中数据的删除,那么可能会导致DB中的数据在一段时间内甚至永远得到删除,影响数据一致性。
3.改进:
delete之前先get一下,若为null,则认为删除成功。
public boolean delete(String key){boolean isCacheDeleted = false;Object obj = memcachedClient.delete(key);if(obj == null){ isCacheDeleted = true; }else{ isCacheDeleted = memcachedClient.delete(key);}if(isCacheDeleted){ //delete stuffs from DB}//other stuffs....}4.其他
还未来得及看gwhalin / Memcached-Java-Client v2.6.3的源码,如果get为null,delete返回值到底如何处理的,后续再更新
to be continued....
>>>>>>>>>>更新<<<<<<<<<<<
查看MemcachedClient源码public boolean delete( String key, Integer hashCode, Date expiry )部分,当server端返回“NOT_FOUND”时,未做任何处理,最后返回false。
else if ( NOTFOUND.equals( line ) ) {if ( log.isInfoEnabled() )log.info( "++++ deletion of key: " + key + " from cache failed as the key was not found" );}
- 不要根据MemcacheClient的delete结果来决定是否删除数据库记录
- 货架控件根据选择的区域来决定是否格式化显示
- 恢复sqlite数据库中使用delete命令删除的记录
- 你是否真的需要64位的JDK呢?你是根据什么来判断与决定呢?
- 有决定的时候千万不要说出来
- NGUI根据图片是否透明来决定是否可以点中
- 根据qq中是否有人@你,来决定是否调用小黄鸡接口进行自动回复
- 根据radiobutton的选择决定dropdownlist是否禁用
- 表单提交前根据用户的选择决定是否提交
- 表单提交前根据用户的选择决定是否提交
- 根据宽度来决定显示的字符串长度(C#)
- 怎么去证明自己的思想是否正确:按照思想的指引去做事,然后根据结果来判定。
- ttable delete删除记录的问题
- 找回Oracle中Delete删除的记录
- SQL SERVER快速删除数据库表里面的记录,truncate与delete的对比 【转】
- gridview中的自定义删除按钮的 CommandName不要等于“delete”。
- ElasticSearch中根据查询结果删除数据(delete by query)
- 交换排序:根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。
- Oracle知识点总结—scott表结构与简单查询
- 哈希表对字符串的高效处理
- 如何学好3D游戏引擎编程
- Oracle知识点总结—单行函数
- 3D游戏引擎的基本架构
- 不要根据MemcacheClient的delete结果来决定是否删除数据库记录
- 文件压缩
- 十大游戏引擎排名
- Oracle知识点总结—多表查询与统计函数
- Object-C总结摘录
- 一个fork的面试题
- c++计算程序运行时间
- 线程池之预提交work item
- Oracle知识点总结—子查询与数据更新