官方给出的数据是 10 万次 ops 的读写,这主要归功于这些数据都存在于内存中。...同时一个 Redis 只是一个单线程,其真正的原因还是因为单线程在内存中是效率最高的。 持久化。Redis 的持久化可以保证将内存中的数据每隔一段时间就保存于磁盘中,重启的时候会再次加载到内存。...上面是一些 Redis 介绍性的内容,如果你还没有接触过 Redis,但又对此有兴趣的话,这里有适合工作实战的教程。 如果已经开始用到 Redis,那么你在应用过程中是否也遇到过下面的这些问题?...登录 Redis 出现提示,要求密码 NOAUTH Authentication required 有什么办法可以免密登录? 有没有在生产环境下用 Redis 做持久化存储的例子?...假如内存 8G 的话,Redis 既然是运行在内存中,那 Redis 最大能存多大数据? 熟练使用和运维 Redis 已经成为开发人员的一个必备技能。
HyperLogLog是一种基数估计算法。在理解技术估计算法之前,我们需要先知道基数计数法的概念(有没有感觉读书的时候似曾相识)。...要实现基数计数,最简单的做法是记录集合中所有不重复的元素集合Su,当新来一个元素xi,若Su中不包含元素xi,则将xi加入Su,否则不加入,计数值就是Su的元素数量。...这种做法存在两个问题: 1、当统计的数据量变大时,相应的存储内存也会线性增长(文章开始用hashmap技术的办法就有这个问题) 2、当集合Su变大,判断其是否包含新加入元素xi的成本变大 大数据量背景下...除了hashmap,另一个容易被想到的办法是位图BitMap。位图可以快速、准确地获取一个给定输入的基数。位图的基本思想是使用哈希函数把数据集映射到一个bit位,每个输入元素与bit位是一一对应。...文章用三种不同的计算方法统计所有莎士比亚作品中不同单词的数量。请注意,我们的输入数据集增加了额外的数据以致比问题的参考基数更高。
一、布隆过滤器简介 上一次 我们学会了使用 HyperLogLog 来对大数据进行一个估算,它非常有价值,可以解决很多精确度不高的统计需求。...但是如果我们想知道某一个值是不是已经在 HyperLogLog 结构里面了,它就无能为力了,它只提供了 pfadd 和 pfcount 方法,没有提供类似于 contains 的这种方法。...爬虫/ 邮箱等系统的过滤:平时不知道你有没有注意到有一些正常的邮件也会被放进垃圾邮件目录中,这就是使用布隆过滤器 误判 导致的。...函数进行运算,查看 对应的位置 是否 都 为 1,只要有一个位为 0,那么说明布隆过滤器中这个 key 不存在。...,当 mightContain() 方法返回 true 时,我们可以 99% 确定该元素在过滤器中,当过滤器返回 false 时,我们可以 100% 确定该元素不存在于过滤器中。
在日常的工作中,大部分情况下我们是走离线大数据那一套东西,将数据通过 kafka 等发送,之后导入 hive, 从 hive 中用 distinct来查找。 有没有别的方法呢?...通常计算惟一项需要使用与要计算的项数量成比例的内存,因为您需要记住在过去已经看到的元素,以避免重复计算它们。然而,有一组算法用内存交换精度:以一个标准误差的估计度量。...最坏的情况是 12k 字节,如果您的 HyperLogLog(我们现在就称它们为 HLL) 只有很少的元素,消耗的内存也会少很多。...说人话就是:HyperLogLog 是一个内存消耗极少的,统计唯一值的计数器,可以将它理解为内存消耗极少的 Set. 因为它不会记住每一个元素的实际值。....但是它的实现却很精巧,在正常情况下,我们想要实现去重功能,需要一个 Set 来保存所有已有的元素,否则我们无从知道新的元素是否已经出现过。
HyperLogLog算法中每个桶所占用的空间实际上只有 6 个 bit,这 6 个 bit 自然是无法容纳桶中所有元素的,它记录的是桶中元素数量的对数值。...我们知道一个HyperLogLog实际占用的空间大约是 13684 * 6bit / 8 = 12k 字节。但是在计数比较小的时候,大多数桶的计数值都是零。...所以 Redis 使用了一个额外的字段来缓存总计数值,这个字段有 64bit,最高位如果为 1 表示该值是否已经过期,如果为 0, 那么剩下的 63bit 就是计数值。...,因为它需要检查对象头魔术字符串是否是 "HYLL"。...golang (integer) 1 也许你会感觉非常奇怪,这是因为 HyperLogLog 在执行指令前需要对内容进行格式检查,这个检查就是查看对象头的 magic 魔术字符串是否是 "HYLL"
Redis的set:它可以去除重复元素,也可以快速判断某一个元素是否存在于集合中,如果元素很多(比如上亿的计数),占用内存很大。...Redis的bit:它可以用来实现比set内存高度压缩的计数,它通过一个bit设置为1或者0,表示存储某个元素是否存在信息。...HyperLogLog:实现超大数据量精确的唯一计数都是比较困难的,HyperLogLog可以仅仅使用 12 k左右的内存,实现上亿的唯一计数,而且误差控制在百分之一左右。...bloomfilter布隆过滤器:布隆过滤器是一种占用空间很小的数据结构,它由一个很长的二进制向量和一组Hash映射函数组成,它用于检索一个元素是否在一个集合中 对于布隆过滤器,大家有兴趣可以看我这篇文章哈...比如想把内存中的对象状态保存到一个文件中或者数据库中的时候(最常用,如保存到redis); 再比喻想用套接字在网络上传送对象的时候,都需要序列化。
什么是HyperLogLog HyperLogLog命令 Redis 面试七连问 redis的通讯协议是什么 redis究竟有没有ACID事务 redis的乐观锁watch是怎么实现的?...通俗的说就是支持集合中不重复元素的统计。...常规基数计算需要准备一块内存空间用于存储已经计数的元素,避免某些元素被重复统计。Redis提供了一种用精度来换取内存空间的算法,标准误差低于1%。...仅需要12K 就能完成统计(再加上HLL自身所需的一点bytes),如果HyperLogLog中的元素较少,所需内存空间更小。HyperLogLogs的标准误差是0.81%。...惰性删除: 放任键过期不管,但是每次从键空间获取键时,都会检查该键是否过期,如果过期的话,就删除该键。
HyperLogLog 虽然强大,但是由于没有提供类似 SISMEMBER 之类的包含判断指令,所以无法实现判断某个元素是否在 HyperLogLog 中的功能,对于一些海量信息的过滤处理,比如从推荐文章中去除已读文章...那 Redis 是否为此提供了确保高性能的同时又减少存储空间的解决方案呢? 还真有,对于这种去重场景,我们可以使用布隆过滤器来解决,它可以用于判断某个元素是否存在于指定集合中。...布隆过滤器的基本使用和底层实现 基本使用 我们可以通过 bf.add 指令添加元素到集合,使用 bf.exists 检查元素是否存在: 当然,也可以通过 bf.madd 指令批量添加元素到集合,然后使用...bf.mexists 检查多个元素是否存在: 要删除布隆管理器集合,使用 Redis DEL 指令即可。...因此,布隆过滤器非常适用于做海量数据的去重,比如一个爬虫系统,需要爬取数百万乃至上千万甚至上亿的链接,当拿到一个链接进行爬取前,先要判断这个链接是否已经爬取过,如果没有才进行爬取,以免浪费系统资源,通过布隆过滤器很容易实现这个功能
(大多数网站架构的选择) Java中Collection和Collections的区别 1、java.util.Collection 是一个集合接口(集合类的一个顶级接口)。...current_timestamp> 通过使用 ZSCORE 命令检查指定的用户 ID 在有序集合中是否有相关联的分值, 我们可以知道该用户是否在线: ZSCORE "online_users" <user_id...在这种情况下, 每当一个用户上线时, 我们就执行以下 SADD 命令, 将它添加到在线用户名单当中: SADD "online_users" 通过使用 SISMEMBER 命令, 我们可以检查一个指定的用户当前是否在线...在需要尽可能地节约内存并且只需要知道在线用户数量的情况下, 我们可以使用 HyperLogLog 来对在线用户进行统计: HyperLogLog 是一个概率算法, 它可以对元素的基数进行估算, 并且每个...> 1 通过使用 GETBIT 命令去检查一个二进制位的值是否为 1 , 我们可以知道指定的用户是否在线: GETBIT "online_users" 而通过 BITCOUNT 命令
使用Set集合是一个不错的办法,Set里面存储用户的id。每一个用户访问页面的时候,我们直接把id存入Set,最终获取Set的size即可。问题就是Set的容量需要设置多大呢?...如果应用是分布式的,是否需要合并操作?...举个 Java 的例子,我们每次将一个字符串放入HyperLogLog,其实是把字符串转换成了一个值,可以把它当成hash值,将这个值转换成 2 进制,从后向前看第一个 1 出现的位置。...小结 我们从应用场景开始,讲述了HyperLogLog的使用方法和实现原理,还给出了HyperLogLog的 Java 简单实现。...最后,我们在使用HyperLogLog的时候,需要注意: HyperLogLog需要占用12k内存的(数据量大的时候),所以HyperLogLog不适合单独存储一个user相关的信息; HyperLogLog
,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示我们上面例子里面的用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统,上面我说的几个场景也就能够实现...DUMP key //检查给定 key 是否存在 exists keyname //设置key的过期时间 expire keyname seconds //返回key的类型 type key...差集 sinter 交集 sunion 并集 删除集合中元素,判断是否在集合中 spop 移除并返回 sismember key member 判断一个元素是否在集合中 sorted set 相关...不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。...因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
为了在实时统计的情况下保持精准度,我们需要知道某一个用户之前是否浏览过一篇文章,所以我们需要为每一篇文章存储浏览过它的用户的集合,并且在每次新增浏览时检查该集合进行去重复操作。...尤其是该文章变成了热门文章,阅读数迅速增长,有些受欢迎的文章的阅读者数量超过百万级别,想象一下维护一个超过百万的unqine userId的集合在内存中的,还有经受住不断的查询,集合中的用户是否存在。...该种实现方式的细节请参阅论文(Google’s HyperLogLog++ paper) HLL算法的实现是相当标准的,这里有三种不同的实现方式,要注意的是,基于内存存储方案的HLL,这里我们只考虑Java...stream-lib库中的HyperLogLog++实现,Java编写。 stream-lib代码的文档化做的很好,但我们对如何适当调优它,还是有些困惑的。...中处理的)来判断这个事件是否算做一次计数,如果事件被计数,Abacus会首先检查这个事件中文章的HLL计数是否存在于Redis中,如果存在,Abacus会发送一个PFADD请求给Redis,如果不存在,
HyperLogLog 只会根据输入的元素来统计基数,而不会存储输入的元素,因此相比于 Set 集合类型,它不会出现元素越多占用内存多大的情况,但是它也不能像 Set 类型一样返回输入的元素。...1.2 HyperLogLog 命令 PFADD key element1 [element2]:向 HyperLogLog 键 key 中添加一个或多个元素。...比如我们使用微信时,消息未发送成功会有红色感叹号提醒,发出去的消息在短时间内仍可以撤回,对方上线后仍可以接收到消息,但 Redis 无法实现这些功能,它无法判断消息是否被接受了还是在传输过程中丢失了。...:通过 SHA1 校验和判断指定脚本是否被保存在缓存中。...复用性:客户端发送的脚本永久存储在 Redis 中,其他客户端在实现相同功能时可以直接复用而不必重复编写代码。 可嵌入性:可嵌入 JAVA,C# 等多种编程语言,支持不同操作系统跨平台交互。
理解 HyperLogLog 1、HyperLogLog 基础 HyperLogLog 是一种用于估计集合中唯一元素数量的算法,它通过概率统计方法,在极小的内存空间内提供近似的计数结果。...而且,HyperLogLog 提供了惊人的精度与性能平衡。通常,它的标准误差为 0.81%,这对于大多数应用来说已经足够准确。...案例研究 在这部分,我们可以探讨一个基于真实数据的案例,展示如何在一个 ToC 业务中计算某个功能的使用 UV(唯一访问用户数),使用 Redis HyperLogLog 来实现。...Java 代码实现: 使用 Jedis,这是一个流行的 Java Redis 客户端,来与 Redis 进行通信。...它可以用来解决缓存穿透的问题,可以判断 Redis key 是否在 DB 中,从而避免请求 DB 中不存在的数据,造成 DB 压力。 它可以使用很小的空间,存储大规模的数据。
文章目录 概述 Redis 的 Hyperloglog 命令 Spring 中操作基数 注意 代码 概述 基数是一种算法。...举个例子 , 一本英文著作由数百万个单词组成,你的内存却不足以存储它们,那么我们先分析一下业务。...基数并不是存储元素,存储元素消耗内存空间比较大,而是给某一个有重复元素的数据集合( 一般是很大的数据集合〉评估需要的空间单元数,所以它没有办法进行存储 ,加上在工作中用得不多 ,所以简要介绍一下 Redis...key element 添加指定元素到 HyperLogLog 中 如果已经存储元素,则返回为 0,添加失败 pfcount key 返回 HyperLogLog 的基数值 ---- pfmerge...h1的 HyperLogLog 插入元素 ,让其计算基数,到 了第 5 个命令“ pfadd h1 a”的时候,由于在此以前已经添加过,所以返回了 0。
, 数组中的每个元素就是对应操作的执行结果 #### bitmap应用场景示例 1....其实我们对UV只是需要一个大概的数字, 100W和101W差别其实不大,redis 提供了 HyperLogLog 数据结构就是用来解决这种统计问题的。...HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不精确,标准误差是 0.81%,这样的精确度已经可以满足上面的 UV 统计需求了 #### 使用方法 HyperLogLog...它的使用场景可以归纳为:判断大量数据是否在一个池子里 有如下特点: - 空间效率和查询效率高 - 不会漏判,但是有一定的误判率(哈希表是精确匹配) #### 布隆过滤器原理 想快速找到一个元素,以...布隆过滤器有两个基本指令:`bf.add` 添加元素,`bf.exists` 查询元素是否存在 ### 限流 #### 简单限流 使用 `zset` 这个数据结构的 `score` 来充当滑动窗口
解决这个问题的办法是查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类 ClassNOtFoundException是一个异常,其产生的原因在于:Java支持使用反射方式在运行时动态加载类,...解决该问题需要确保所需的类连同它依赖的包存在于类路径中,常见问题在于类名书写错误。...另外还有一个导致ClassNotFoundException的原因就是:当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。...理解 Java 语言中操作 Throwable 的元素和实践 尽量不要捕获类似 Exception 这样的通用异常,而是应该捕获特定异常 不要生吞(swallow)异常,生吞异常,往往是基于假设这段代码可能不会发生...,尽量不要一个大的 try 包住整段的代码;与此同时,利用异常控制代码流程,也不是一个好主意,远比我们通常意义上的条件语句(if/else、switch)要低效 Java 每实例化一个 Exception
最近遇到一个业务需求,要统计一张mysql大表每天/每周/每月的记录量(该表每天产生的记录量在好几百万)。当然有朋友会说,select count(1) from xxx 不就完事了吗?...于是想到了redis里的HyperLogLog,这种数据类型一般很少用,但是计算count是它的强项,性能极快(具体原理可参考文末文章) 一、基本用法 1.1 向HyperLogLog中添加元数 pfadd...如上图,可以用 "表名_天"做为key,然后把每行记录的主键Id扔进去,如果操作执行成功,会返回1 1.2 统计HyperLogLog中的基数(即:去除重复后的元素个数) pfcount key名 ?...假如我们已经有了 table_20200825 , table_20200826 这2个key,想统计它们的元素之和,就可以用pfmerge合并这2个HyperLogLog ?...另外,对于已经添加进去的元素,没办法删除,没有类似pfdelete的命令。
领取专属 10元无门槛券
手把手带您无忧上云