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

简述网站开发的工作流程网站建设的推广渠道

简述网站开发的工作流程,网站建设的推广渠道,怎么自己制作游戏手机版,网站排名靠前怎么做使用 Redis 统计网站 UV 的方法(概率算法) 文章目录 前言思路HyperLogLog 使用 Redis 命令操作使用 Java 代码操作 HyperLogLog 实现原理及特点使用 Java 实现 HyperLogLog小结 前言 网站 UV 就是指网站的独立用户访问量Unique Visitor,即相同用户的多次访问需要…

使用 Redis 统计网站 UV 的方法(概率算法)

文章目录

    • 前言
    • 思路
    • HyperLogLog
      • 使用 Redis 命令操作
      • 使用 Java 代码操作
    • HyperLogLog 实现原理及特点
    • 使用 Java 实现 HyperLogLog
    • 小结

前言

网站 UV 就是指网站的独立用户访问量Unique Visitor,即相同用户的多次访问需要去重。

思路

提到 UV 去重,猜大家都会想到Set集合类。

  • 使用Set集合是一个不错的办法,Set里面存储用户的id。每一个用户访问页面的时候,我们直接把id存入Set,最终获取Setsize即可。问题就是Set的容量需要设置多大呢?如果应用是分布式的,是否需要合并操作?第一个问题其实可以通过计算来估计,如果用户量上亿的话,存储空间也是需要非常大的;第二个问题其实可以通过 Redis、DB 等存储,如 Redis 的Set结构,DB 的唯一键。
  • 我们上面提到的 DB 也是一种解决方案,不过写入量很大时,数据库压力会比较大。用户如果很多,则row也相应的多,且可能需要对每天的数据进行分表。在用户访问量小的情况下,可以采用该处理方式。

上面两种方式虽然可以实现统计网站 UV 的功能,但是一个比较占用内存,一个比较占用数据库资源。那我们该如何规避这两个问题呢?在这里,我们就介绍另外一种实现方法,即使用 Redis 里面的HyperLogLog结构,且仅占用12k的空间。

HyperLogLog

HyperLogLog的使用比较简单,实现略复杂。我们先看一下如何利用HyperLogLog来进行页面 UV 的统计。

使用 Redis 命令操作

# 添加元素
127.0.0.1:6379> pfadd user zhangsan lisi wangwu
# 添加成功返回1,添加失败返回0
(integer) 1
# 统计数量
127.0.0.1:6379> pfcount user
# 返回现在数量
(integer) 3
# 再生成一个pfkey
127.0.0.1:6379> pfadd user2 zhangsan2 lisi2 wangwu
(integer) 1
127.0.0.1:6379> pfcount user2
(integer) 3
# pfmerge会将后面pfkey中的值合并到前面的pfkey中
127.0.0.1:6379> pfmerge user2 user
OK
# 查看merge后的user2
127.0.0.1:6379> pfcount user2
(integer) 5

使用 Java 代码操作

import org.springframework.data.redis.core.HyperLogLogOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class RedisService {@Resourceprivate RedisTemplate < String, String > redisTemplate;/*** 记录用户访问** @param user*/public long statistic(String Key, String user) {HyperLogLogOperations<String,String>hyperLogLog=redisTemplate.opsForHyperLogLog();return hyperLogLog.add(Key, user);}/*** 统计当前 UV** @return*/public long size(String Key) {HyperLogLogOperations<String,String>hyperLogLog=redisTemplate.opsForHyperLogLog();return hyperLogLog.size(Key);}/*** 删除当前 key*/public void clear(String Key) {HyperLogLogOperations < String,String>hyperLogLog=redisTemplate.opsForHyperLogLog();hyperLogLog.delete(Key);}
}

HyperLogLog 实现原理及特点

  • 原理:其实这是个概率问题。举个 Java 的例子,我们每次将一个字符串放入HyperLogLog,其实是把字符串转换成了一个值,可以把它当成hash值,将这个值转换成 2 进制,从后向前看第一个 1 出现的位置。那么 1 出现在第三个位置的时候(xxxx x100),概率是多少呢?(1/2)^3=1/8,也就是大概有八个数字进到这个数据结构时,第一个 1 曾出现在第三个的位置的可能会比较大,所以我们只需要维护一个 1 出现位置的最大值(暂且称之为max position),我们就可以知道整个HyperLogLog数量是多少了。
  • 去重:我们上面讲到hash值,其实整个算法就是将一个固定的value固定的映射成一个数字就可以解决重复的问题了。如zhangsan对应8,那么max position=4,再来一个zhangsan,还是对应8,则max position不变。
  • 特点:因为是概率问题,总会出现不准确的情况,所以你在使用HyperLogLog时,可以将user数量设置大一些,如 100W。但是其结果,有可能你看到的是不到 100W,也有可能计算出来的 UV 还比 100W 大。

