当前位置: 首页 > news >正文

互联网网站建设门户网网页ui设计的排版

互联网网站建设门户网,网页ui设计的排版,大搜推广,大型网络游戏排行榜前十名思路分析 我们可以把 年和月 作为BitMap的key,然后保存到一个BitMap中,每次签到就到对应的位上把数字从0 变为1,只要是1,就代表是这一天签到了,反之咋没有签到。 关键问题 问题一: 什么叫做连续签到天数…

思路分析

我们可以把 年和月 作为BitMap的key,然后保存到一个BitMap中,每次签到就到对应的位上把数字从0 变为1,只要是1,就代表是这一天签到了,反之咋没有签到。

关键问题

问题一: 什么叫做连续签到天数?

从最后一次签到开始向前统计,直到遇到第一次未签到为止,计算总的签到次数,就是连续签到天数。

获得当前这个月的最后一次签到数据,定义一个计数器,然后不停的向前统计,直到获得第一个非0的数字即可,每得到一个非0的数字计数器+1,直到遍历完所有的数据,就可以获得当前月的签到总天数了

问题二: 如何得到本月到今天为止的所有签到数据?

BITFIELD key GET u[dayOfMonth] 0

假设今天是7号,那么我们就可以从当前月的第一天开始,获得到当前这一天的位数,是7号,那么就是7位,去拿这段时间的数据,就能拿到所有的数据了,那么这7天里边签到了多少次呢?统计有多少个1即可。

问题三:如何从后向前遍历每个Bit位?

注意:bitMap返回的数据是10进制,哪假如说返回一个数字8,那么我哪儿知道到底哪些是0,哪些是1呢?

我们只需要让得到的10进制数字和1做与运算就可以了,因为1只有遇见1 才是1,其他数字都是0 ,我们把签到结果和1进行与操作,每与一次,就把签到结果向右移动一位,依次内推,我们就能完成逐个遍历的效果了。

核心代码逻辑

接下来,我们创建一个签到服务来管理用户的签到逻辑。假设用户 ID 是一个字符串,签到日期则用位图的位置来表示。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;@Service
public class SignInService {private static final String SIGN_KEY_PREFIX = "sign:";private RedisTemplate<String, Object> redisTemplate;@Autowiredpublic SignInService(RedisTemplate<String, Object> redisTemplate) {this.redisTemplate = redisTemplate;}// 用户签到方法public void sign() {//1. 获取登录用户Long userId = UserHolder.getUser().getId();//2. 获取日期LocalDateTime now = LocalDateTime.now();//3. 拼接keyString keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String key = RedisConstants.USER_SIGN_KEY + userId + keySuffix;//4. 获取今天是本月的第几天int dayOfMonth = now.getDayOfMonth();//5. 写入redis setbit key offset 1redisTemplate.opsForValue().setBit(key, dayOfMonth -1, true);
}// 获取用户当月签到数据public boolean[] getCurrentMonthSignInData(String userId) {String key = SIGN_KEY_PREFIX + userId;LocalDate today = LocalDate.now();int daysInMonth = today.lengthOfMonth();boolean[] signData = new boolean[daysInMonth];for (int day = 0; day < daysInMonth; day++) {signData[day] = redisTemplate.opsForValue().getBit(key, day);}return signData;}public int signCount() {//1. 获取登录用户Long userId = UserHolder.getUser().getId();//2. 获取日期LocalDateTime now = LocalDateTime.now();//3. 拼接keyString keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String key = RedisConstants.USER_SIGN_KEY + userId + keySuffix;//4. 获取今天是本月的第几天int dayOfMonth = now.getDayOfMonth();//5. 获取本月截至今天为止的所有的签到记录,返回的是一个十进制的数字 BITFIELD sign:5:202301 GET u3 0List<Long> result = redisTemplate.opsForValue().bitField(key,BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0));//没有任务签到结果if (result == null || result.isEmpty()) {return 0;}Long num = result.get(0);if (num == null || num == 0) {return 0;}//6. 循环遍历int count = 0;while (true) {//6.1 让这个数字与1 做与运算,得到数字的最后一个bit位 判断这个数字是否为0if ((num & 1) == 0) {//如果为0,签到结束break;} else {count ++;}num >>>= 1;}return count;}// 获取用户当月签到总数public long getTotalSignInDays(String userId) {String key = SIGN_KEY_PREFIX + userId;LocalDate today = LocalDate.now();// 计算今天是当月的第几天int daysInMonth = today.getDayOfMonth();return redisTemplate.opsForValue().bitCount(key, 0, daysInMonth - 1);}
}

http://www.dtcms.com/a/518769.html

相关文章:

  • 做养生网站需要资质吗途牛网站开发需求
  • 电子商务网站建设与管理的总结建设官网站
  • 南昌网站建设一般多少钱一年产品关键词大全
  • 网站的推广费用票可以做抵扣吗网站二级域名解析
  • 虚拟空间做网站建站系统哪个比较好
  • 本机网站建设wordpress菜单高亮
  • 如何成为网站开发工程师微商城 分销平台
  • 上海市建设安装协会网站网站规划与网页设计案例
  • wap站开发海口网站制作案例
  • 江苏广泽建设公司网站网站建设与维护一年多少钱
  • 杭州 洛阳网站建设公司 网络服务坑梓网站建设包括哪些
  • 企业开发网站建设仁怀市城乡建设网站
  • 宁波网站建设网站排名优化开发建设网站需要什么人才
  • 自己如何做网站源码网站建设的内容
  • 中国建设会计学会网站农家院网站素材
  • 撰写网站建设技术解决方案软件工程专业学校排名
  • 重庆网站开发价格宝塔wordpress安装页面打不开
  • 网站建设网页无锡做网站公司费用价格
  • 网站设计 评价 方法广州网页制作步骤
  • 商业网站开发 流程网站推广服务具体内容包括哪些
  • 网站建设中如何设置外链接我的网站突然打不开了怎么回事啊
  • 喜满堂网站建设银行官网登录入口
  • 精仿腾讯3366小游戏门户网站源码织梦最新内核带全部数据!网站在线压缩
  • 帝国建站模板地接做的网站
  • 做企业网站需要什么资料互联网站开发
  • 58网站 做现浇混凝土白山市住房和城乡建设局网站
  • 网站内链有什么用商城网站建设需要什么团队
  • 男朋友抱着我在教室做网站wordpress动
  • 常用的网站推广方法什么是网站建设策划
  • 有没有那个网站是做点心的wordpress站点统计代码