HyperLogLog

了解Redis这个核心数据类型

心已入冬 提交于 2020-08-13 05:06:16
string 字符串 tring 类型是二进制安全的,即 string 中可以包含任何数据。 Redis 中的普通 string 采用 raw encoding 即原始编码方式,该编码方式会动态扩容,并通过提前预分配冗余空间,来减少内存频繁分配的开销。 在字符串长度小于 1MB 时,按所需长度的 2 倍来分配,超过 1MB,则按照每次额外增加 1MB 的容量来预分配。 Redis 中的数字也存为 string 类型,但编码方式跟普通 string 不同,数字采用整型编码,字符串内容直接设为整数值的二进制字节序列。 在存储普通字符串,序列化对象,以及计数器等场景时,都可以使用 Redis 的字符串类型,字符串数据类型对应使用的指令包括 set、get、mset、incr、decr 等。 list 列表 list 列表,是一个快速双向链表,存储了一系列的 string 类型的字串值 对于常规的 pop、push 元素,性能很高,时间复杂度为 O(1),因为是列表直接追加或弹出。但对于通过随机插入、随机删除,以及随机范围获取,需要轮询列表确定位置,性能就比较低下了。 操作 list 列表时,可以用 lpush、lpop、rpush、rpop、lrange 来进行常规的队列进出及范围获取操作,在某些特殊场景下,也可以用 lset、linsert 进行随机插入操作,用 lrem

玩转Redis-HyperLogLog统计微博日活月活

旧巷老猫 提交于 2020-08-13 03:19:18
《玩转Redis》系列文章主要讲述Redis的基础及中高级应用。本文是《玩转Redis》系列第【9】篇,最新系列文章请前往 公众号“zxiaofan” 查看,或 百度搜索“玩转Redis zxiaofan” 即可。 本文关键字:玩转Redis、微博日活/月活、UV统计、HyperLogLog; 大纲 日活数据统计面临哪些挑战 Bitmaps可用于统计日活吗? 日活数据统计的特点 HyperLogLog介绍 HyperLogLog必知 HyperLogLog和Sets的区别 HyperLogLog如何使用 HyperLogLog命令对比分析 HyperLogLog命令详解 HyperLogLog命令注意事项 HyperLogLog命令示例 HyperLogLog的应用场景 名词解释 DAU(Daily Active User)日活跃用户数量 常用于反映网站、互联网应用或网络游戏的运营情况。DAU通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去除重复登录的用户); 月活跃用户数量(Monthly Active User,MAU) 月活跃用户数量通常统计一个月(统计月)之内,登录或使用了某个产品的用户数(去除重复登录的用户); Note:日活、月活反映用户的活跃度,但是无法反映用户的粘性。 1. 日活数据统计面临哪些挑战   2020年2月26日

美团架构师从应用、原理、集群、拓展、源码等方面深入解析Redis

南笙酒味 提交于 2020-08-11 01:29:38
全书由:基础篇、应用篇、原理篇、集群篇、拓展篇、源码篇六部分组成 总览 由于文档的内容太多,所以只截取了部分内容展示,有想获取完整PDF文档的朋友:点赞后,私信【文档资料】即可(一定要记得关注我,不然没办法回复陌生人私信) 基础篇 Redis基础数据结构 应用篇 分布式锁 延时队列 位图 HyperLogLog 布隆过滤器 简单限流 漏斗限流 GeoHash Scan 原理篇 线程IO模型 通信协议 持久化 管道 事务 PubSub 小对象压缩 主从同步 集群篇 Sentinel Codis Cluster 拓展篇 Stream Info指令 再谈分布式锁 过期策略 LRU 懒惰删除 优雅地使用Jedis 保护Redis Redis安全通信 源码篇 来源: oschina 链接: https://my.oschina.net/u/4338498/blog/4335893

Elasticsearch系列---聚合查询(二)

