皆非的万事屋

通过Redis的自增set实现“乐观锁”,从而控制并发

[scode type="blue"]这还要从项目提出的静默签到开始讲起[/scode]

//如果缓存里没有
if (!redisUtils.hasKey(key)) {
    //写入数据库 ...
    //写入缓存,第二天凌晨过期
    redisUtils.set(key, value, DateUtil.getTomorrowSeconds(new Date()));
}

[scode type="blue"]通过redis的自增set做乐观锁[/scode]

    /**
     * 缓存自增放入(乐观锁)
     *
     * @param key   键
     * @param value 自增大小(Long)
     * @return 返回已增长度
     */
    public Long setnc(String key, Object value) {
        try {
            return redisTemplate.opsForValue().increment(key, (Long)value);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return 0L;
        }
    }
       //如果自增长度小于等于1(只有第一次,后面的都会越来越大)
       if (redisUtils.setnc(key, 1L) <= 1L) {
            //存入数据库...
            //设置过期时间
            redisUtils.expire(SIGN_KEY + userId, DateUtil.getTomorrowSeconds(new Date()));
        }

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »