Redis之INCR命令,通常用于统计网站访问量,文章访问量,分布式锁

前言

Redis的INCR命令用于将键的值增加1。如果键不存在,则会先将键的值设置为0,然后再执行INCR操作。INCR命令的作用是对计数器进行自增操作,可以用于实现多种场景,比如统计网站访问量、文章访问量、分布式锁等。

一、Redis键之INCR命令

1.INCR 命令

(1)用法:INCR key
(2)作用:将 key 中储存的数字值增一。
(3)返回值:执行 INCR 命令之后 key 的值。
(4)示例

redis> SET PageViewNum 20
OK

redis> INCR PageViewNum
(integer) 21

redis> GET PageViewNum # 数字值在 Redis 中以字符串的形式保存
"21"

二、INCR在Java中的实战运用

private static final long BEGIN_TIMESTAMP = 1701360000; // 开始时间戳:1701360000 -> 2023-12-01 12:00:00
    private static final int COUNT_BITS = 32;

    @Override
    public  T redisIncrTest() {
        HashMap responseObj = new HashMap<>();
        responseObj.put("code", 200);
        responseObj.put("success", true);

        LocalDateTime now = LocalDateTime.now();
        long currentTimestamp = now.toEpochSecond(ZoneOffset.UTC); // 当前时间戳:1702882165
        System.out.println("redisIncrTest :: currentTimestamp -> " + currentTimestamp);

        long dValue = currentTimestamp - BEGIN_TIMESTAMP; // 增长的差值:1551885
        System.out.println("redisIncrTest :: dValue -> " + dValue);

        String date = now.format(DateTimeFormatter.ofPattern("yyyyMMdd")); // 年月日:20231218
        System.out.println("redisIncrTest :: date -> " + date);

        String REDIS_ICR_KEY = "REDIS-INCR" + ":" + date; // REDIS-INCR:20231218
        long count = stringRedisTemplate.opsForValue().increment(REDIS_ICR_KEY); // INCR REDIS-INCR:20231218
        System.out.println("redisIncrTest :: count -> " + count); // 1

        String countStr = stringRedisTemplate.opsForValue().get(REDIS_ICR_KEY);
        System.out.println("redisIncrTest :: countStr -> " + countStr); // 1

        // 说明:
        // (1)|:或,当两个位都为0时,结果才为0,两边都会计算
        // (2)<<:左移,各二进位左移若干位,高位丢弃,低位补零
        // (3)左移一位相当于乘以2,左移32位相当于将某个数乘以2的32次方
        long rs = dValue << COUNT_BITS | count;
        System.out.println(rs);
        System.out.println(dValue << 32);

        responseObj.put("data", rs);
        return (T) responseObj;
    }

三、基于INCR实现的分布式锁思路

INCR命令还可以用于实现分布式锁。我们可以将某个键的值初始化为0,每次获取锁时使用INCR命令将值加1,释放锁时使用DECR命令将值减1。如果值为1,表示锁已被获取,否则表示锁已被释放。

你可能感兴趣的:(#,SpringBoot,#,Redis,Java,redis)