[亡魂溺海] 提交于 2020-08-08 19:58:54
概要 近似聚合算法 上一篇我们演练的聚合算法,在Elasticsearch分布式场景下,其实是有略微区别的,简单来说我们可以把这些聚合算法分成两类,易并行算法和不易并行算法。 易并行算法 比如max,min,就是多个node或shard可以单独并行计算,并且可以随着机器数的线性增长而横向扩展,没有任何协调操作,得到的结果返回给Coordinate Node时的数据量已经非常小了,像max或min,只需返回给Coordinate Node一个Long值就行。 不易并行算法 没有上述的优势,每个node或shard返回的数据都特别大,节点越多,Coordinate Node处理压力越大,如经典的TOP N问题。 近似算法 针对易并行算法,处理节点分散,结果准确,但针对不易并行算法,ES会采取近似聚合的方式,采用cardinality或percentiles算法,这两个算法近似估计后的结果,不完全准确,误差率约为0.5%,但是速度会很快,一般会达到完全精准的算法的性能的数十倍。 三角选择原则 有点类似于CAP理论,精准、实时、大数据,只能选择其中2个 精准+实时: 数据量小,随便玩 精准+大数据:hadoop,批处理,非实时,可以处理海量数据,保证精准,可能会跑几个小时 大数据+实时:es,不精准,近似估计,可能会有百分之几的错误率 没有什么方案是100%完美的,完美主义在这里不好使。

Redis实用小功能

倾然丶 夕夏残阳落幕 提交于 2020-08-07 19:39:15
慢查询分析 配置slowlog-log-slower-than和slowlog-max-len解决这两个问题,redis会记录超过该阈值的查询日志; 低OPS下设置慢查询10ms、高OPS下设置慢查询1ms 注:Redis慢查询日志仅记录命令执行时间,不包含排队及网络传输时间 redis实用运维命令: redis --bigkeys 对占用内存大的键值对采样 redis --latency 检测网络延时 redis--cli -h …… --latency redis --latency-history 分时段了解延迟 redis --latency-dist 统计图表从控制台输出统计信息 redis --stat 获取增量数据 redis-server --test-memory 检测内存 redis-benchmark redis基准性能测试 pipeline:批处理命令通过减少RTT往返时间,减少网络I/O上的延时。 Redis通过Lua脚本的进行事务增强 Bitmaps(位运算):通过对字符的位进行操作记录某些boolean值,以减少内存空间。 HyperLogLog(基数运算):在极小空间内完成独立总数的统计 来源: oschina 链接: https://my.oschina.net/u/4525941/blog/4348023

Redis如何存储和计算一亿用户的活跃度

亡梦爱人 提交于 2020-07-28 08:25:30
1 前段时间,在网上看到一道面试题: 如何用redis存储统计1亿用户一年的登陆情况,并快速检索任意时间窗口内的活跃用户数量。 觉得很有意思,就仔细想了下 。并做了一系列实验,自己模拟了下 。还是有点收获的,现整理下来。和大家一起分享。 Redis是一个内存数据库,采用单线程和事件驱动的机制来处理网络请求。实际生产的QPS和TPS单台都能达到3,4W,读写性能非常棒。用来存储一些对核心业务弱影响的用户状态信息还是非常不错的。 对于这题,有2个重要的点需要考虑: 1.如何用合适的数据类型来存储1亿用户的数据,用普通的字符串来存储肯定不行。经过查看一个最简单的kv(key为aaa,value为1)的内存占用,发现为48byte。 假设每个用户每天登陆需要占据1对KV的话,那一亿就是(48*100000000)/1024/1024/1024=4.47G。这还是一天的量。 2.如何满足搜索,redis是一个键值对的内存结构,只能根据key来进行定位value值,无法做到像elastic search那样对文档进行倒排索引快速全文检索。 redis其实有这种数据结构的,可以以很少的空间来存储大量的信息。 2 在redis 2.2.0版本之后,新增了一个位图数据,其实它不是一种数据结构。实际上它就是一个一个字符串结构,只不过value是一个二进制数据,每一位只能是0或者1

Redis HyperLogLog用法简介

