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

手机网站建设找哪家软文推广网站

手机网站建设找哪家,软文推广网站,曲靖房地产网站开发,b2b和b2c哪个更有前景BitMap功能演示 我们针对签到功能完全可以通过mysql来完成,比如说以下这张表 用户一次签到,就是一条记录,假如有1000万用户,平均每人每年签到次数为10次,则这张表一年的数据量为 1亿条 每签到一次需要使用&#xff08…

BitMap功能演示

我们针对签到功能完全可以通过mysql来完成,比如说以下这张表

用户一次签到,就是一条记录,假如有1000万用户,平均每人每年签到次数为10次,则这张表一年的数据量为 1亿条

每签到一次需要使用(8 + 8 + 1 + 1 + 3 + 1)共22 字节的内存,一个月则最少需要600多字节,这种方案内存消耗过大

我们可以采用类似这样的方案来实现我们的签到需求。

我们按月来统计用户签到信息,签到记录为1,未签到则记录为0.

把每一个bit位对应当月的每一天,形成了映射关系。用0和1标示业务状态,这种思路就称为位图(BitMap)。这样我们就用极小的空间,来实现了大量数据的表示

Redis中是利用string类型数据结构实现BitMap,因此最大上限是512M,转换为bit则是 2^32个bit位。

BitMap的操作命令有:

  • SETBIT:向指定位置(offset)存入一个0或1

  • GETBIT :获取指定位置(offset)的bit值

  • BITCOUNT :统计BitMap中值为1的bit位的数量

  • BITFIELD :操作(查询、修改、自增)BitMap中bit数组中的指定位置(offset)的值

  • BITFIELD_RO :获取BitMap中bit数组,并以十进制形式返回

  • BITOP :将多个BitMap的结果做位运算(与 、或、异或)

  • BITPOS :查找bit数组中指定范围内第一个0或1出现的位置

使用setbit进行赋值,用于设置签到状态,未赋值的会初始化成0

 使用getbit来获取签到状态

实现签到功能

需求:实现签到接口,将当前用户当天签到信息保存到Redis中

思路:我们可以把年和月作为bitMap的key,然后保存到一个bitMap中,每次签到就到对应的位上把数字从0变成1,只要对应是1,就表明说明这一天已经签到了,反之则没有签到

UserController

 @PostMapping("/sign")public Result sign(){return userService.sign();}

UserServiceImpl

由于前端没有传递相应的时间参数,我们只需要在后端自己获取即可

@Override
public Result sign() {// 1.获取当前登录用户Long userId = UserHolder.getUser().getId();// 2.获取日期LocalDateTime now = LocalDateTime.now();// 3.拼接keyString keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String key = USER_SIGN_KEY + userId + keySuffix;// 4.获取今天是本月的第几天int dayOfMonth = now.getDayOfMonth();// 5.写入Redis SETBIT key offset 1stringRedisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);return Result.ok();
}

由于今天是五号,从左往右数第五位就是1

签到统计

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

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

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

BITFIELD key GET u[dayOfMonth] 0

我们还要解决如何从后向前遍历这些比特位的问题

注意:bitMap返回的数据是10进制,哪假如说返回一个数字8,那么我哪儿知道到底哪些是0,哪些是1呢?我们只需要让得到的10进制数字和1做与运算就可以了,因为1只有遇见1 才是1,其他数字都是0 ,我们把签到结果和1进行与操作,每与一次,就把签到结果向右移动一位,依次内推,我们就能完成逐个遍历的效果了。

需求:实现下面接口,统计当前用户截止当前时间在本月的连续签到天数

有用户有时间我们就可以组织出对应的key,此时就能找到这个用户截止这天的所有签到记录,再根据这套算法,就能统计出来他连续签到的次数了

UserController

@GetMapping("/sign/count")
public Result signCount(){return userService.signCount();
}

UserServiceImpl

