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> T redisIncrTest() {
        HashMap<String, Object> 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,表示锁已被获取,否则表示锁已被释放。

相关推荐

  1. 网站访问指标

    2023-12-19 05:28:04       54 阅读
  2. 10000访问纪念日

    2023-12-19 05:28:04       58 阅读
  3. 分布式信号Redis

    2023-12-19 05:28:04       56 阅读
  4. Redis实现网站访问人数统计

    2023-12-19 05:28:04       42 阅读
  5. 如何判断网站服务器的访问承载

    2023-12-19 05:28:04       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-19 05:28:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-19 05:28:04       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-19 05:28:04       82 阅读
  4. Python语言-面向对象

    2023-12-19 05:28:04       91 阅读

热门阅读

  1. nginx部署vue项目

    2023-12-19 05:28:04       46 阅读
  2. 【云原生】华为云踩坑日志(更新于2023.12.10)

    2023-12-19 05:28:04       60 阅读
  3. 重构第六章:重构API

    2023-12-19 05:28:04       60 阅读
  4. MySQL5.7忘记root密码

    2023-12-19 05:28:04       61 阅读
  5. kafka安装配置

    2023-12-19 05:28:04       62 阅读
  6. 实现前端指纹登录的简单示例

    2023-12-19 05:28:04       55 阅读
  7. 使用 PHP 中的 Invoke 方法实现灵活而强大的调用

    2023-12-19 05:28:04       55 阅读
  8. 【LeetCode】383. 赎金信(String的遍历)

    2023-12-19 05:28:04       70 阅读
  9. 芯知识 | 什么是音频蓝牙播放语音芯片?

    2023-12-19 05:28:04       70 阅读