统计活跃用户这个案例非常经典,也是我当时学习redis时,接触到的第一个让我眼睛一亮的使用方式 场景 用户登录后需要记录,以便以后进行登录统计 统计需求主要有: (1)今天的登录用户数 (2)...3天内都登录过的用户 (3)7天内登录过的用户 常规解决方案 如果不用redis,通常做法是在用户登录时记录日志,或者在数据库中添加一条登录记录 然后按照需求进行定时统计 redis解决方案...redis的 bit 操作非常适合处理这个场景 因为bit的值为 0或1,用户是否登录也可以用 0或1 来表示 我们把每天的用户登录信息记录到一个key中,值中的每个offset的值就是用户登录的标识...key1 key2 就是对 key1 key2 各位进行 or 运算后赋值给 ret,结果为 0111 (3)bit值为1的数量 > bitcount key 通过bit操作就可以实现用户统计的需求了...> bitcount userlogin:20160118 (3)统计3天内都登录过的用户 “都登录过”是要取得bit值都为1的,通过 and 计算获取 > bitop or ret userlogin
main() { // 使用 gin 提供 web 服务 r := gin.Default() r.GET("/", func(c *gin.Context) { _redis...:= redisutil.R.Get() // redis pool defer redis.Close() // 用户标识 userId := c.ClientIp...count, _ := redis.Int(_redis.Do("ZCOUNT", "online_user", time.Now().Unix()-5, "+inf")) c.JSON(...:= redisutil.R.Get() // redis pool defer redis.Close() c := Cron.New() c.AddFunc("@every 5s...参考Redis zset 的一些操作命令
前言 我们先思考一个常见的业务问题:如果你负责开发维护一个大型的网站,有一天老板找产品经理要网站每个网页每天的 UV 数据,然后让你来开发这个统计模块,你会如何实现?...统计uv的常用方法以及优缺点 其实要是单纯的统计pv是比较好办的,直接用redis的incr就行,但是uv的话,它要去重,同一个用户一天之内的多次访问请求只能计数一次。...HyperLogLog 这就是本节要引入的一个解决方案,Redis 提供了 HyperLogLog 数据结构就是用来解决这种统计问题的。...HyperLogLog 数据结构是 Redis 的高级数据结构,它非常有用,但是令人感到意外的是,使用过它的人非常少。...使用方法 Redis 的位数组是自动扩展,如果设置了某个偏移位置超出了现有的内容范围,就会自动将位数组进行零扩充。
redis 2.8.9版本就更新了Hyperloglog数据结构! Hyperloglog:基数统计算法!0.81%的错误率,不过统计大量数据可以忽略!...在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。...2、Hyperloglog简介 Redis Hyperloglog 基数统计的算法!...比如在CSDN中一位用户访问多次,但是统计中依旧算作一个人 传统的方式是用set集合把每个人的id保存下来,然后统计元素数量,但是太费内存了,而目标是统计数量,如果还要浪费大量的空间,就很不划算!...优点:占用的内存是固定的,统计2^64这么大的基数,只占用12kb的内存,就很方便!
文章简介 该文将从Redis的角度来总结几种页面访问统计,这里的页面统计是针对某一个具体的页面进行每天的数量统计,后面文章内容涉及到的page_id指的就是页面的独立ID,每一个页面的ID都是不重复的。...我们使用字符串类型进行数量统计。 // 1. 实现某个页面访问统计 // url:$http/api/redis/demo1?...实现某个页面独立用户访问统计(使用set实现) // url:$http/api/redis/demo2?...实现某个页面独立用户访问统计(使用bitmap实现) // url:$http/api/redis/demo3?...实现某个页面独立访问用户统计(使用hyperLogLog实现) // url:$http/api/redis/demo4?
第一个问题其实可以通过计算来估计,如果用户量上亿的话,存储空间也是需要非常大的;第二个问题其实可以通过 Redis、DB 等存储,如 Redis 的Set结构,DB 的唯一键。...上面两种方式虽然可以实现统计网站 UV 的功能,但是一个比较占用内存,一个比较占用数据库资源。那我们该如何规避这两个问题呢?...我们先看一下如何利用HyperLogLog来进行页面 UV 的统计。...统计数量 127.0.0.1:6379> pfcount user # 返回现在数量 (integer) 3 # 再生成一个pfkey 127.0.0.1:6379> pfadd user2 zhangsan2...redisTemplate.opsForHyperLogLog(); return hyperLogLog.add(Key, user); } /** * 统计当前
Spool的开发者博客,描述了Spool利用Redis的bitmaps相关的操作,进行网站活跃用户统计工作。...并且可以通过一些与或运算计算出N天活跃用户,和连接N天活跃用户这样的统计数据。 如下图,第一行表示星期一的活跃用户情况,第二行表示周二的,以此类推。...下面表格表示对应一天,一周,一个月统计时所花费的时间。 ...如果统计的数据还有很多维度,且维度组合有上千种,使用这个方式就不划算。...我们可以借鉴bitmap使用另外的方式来统计活跃留存: 留存的指标: 次日注册留存、 2日注册留存...
但跟原版论文不同的是,好像很多书包括 Redis 作者都把它称为一种 新的数据结构(new datastruct) (算法实现确实需要一种特定的数据结构来实现)。...关于基数统计 基数统计(Cardinality Counting) 通常是用来统计一个集合中不重复的元素个数。...思考这样的一个场景: 如果你负责开发维护一个大型的网站,有一天老板找产品经理要网站上每个网页的 UV(独立访客,每个用户每天只记录一次),然后让你来开发这个统计模块,你会如何实现?
如果一个统计不同用户记录的应用程序运行有多个实例,那么我们需要具有巨大 RAM 大小的内存缓存解决方案。...我们都知道,Redis 有好几种数据结构,比如String、BitMap、Set、Sorted Set等。...Redis Hyperloglog 操作 要进行 Redis Hyperloglog 的操作,我们可以使用以下三个命令: •PFADD•PFCOUNT•PFMERGE 我们用一个实际的例子来解释这些命令...201909281824 201909281825 (integer) 6 由此看来,统计最近一小时我们需要 60 个键,统计最近一天需要 1440 个键,最近 7 天则需要 10080 个键。...的 HyperLoglog 进行数据统计,比如我们要统计从此刻开始往前推一小时、一天、一周的 UV。
聚合统计 统计多个集合元素的聚合结果,包括:统计多个集合的共有元素(交集统计);把两个集合相比,统计其中一个集合独有的元素(差集统计);统计多个集合的所有元素(并集统计);统计每天的新增用户时,我们只用计算每日用户...,会在Redis中生成一个新key,而从库默认是readonly不可写的,所以这些命令只能在主库使用。...不过,在实际应用时,最好对 Bitmap 设置过期时间,让 Redis自动删除不再需要的签到记录,以节省内存开销; 基数统计 基数统计就是指统计一个集合中不重复的元素个数比如统计网页的 UV;HyperLogLog...当数据量非常大时,使用这些统计命令,因为复杂度较高,可能会有阻塞Redis的风险,建议把这些统计数据与在线业务数据拆分开,实例单独部署,防止在做统计操作时影响到在线业务; 聚合计算是CPU密集型任务,Redis...在处理请求时是单线程的,也就是它在做聚合计算时无法利用到多核CPU来提升计算速度,如果计算量太大,这也会导致Redis的响应延迟变长,影响Redis的性能。
问题分析 接口功能虽然简单,但如果是在统计几个淘宝超级卖家的会员点击数的时候,我们如果稍不注意就容易将系统给搞垮。...(如果你的是rocketmq,那么当然首选是它了) 2、使用redis其实也可以实现类似的效果。 2.1、只需要将点击的链接id+ip使用rPush到一个redis的list集合中。...2.2、开启线程定时1min执行一次,获取当前redis的list的llen总长度。 2.3、每次取出最大不超过1w条点击数据进行统计,并批量更新点击数。...2.4、统计完毕后,使用redis管道循环将刚处理完毕的1w条数据弹出lpop即可。 2.5、循环3、4步至到取到llen条点击数。...原理:在你请求的时候,服务器通过redis 记录下你请求的次数,如果次数超过限制就不给访问。在redis 保存的key 是有时效性的,过期就会删除。
Redis的bitmap让我们可以实时的进行类似的统计,并且极其节省空间。...例如,要统计某一天有多少个用户至少听了一个音乐app中的一首歌曲,可以把这个bitmap的redis key设计为play:yyyy-mm-dd-hh。...如果要按周或月统计,只要对这周或这个月的所有bitmap求并集,得出新的bitmap,在对它做位图计数。 ? 利用这些bitmap做其它复杂的统计也非常容易。...Period Time(ms) Daily 50.2 Weekly 392.0 Monthly 1624.8 优化(Optimizations) 前面的例子中,我们把日统计,周统计,月统计缓存到...Redis,以加快统计速度。
需求: 统计页面的当前在线用户统计。.../** * 在线用户统计 * @param uid uid */ //用户在线时间戳 private void onlineUser(int uid) {...; return s.format(now.getTime()); } 存入时间戳的步骤就到这里,之后我们还需要一个定时任务用于自动清除过期的member: //5分钟未操作清除用户在线统计...getOnlineUser() { return redisTemplate.opsForZSet().count("onlineUserCount", -1, 999999); } 以上就是基于redis
二值状态统计 这里的二值状态就是指集合元素的取值就只有 0 和 1 两种。...这是 Redis 提供的扩展数据类型。我来给你解释一下它的实现原理。Bitmap 本身是用 String 类型作为底层数据结构实现的一种统计二值状态的数据类型。...String 类型是会保存为二进制的字节数组,所以,Redis 就把字节数组的每个 bit 位利用起来,用来表示一个元素的二值状态。 你可以把 Bitmap 看作是一个 bit 数组。...Bitmap 还提供了 BITCOUNT 操作,用来统计这个 bit 数组中所有“1”的个数。那么,具体该怎么用 Bitmap 进行签到统计呢?我还是借助一个具体的例子来说明。...不过,在实际应用时,最好对 Bitmap 设置过期时间,让 Redis 自动删除不再需要的签到记录,以节省内存开销。
方便起见的话,可能每搜索一次就往表里插一次数据,用的时候要先统计数据,统计完后再排序,最后才展示。这种情况下,如果搜索量很大的话,表的膨胀速度就会非常快,如果sql没写好,查询的时候估计会。。...相比Redis,同等条件下,Redis的速率肯定是会较优,毕竟是从内存中拿出来的。 下面我们就用.NET Core和StackExchange.Redis来做一下这个简单的案例。...Redis 存储搜索词,用了主从的模式,主写从读 Jquery-ui 主要是用了里面的autocomplete 开始正题之前,我们要确定用Redis中的那种数据结构,五种之中比较合适的应该是SortedSet...无论是新的关键字还是已有的关键字,我们都是要做处理的,当然redis中zincrby命令来处理这个是十分合适的,存在的就把分数加1,不存在就创建一个分数为1的成员。...) { _redis = redis; } public IActionResult Index() {
文章来源:https://url.cn/5tQPEQg 今天来聊一聊拼多多的一道后台面试真题,是一道简单的架构类的题目:拼多多有数亿的用户,那么对于某个网页,怎么使用Redis来统计一个网站的用户访问数呢...使用Hash 哈希是Redis的一种基础数据结构,Redis底层维护的是一个开散列,会把不同的key映射到哈希表上,如果是遇到关键字冲突,那么就会拉出一个链表出来。...当我们要统计某一个网站某一天的访问量的时候,就可以直接使用HLEN来得到最终的结果了。 ? 优点:简单,容易实现,查询也是非常方便,数据准确性非常高。 缺点:占用内存过大,。...最后我们通过BITCOUNT可以统计该网页每天的访问数量。 ?...使用概率算法 对于拼多多这种多个页面都可能非常多访问量的网站,如果所需要的数量不用那么准确,可以使用概率算法,事实上,我们对一个网站的UV的统计,1亿跟1亿零30万其实是差不多的。
使用 Redis 的 HyperLogLog 实现去重计数添加元素:pfadd首先,我们看一下如何向 HyperLogLog 中添加元素。...Redis 提供了 pfadd 命令用于添加元素到 HyperLogLog 中。...合并 HyperLogLog:pfmerge如果我们有多个 HyperLogLog,想要合并它们的统计结果,该怎么做呢?Redis 的 pfmerge 命令能够帮助我们实现这一点。...因此,虽然它在 Redis 中表现为字符串类型,但它用于实现基数统计的功能。小结HyperLogLog 提供了一种非常高效的方式来对大规模数据集进行去重计数。...虽然其结果是估计值,但其高效性和准确度使其在处理大数据统计时表现出色。通过上述的简单示例,相信你已经对 Redis 的 HyperLogLog 有了基本的了解。
今天来聊一聊拼多多的一道后台面试真题,是一道简单的架构类的题目:拼多多有数亿的用户,那么对于某个网页,怎么使用Redis来统计一个网站的用户访问数呢?...使用Hash 哈希是Redis的一种基础数据结构,Redis底层维护的是一个开散列,会把不同的key映射到哈希表上,如果是遇到关键字冲突,那么就会拉出一个链表出来。...当我们要统计某一个网站某一天的访问量的时候,就可以直接使用HLEN来得到最终的结果了。 ? 优点:简单,容易实现,查询也是非常方便,数据准确性非常高。 缺点:占用内存过大,。...最后我们通过BITCOUNT可以统计该网页每天的访问数量。 ?...使用概率算法 对于拼多多这种多个页面都可能非常多访问量的网站,如果所需要的数量不用那么准确,可以使用概率算法,事实上,我们对一个网站的UV的统计,1亿跟1亿零30万其实是差不多的。
使用setBit和bitCount可以实现用户活跃天数的统计,大体的思路如下: 我们网站今天第一天上线,某用户taoshihan,今天有访问那么我就记一下,网站第一天,taoshihan访问1; 网站第二天...,taoshihan访问1;网站第80天,taoshihan访问1;其余时间没有访问过,那么我们统计得出taoshihan活跃天数为3。...使用代码体现为如下,具体解释可以查看视频: https://www.bilibili.com/video/av70912075/ //使用setBit和bitCount实现用户在线天数的统计 $redis...very good" //对字符串二进制位为1的个数进行统计 $redis->set('name','a'); $v=$redis->bitCount('name'); var_dump($v);/...($v);//输出q,二进制为01110001 //使用setBit和bitCount实现用户在线天数的统计 $redis->set("taoshihan",'@');//@符号的二进制形式为 01000000
UPDATED:如果版本够,记得试试 redis-cli 的 bigkeys 选项 如果 MySQL 数据库比较大的话,我们很容易就能查出是哪些表占用的空间;不过如果 Redis 内存比较大的话,我们就不太容易查出是哪些...有一些工具能够提供必要的帮助,比如 redis-rdb-tools 可以直接分析 RDB 文件来生成报告,可惜它不能百分百实现我的需求,而我也不想在它的基础上二次开发。...php $patterns = array( 'foo:.+', 'bar:.+', '.+', ); $redis = new Redis(); $redis->setOption...(Redis::OPT_SCAN, Redis::SCAN_RETRY); $result = array_fill_keys($patterns, 0); while ($keys = $redis...> 当然,前提是你需要提前总结出可能的键模式,简单但不严谨的方法是 MONITOR: shell> /path/to/redis-cli monitor | awk -F '"' '$2
领取专属 10元无门槛券
手把手带您无忧上云