String value = redisService.get(key); if(StringUtil.isEmpty(value)) { //封装的tryDistributedLock包括setnx和expire两个功能,在低版本的redis中不支持 try{ booleanlocked = redisService.tryDistributedLock(jedis, lockKey, uniqueId, expireTime); if(locked) { value = userService.getById(key); redis...
第一种,先删除缓存在操作数据库: 线程1准备更新数据库的值v=20,先删除缓存, 此时线程2进来, 缓存未命中,查询数据库v=10, 写入缓存v=10, cpu回到线程1继续更新数据库操作,v=20, 导致数据库和缓存不一致. 第二种,先操作数据库在删除缓存: 线程1查询缓存未命中,查询数据库v=10,准备写入缓存,此时线程2进来,...
(1)、如果写数据库的值与更新到缓存值是一样的,不需要经过任何的计算,可以马上更新缓存,但是如果对于那种写数据频繁而读数据少的场景并不合适这种解决方案,因为也许还没有查询就被删除或修改了,这样会浪费时间和资源 (2)、如果写数据库的值与更新缓存的值不一致,写入缓存中的数据需要经过几个表的关联计算后得到...