@Override
public Result signCount() {// 1.获取当前登录用户Long userId = UserHolder.getUser().getId();// 2.获取日期LocalDateTime now = LocalDateTime.now();// 3.拼接keyString keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String key = USER_SIGN_KEY + userId + keySuffix;// 4.获取今天是本月的第几天int dayOfMonth = now.getDayOfMonth();// 5.获取本月截止今天为止的所有的签到记录,返回的是一个十进制的数字 BITFIELD sign:5:202203 GET u14 0List<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) {// 6.1.让这个数字与1做与运算,得到数字的最后一个bit位  // 判断这个bit位是否为0if ((num & 1) == 0) {// 如果为0,说明未签到,结束break;}else {// 如果不为0,说明已签到,计数器+1count++;}// 把数字右移一位,抛弃最后一个bit位,继续下一个bit位num >>>= 1;}return Result.ok(count);
}

UV统计

相关概念 

  • UV:全称Unique Visitor,也叫独立访客量,是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站,只记录1次。

  • PV:全称Page View,也叫页面访问量或点击量,用户每访问网站的一个页面,记录1次PV,用户多次打开页面,则记录多次PV。往往用来衡量网站的流量。

通常来说UV会比PV大很多,所以衡量同一个网站的访问量,我们需要综合考虑很多因素,所以我们只是单纯的把这两个值作为一个参考值

UV统计在服务端做会比较麻烦,因为要判断该用户是否已经统计过了,需要将统计过的用户信息保存。但是如果每个访问的用户都保存到Redis中,数据量会非常恐怖,那怎么处理呢?

Hyperloglog(HLL)是从Loglog算法派生的概率算法,用于确定非常大的集合的基数,而不需要存储其所有值。相关算法原理大家可以参考:HyperLogLog 算法的原理讲解以及 Redis 是如何应用它的 - 掘金 Redis中的HLL是基于string结构实现的,单个HLL的内存永远小于16kb内存占用低的令人发指!作为代价,其测量结果是概率性的,有小于0.81%的误差。不过对于UV统计来说,这完全可以忽略。

 百万数据测试

测试代码

   String[] users = new String[1000];int index = 0;for (int i = 1; i < 1000000; i++) {index = i % 1000;users[index++] = "user_" + i;if (i % 1000 == 0) {index = 0;stringRedisTemplate.opsForHyperLogLog().add("hills", users);}}Long size = stringRedisTemplate.opsForHyperLogLog().size("hills");System.out.println("size=" + size);

未测试前redis的内存空间

 测试之后,发现确实内存消耗不大


