赞
踩
在本博客中,我们将讨论一个使用Redis实现的签到功能的Java示例。该示例包括两个主要方法:sign()
和signCount()
,分别用于用户签到和计算用户当月的签到次数。
sign()
首先,让我们看看sign()
方法:
- @Override
- public Result sign() {
- // 1.获取当前登录用户
- Long userId = UserHolder.getUser().getId();
- // 2.获取日期
- LocalDateTime now = LocalDateTime.now();
- // 3.拼接key
- String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
- String key = USER_SIGN_KEY + userId + keySuffix;
- // 4.获取今天是本月第几天
- int dayOfMonth = now.getDayOfMonth();
- // 5.写入Redis SETBIT key offset 1
- stringRedisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);
- return Result.ok();
- }
signCount()
接下来是signCount()
方法:
- @Override
- public Result signCount() {
- // 1.获取当前登录用户
- Long userId = UserHolder.getUser().getId();
- // 2.获取日期
- LocalDateTime now = LocalDateTime.now();
- // 3.拼接key
- String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
- String key = USER_SIGN_KEY + userId + keySuffix;
- // 4.获取今天是本月第几天
- int dayOfMonth = now.getDayOfMonth();
- // 5.获取本月截止到今天的签到次数
- List<Long> result = stringRedisTemplate.opsForValue().bitField(
- key,
- BitFieldSubCommands.create()
- .get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth))
- .valueAt(0)
- );
-
- if (result == null || result.isEmpty()) {
- return Result.ok(0);
- }
- Long num = result.get(0);
- if (num == null || num == 0) {
- return Result.ok(0);
- }
- // 6.循环遍历
- int count = 0;
- while (true) {
- if ((num & 1) == 0) {
- break;
- } else {
- count++;
- }
- num >>>= 1;
- }
- return Result.ok(count);
- }
通过以上两个方法,我们可以实现用户的签到和签到次数的计算。使用Redis的位操作,可以高效地存储和处理签到记录。这种方法不仅节省了存储空间,还提高了操作的效率,非常适合在高并发的应用场景中使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。