Redis读写锁和分布式锁的项目实践

queryWrapper = Wrappers.lambdaQuery(ShortLinkDO.class)

                    .eq(ShortLinkDO::getGid, shortLinkGotoDO.getGid())
                    .eq(ShortLinkDO::getFullShortUrl, fullShortUrl)
                    .eq(ShortLinkDO::getEnableStatus, 0);

ShortLinkDO shortLinkDO = baseMapper.selectOne(queryWrapper); //数据库中不存在或者短链接已经过期则跳转404页面

            if (shortLinkDO == null || (shortLinkDO.getValidDate() != null && shortLinkDO.getValidDate().before(new Date()))) {
                //短链接已经过期
                stringRedisTemplate.opsForValue().set(String.format(SHORT_LINK_IS_NULL_KEY, fullShortUrl), "-", 30, TimeUnit.MINUTES);
                resp.sendRedirect("/page/notfound");
                return;
            }

// 缓存原始链接

            stringRedisTemplate.opsForValue().set(String.format(GOTO_SHORT_LINK_KEY, fullShortUrl), shortLinkDO.getOriginUrl());

//预热缓存

            stringRedisTemplate.opsForValue().set(
                    String.format(GOTO_SHORT_LINK_KEY, fullShortUrl),
                    shortLinkDO.getOriginUrl(),
                    LinkUtil.getShortLintCacheValidDate(shortLinkDO.getValidDate()),
                    TimeUnit.MILLISECONDS);

// 访问统计

            shortLinkAccessStats(fullShortUrl, shortLinkDO.getGid(), req, resp);
            // 跳转
            resp.sendRedirect(shortLinkDO.getOriginUrl());
        }
    } finally {
        lock. Unlock();

”`