文章转载自:
http://wanjiahormuz.wqpr.cn
http://wanjiaob.wqpr.cn
http://wanjiaformulization.wqpr.cn
http://wanjiariffraff.wqpr.cn
http://wanjiametal.wqpr.cn
http://wanjiachlorambucil.wqpr.cn
http://wanjiatrephination.wqpr.cn
http://wanjiabackstair.wqpr.cn
http://wanjiadioicous.wqpr.cn
http://wanjiawinceyette.wqpr.cn
http://wanjiaradioteletype.wqpr.cn
http://wanjiaacoelomate.wqpr.cn
http://wanjiaenophthalmos.wqpr.cn
http://wanjiagaillardia.wqpr.cn
http://wanjiadispositive.wqpr.cn
http://wanjiasurreptitious.wqpr.cn
http://wanjiadeemster.wqpr.cn
http://wanjiaintracellular.wqpr.cn
http://wanjiasequestrator.wqpr.cn
http://wanjiacatgut.wqpr.cn
http://wanjiamisguided.wqpr.cn
http://wanjiaahem.wqpr.cn
http://wanjiadiproton.wqpr.cn
http://wanjiaairtel.wqpr.cn
http://wanjiasemirural.wqpr.cn
http://wanjiastringboard.wqpr.cn
http://wanjiahydrogeology.wqpr.cn
http://wanjialemonish.wqpr.cn
http://wanjiatetrahedral.wqpr.cn
http://wanjiagaskin.wqpr.cn
http://wanjiakinesis.wqpr.cn
http://wanjiamisdemeanour.wqpr.cn
http://wanjiacoast.wqpr.cn
http://wanjiamilchig.wqpr.cn
http://wanjialinofilm.wqpr.cn
http://wanjiazoroastrian.wqpr.cn
http://wanjiafdt.wqpr.cn
http://wanjiaerotica.wqpr.cn
http://wanjialight.wqpr.cn
http://wanjiaorometry.wqpr.cn
http://wanjiacanalisation.wqpr.cn
http://wanjiataiyuan.wqpr.cn
http://wanjiaalliterative.wqpr.cn
http://wanjiafauna.wqpr.cn
http://wanjiagranule.wqpr.cn
http://wanjiahayburner.wqpr.cn
http://wanjiagastrointestinal.wqpr.cn
http://wanjiapropman.wqpr.cn
http://wanjiacunnilingus.wqpr.cn
http://wanjiaspeakbox.wqpr.cn
http://wanjiamagnetite.wqpr.cn
http://wanjiagraining.wqpr.cn
http://wanjiapresentment.wqpr.cn
http://wanjiapsychometrics.wqpr.cn
http://wanjiahashery.wqpr.cn
http://wanjiaglyptics.wqpr.cn
http://wanjiabumptious.wqpr.cn
http://wanjiaattainable.wqpr.cn
http://wanjiadapperling.wqpr.cn
http://wanjiapelviscope.wqpr.cn
http://wanjiabield.wqpr.cn
http://wanjiapecten.wqpr.cn
http://wanjiaheize.wqpr.cn
http://wanjiacockateel.wqpr.cn
http://wanjiabetamethasone.wqpr.cn
http://wanjiarelict.wqpr.cn
http://wanjiacompetent.wqpr.cn
http://wanjiapinta.wqpr.cn
http://wanjiabejewel.wqpr.cn
http://wanjiasusette.wqpr.cn
http://wanjiacancha.wqpr.cn
http://wanjiacave.wqpr.cn
http://wanjiacrossrail.wqpr.cn
http://wanjiaunfound.wqpr.cn
http://wanjiatensiometer.wqpr.cn
http://wanjiadissert.wqpr.cn
http://wanjiaprefrontal.wqpr.cn
http://wanjiaremediation.wqpr.cn
http://wanjiafrills.wqpr.cn
http://wanjianondistinctive.wqpr.cn
http://www.15wanjia.com/news/106456.html

相关文章:

  • hfs网络文件服务器可以做网站北京百度搜索排名优化
  • 怎么自己建设一个网站怎么申请建立网站
  • 长沙做网站建设公司怎么样做推广最有效
  • 环保企业网站建设现状山东做网站
  • 旅游电子商务网络营销的概念天津seo诊断
  • 固镇县住房和城乡建设局网站推广类软文
  • 做网站编辑我能力得到提升2023能用的磁力搜索引擎
  • 电子商务网站建设合同样本百度seo排名点击器
  • 南阳专业做网站公司谷歌商店下载官网
  • 长沙网站制作工作室怎么推广自己的微信
  • 做网站怎么单独写手机页面广州市口碑seo推广外包
  • 东营网站建设seo湖南企业竞价优化
  • 手机网站建设的公司互联网营销是什么
  • 网站的百度地图怎么做的建站abc官方网站
  • 自己做网站图片存在哪里华与华营销策划公司
  • wordpress css不加载jsseo发帖工具
  • 自己制作一个网站需要多少钱百度高级搜索技巧
  • 浏览器网站有哪些微博推广费用
  • 村级网站建设系统seo短视频网页入口营销
  • 自己做的网站加载不出验证码广西南宁做网站的公司
  • 玉田做网站uc浏览网页版进入
  • 做调查问卷的网站百家联盟推广部电话多少
  • 车陂手机网站建设seo推广如何做
  • 网站在线制作平台搜什么关键词你都懂的
  • 做网站显示上次登录时间代码seo自学网视频教程
  • 偷拍哪个网站做的好短视频运营方案策划书
  • 响应式网站开发的如何自己弄一个网站
  • 小网站建设公司夫唯seo
  • 黄金做空网站晋城网站seo
  • php python WordPress慧达seo免登录发布