网上提到Memcache的一种使用场景,缓存sql查询结果,具体操作时将sql语句的md5值作为key,查询结果作为value放到Memcache中,但是如果此时数据库涉及该sql语句的表数据有了更新,该如果更新缓存中的值?
这种根据sql语句md5的方式现在已经很少用了,原因就是查询与更新可能在两个不同的业务情景中,
你总不能在更新数据的同时把查询用到所有sql整理出来再计算md5后重新set吧?
如果不想这样么干,比较好的做法就是设置一个短点的时效时间,比如60秒,利用过期策略去更新数据,
但是问题也很明显
第一个是缓冲穿透
第二个是数据一致性问题
现在比较常见的做法是根据查询条件加表名等来作为key 这样的一个key-value只保存一条记录 比如 key为usertable_id_1保存user_id为1的用户信息
后台更新操作的时候也是根据查询字断user_id来更新的 这个时候根据user_id就可以直接得到需要更改的缓存key 直接去修改即可 但这样也有问题,
1是数据库中的key会非常非常多 保存key也需要内存 key:value = 1:1 所以实际存储数据的空间只能占到一半
2.创建key的规则需要定义好 保证多张表的规则不冲突 而且在分表情况下处理会很麻烦
不变的数据(比如字典表,配置参数表等)可以缓存;
相对稳定的数据,也可以考虑缓存(加个比较长的有效时间),时效期到了就重新查询数据库;
如果经常变化的数据就没必要缓存了;