…衆ロ難τιáo~ 提交于 2020-04-18 03:32:55
(1)HyperLogLog简介 在Redis 在 2.8.9 版本才添加了 HyperLogLog,HyperLogLog算法是用于基数统计的算法,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。HyperLogLog适用于大数据量的统计,因为成本相对来说是更低的,最多也就占用12kb内存 业务场景,HyperLogLog常用于大数据量的统计,比如页面访问量统计或者用户访问量统计 举个例子,假如要统计一个页面的访问量(PV),这个还比较好办,可以直接用redis计数器或者直接存数据库都可以做,然后如果再加需求,现在要统计一个页面的用户访问量(UV),一个用户一天内如果访问多次的话,也只能算一次,这样的话,你可能会想到用SET集合来做,因为SET集合是有去重功能的,key存储页面对应的关键字,value存储对应userId,这种方法是可行,可是访问量一多的话,假如有几千万访问量,那就麻烦了,为了统计一个访问量,要频繁创建SET集合对象 那有其它方法吗?针对上面大访问量的情况,redis是有实现了HyperLogLog算法,HyperLogLog 这个数据结构的发明人 是Philippe Flajolet 教授 Redis集成的HyperLogLog使用语法主要有pfadd和pfcount,顾名思义,一个是来添加数据

redis的HyperLogLog实战

坚强是说给别人听的谎言 提交于 2020-04-18 02:09:12
序 本文主要研究一下redis的HyperLogLog的用场 相关命令 pfadd 每添加一个元素的复杂度为O(1) 127.0.0.1:6379> pfadd uv0907 uid1 uid2 uid3 (integer) 1 添加元素到HyperLogLog中,如果内部有变动返回1,没有返回0 pfcount 作用域单个HyperLogLog时,复杂度为O(1),作用于多个HyperLogLog时,复杂度为O(N) 127.0.0.1:6379> pfcount uv0907 (integer) 3 返回该HyperLogLog的近似基数,如果是指定多个HyperLogLog则返回的是他们的并集的近似基数 pfmerge 复杂度为O(N),N为合并后的HyperLogLog数量 127.0.0.1:6379> pfadd uv0906 uid1 uid4 uid5 (integer) 1 127.0.0.1:6379> pfmerge uv0607 uv0906 uv0907 OK 127.0.0.1:6379> pfcount uv0607 (integer) 5 合并指定的HyperLogLog到新的HyperLogLog中 使用场景 HyperLogLog是Probabilistic data Structures的一种,这类数据结构的基本大的思路就是使用统计概率上的算法

Redis核心原理与应用实践

◇◆丶佛笑我妖孽 提交于 2020-04-16 11:09:16
【推荐阅读】微服务还能火多久?>>> Redis核心原理与应用实践 在很多场景下都会使用Redis,但是到了深层次的时候就了解的不是那么深刻,以至于在面试的时候经常会遇到卡壳的现象,学习知识要做到系统和深入,不要把Redis想象的过于复杂,和Mysql一样,是个读取数据的软件。 有一个理解是Redis是key value缓存服务器,更多的优点在于对value的操作更加丰富。 安装 yum install redis #yum安装 brew install redis # brew安装 redis-cli Redis 基础数据结构 Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。 string (字符串) Redis 的字符串是动态字符串,是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,如图中所示,内部为当前字 符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于 1M 时, 扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是 字符串最大长度为 512M。 键值对 set name codehole get name 批量键值对

redis HLL too many false positives

不羁岁月 提交于 2020-01-14 04:57:16
问题 Hyperlog log is a probablistic algorithm According to the redis HLL document , we could get 0.81% of error but I get errors like 17-20% I think there is something wrong .. This is my simple perl test script. Is there some error #!/usr/bin/perl -w use Redis; my $redis = Redis->new(server=>'192.168.50.166:6379') or die; my $fp=0; my $HLL="HLL"; $redis->del($HLL); foreach my $i (1..10000) { my $s1 = $redis->pfadd($HLL,$i); if($s1 == 0){ print "False positive on $i\n"; $fp++; } } print "count of