当前位置:   article > 正文

使用Redis实现签到功能:Java示例解析

使用Redis实现签到功能:Java示例解析

使用Redis实现签到功能:Java示例解析

在本博客中,我们将讨论一个使用Redis实现的签到功能的Java示例。该示例包括两个主要方法:sign()signCount(),分别用于用户签到和计算用户当月的签到次数。

1. 签到方法:sign()

首先,让我们看看sign()方法:

  1. @Override
  2. public Result sign() {
  3. // 1.获取当前登录用户
  4. Long userId = UserHolder.getUser().getId();
  5. // 2.获取日期
  6. LocalDateTime now = LocalDateTime.now();
  7. // 3.拼接key
  8. String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
  9. String key = USER_SIGN_KEY + userId + keySuffix;
  10. // 4.获取今天是本月第几天
  11. int dayOfMonth = now.getDayOfMonth();
  12. // 5.写入Redis SETBIT key offset 1
  13. stringRedisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);
  14. return Result.ok();
  15. }
2. 计算签到次数方法:signCount()

接下来是signCount()方法:

  1. @Override
  2. public Result signCount() {
  3. // 1.获取当前登录用户
  4. Long userId = UserHolder.getUser().getId();
  5. // 2.获取日期
  6. LocalDateTime now = LocalDateTime.now();
  7. // 3.拼接key
  8. String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
  9. String key = USER_SIGN_KEY + userId + keySuffix;
  10. // 4.获取今天是本月第几天
  11. int dayOfMonth = now.getDayOfMonth();
  12. // 5.获取本月截止到今天的签到次数
  13. List<Long> result = stringRedisTemplate.opsForValue().bitField(
  14. key,
  15. BitFieldSubCommands.create()
  16. .get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth))
  17. .valueAt(0)
  18. );
  19. if (result == null || result.isEmpty()) {
  20. return Result.ok(0);
  21. }
  22. Long num = result.get(0);
  23. if (num == null || num == 0) {
  24. return Result.ok(0);
  25. }
  26. // 6.循环遍历
  27. int count = 0;
  28. while (true) {
  29. if ((num & 1) == 0) {
  30. break;
  31. } else {
  32. count++;
  33. }
  34. num >>>= 1;
  35. }
  36. return Result.ok(count);
  37. }
总结

通过以上两个方法,我们可以实现用户的签到和签到次数的计算。使用Redis的位操作,可以高效地存储和处理签到记录。这种方法不仅节省了存储空间,还提高了操作的效率,非常适合在高并发的应用场景中使用。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号