使用 Java 实现 HyperLogLog

public class HyperLogLogSelf {static class BitKeeper {private int maxBits;public void random() {// 这里的随机数可以当成一个对象的hashCode。// long value = new Object().hashCode() ^ (2 << 32);long value = ThreadLocalRandom.current().nextLong(2L << 32);int bits = lowZeros(value);if (bits > this.maxBits) {this.maxBits = bits;}}/*** 低位有多少个连续0* 思路上 ≈ 倒数第一个1的位置** @param value* @return*/private int lowZeros(long value) {int i = 1;for (; i < 32; i++) {if (value >> i << i != value) {break;}}return i - 1;}}static class Experiment {private int n;private BitKeeper keeper;public Experiment(int n) {this.n = n;this.keeper = new BitKeeper();}public void work() {for (int i = 0; i < n; i++) {this.keeper.random();}}public void debug() {double v = Math.log(this.n) / Math.log(2);System.out.printf("%d %.2f %d\n", this.n, v, this.keeper.maxBits);}}public static void main(String[] args) {for (int i = 10000; i < 1000000; i += 10000) {Experiment exp = new Experiment(i);exp.work();exp.debug();}}
}

如上述代码所示,如果只有一个BitKeeper,那么精度很难控制,BitKeeper越多,则越精确,所以 Redis 在设置HyperLogLog的时候,设置了16384个桶,也就是2^14,每个桶的maxbits需要 6 个bit来存储,最大可以表示maxbits=63,于是总共占用内存就是2^14 * 6 / 8 = 12k字节。

小结

我们从应用场景开始,讲述了HyperLogLog的使用方法和实现原理,还给出了HyperLogLog的 Java 简单实现。

最后,我们在使用HyperLogLog的时候,需要注意:

  • HyperLogLog需要占用12k内存的(数据量大的时候),所以HyperLogLog不适合单独存储一个user相关的信息;
  • HyperLogLog是有一定精度损失的,可能比真实数量多,也可能比真实数量少,但基本上都在n‰(0<n<10)以内。
http://www.ritt.cn/news/9556.html

相关文章:

  • 网站建设如何做seo整站排名
  • 新公司网站设计注意事项网站安全
  • 咨询网站开发南通seo网站优化软件
  • wordpress注册美化台州网站建设优化
  • 广州建设职业汕头seo
  • wordpress只保留二级目录沧州网站seo公司
  • 淘宝店铺 发布网站建设合肥网站优化seo
  • adobe做网站的是哪个软件职业技能培训班
  • 做牙齿的招聘网站软件开发网站
  • 常州便宜的做网站服务关于进一步优化
  • 微信朋友圈营销技巧常用的seo查询工具有哪些
  • 开发网站实训的心得体会百度竞价排名软件
  • cms企业网站模板黄页推广
  • 上海政府门户网站的建设方案河南省最新通知
  • 网站制作怎样盈利小程序推广的十种方式
  • 哪里有做网站服务谷歌排名推广公司
  • 吉林省 网站建设百度投诉中心电话
  • 青岛建站推广企业新网站seo推广
  • 济宁网站建设公司怎么样最优化方法
  • 方正隶变简体可以做网站用么网站建设详细方案模板
  • wordpress容易被黑吗株洲seo推广
  • 网站建设资料总结百度竞价包年推广公司
  • 建站自学如何制作一个自己的网站
  • 网站友情链接建设网页设计师
  • 微信微博网站建设b站视频推广app
  • 文本网站开发英文文献搜索引擎排名优化方法
  • 石家庄vi设计公司盐城seo推广
  • 设计方案流程百度seo最新算法
  • 做手机网站版面做多宽餐饮管理和营销方案
  • 南通做企业网站bt磁力种子搜索引擎