HyperLogLog

Redis八大类型常用命令大全(五大常用类型+三个特殊类型)

守給你的承諾、 提交于 2020-11-01 21:22:19
绝对手敲验证完成的一篇博客,多敲几遍才能记得牢! String类型: **应用场景:**缓存、分布式ID、分布式锁、计数器 举例说明:实现分布式ID功能,通过incr自动增长或者incrby实现固定步长增长 常用命令: * 清空数据库:flushdb * 清空全部数据库:flushall * 当前数据库的使用大小:dbsize * 查看当前数据库有多少key:keys * * 切换数据库:select 0 -- redis默认有 16 个数据库,select 0 就是切换到 0 数据库 * 查看某个key是否存在:exists name -- 查看name是否存在,存在返回 1 ,不存在返回 0 * 删除某个key:move name -- 移除name键 * 设置某个key过期时间:expire name 10 -- name 10 s后过期 * 在已有key的value里追加值:append name silence -- 如果追加的key不存在就相当于setkey * 值相加:incr views -- 对键为views的值加 1 * 值相减:decr views -- 对键为views的值减 1 * 增加指定的值: incrby views 10 -- 对键为views的值加 10 * 减少指定的值: decrby views 10 -- 对键为views的值减 10 *

高阶面试:伯努利过程

穿精又带淫゛_ 提交于 2020-10-28 15:20:38
这是第 43 篇原创 写文章耗时 200 分钟 读完仅需10分钟 17世纪法国有个富二代叫洛必达,师从著名数学家约翰·伯努利。洛必达的愿望是成为一名数学家,但是天资不好,在班上成绩一直倒数。当听说老师伯努利正准备结婚但还差点钱时,他写了封信给伯努利表示想重金买他的论文,此时缺钱的伯努利笑开了花。论文发布后洛必达一夜成名,论文就是著名的《洛必达法则》。洛必达死后,伯努利觉得卖亏了,于是把当时的交易信息公布出来,但命名已无法改回。当下每天都有人在课堂上悼念洛必达,不过今天的主角是伯努利。 伯努利家族的发家史是扔骰子和抛硬币,在统计学、概率学、数学上做出了突出的贡献。今天要讲的内容就是著名的《伯努利过程》。 题目:如果你是淘宝直播的研发,如何实时显示观看直播的总人数? 基数 基数(cardinality,也译作势),是指一个数据集中不同元素的个数。例如集合 {1,2,3,1,2} 的基数是3(去重后的个数)。工作中我们常常需要统计网站UV、App日活、微博与朋友圈点赞数、QQ空间访问量、直播观看人数等,都属于基数统计。 一般会用集合统计基数,集合的算法很容易实现,但是特别耗内存。比如李佳琦有一亿多粉丝,使用集合会消耗1G 左右的内存。要是有一千个李佳琦这样的大咖用此功能,会消耗1T内存,一百万主播来用会让整个阿里破产。 另一种方案是用Bitmap统计基数,统计一亿粉丝会消耗12.5M内存

Distinct window functions are not supported: count(distinct _w0# ) windowspecdefinition

隐身守侯 提交于 2020-10-27 09:58:44
方案一、可以使用approx_count_distinct,但是它是概率统计,非精确统计,其是使用 HyperLogLog 实现的 import org.apache.spark.sql.functions._ val windowSpec = Window.partitionBy($"site_id",$"pxSessionId").orderBy($"timeMs").rowsBetween(Long.MinValue,Long.MaxValue) res.withColumn("pageViewNumber",approx_count_distinct(when($"event_name" === "pageview",$"pxSessionId")).over(windowSpec)) 方案二、collect_set与size结合使用(函数大全见 这里 ),示例如下 import org.apache.spark.sql.functions._ val windowSpec = Window.partitionBy($"site_id",$"pxSessionId").orderBy($"timeMs").rowsBetween(Long.MinValue,Long.MaxValue) res.withColumn("pageViewNumber",size(collect

吹爆!阿里内部疯传:“性能怪兽”Nginx+Redis高阶文档开源分享!

跟風遠走 提交于 2020-10-21 13:41:18
前言 在开源界, 高性能服务的典型代表就是Nginx和Redis 。纵观这两个软件的源码,都是非常简洁高效的,也都是基于异步网络IO机制的,所以对于要学习高性能服务的程序员或者爱好者来说,研究这两个网络服务的源码是非常有必要的。 Nginx目前市面上的书籍很多,但是Redis确实寥寥无几。这几年Redis已经发展到了5.0版本,这些特性暂时没有资料进行系统讲解。今天要与大家介绍的文档就弥补了这一空缺,可以帮助大家仁深入理解Redis内核实现机制的有效途径。下面我们来看看主要内容:(由于篇幅限制就只能以截图方式展示出来了,需要获取高清版PDF的朋友只需要点赞文章,关注我后文末有免费获取方式) 第一份:Redis源码解析 第1章引言 Redis简介 Redis 5.0的新特性 Redis源码概述 Redis安装与调试 第2章简单动态字符串 数据结构 基本操作 第3章跳跃表 简介 跳跃表节点与结构 基本操作 跳跃表的应用 第4章压缩列表 压缩列表的存储结构 结构体 基本操作 连续更新 第5章字典 基本概念 Redis字典的实现 基本操作 字典的遍历 API列表 第6章整数集合 数据存储 基本操作 第7章quicklist的实现 quicklist简介 数据存储 数据压缩 基本操作 第8章Stream Stream简介 Stream底层结构listpack的实现

为什么Redis要比Memcached更火?

♀尐吖头ヾ 提交于 2020-10-02 10:53:23
前言 我们都知道,Redis和Memcached都是内存数据库,它们的访问速度非常之快。但我们在开发过程中,这两个内存数据库,我们到底要如何选择呢?它们的优劣都有哪些? 为什么现在看Redis要比Memcached更火一些? 这篇文章,我们就从各个方面来对比这两个内存数据库的差异,方便你在使用时,做出最符合业务需要的选择。 要分析它们的区别,主要从以下几个方面对比: 线程模型 数据结构 淘汰策略 管道与事务 持久化 高可用 集群化 线程模型 要说性能,必须要分析它们的服务模型。 Memcached处理请求采用多线程模型,并且基于IO多路复用技术,主线程接收到请求后,分发给子线程处理。 这样做好的好处是,当某个请求处理比较耗时,不会影响到其他请求的处理。 当然,缺点是CPU的多线程切换必然存在性能损耗,同时,多线程在访问共享资源时必然要加锁,也会在一定程度上降低性能。 Redis同样采用IO多路复用技术,但它处理请求采用是单线程模型,从接收请求到处理数据都在一个线程中完成。 这意味着使用Redis,一旦某个请求处理耗时比较长,那么整个Redis就会阻塞住,直到这个请求处理完成后返回,才能处理下一个请求,使用Redis时一定要避免复杂的耗时操作。 单线程的好处是,少了CPU的上下文切换损耗,没有了多线程访问资源的锁竞争,但缺点是无法利用CPU多核的性能。 由于Redis是内存数据库

授人以鱼不如授人以渔!阿里面试官整理的Redis原理实践小册

白昼怎懂夜的黑 提交于 2020-10-02 06:17:22
还原一个真实的面试场景 在面试后端工程师Redis技能的时候,面试官通常问的第一个问题就是“Redis能用来做什么?”,第一个回答往往都会是「缓存」。缓存确实是Redis 使用最多的领域,它相比Memcache而言更加易于理解、使用和控制。 可是如果再进一步问“还有呢?”,大多数同学就会开始皱眉头,只有一小部分人会回答「分布式锁」。如果你就分布式锁再深入问下去,他们基本就会开始摇头:我们项目里面Redis的锁方法都是别人(应该是架构师)封装好的,拿过来直接使用,内部细节没有去了解过,也没有必要了解。 对类似的场景,我深有体会。因为关于Redis 的面试题,之前准备了很多,但是真正能用上的却很少。当面试的同学频繁地回复「不知道、没用过」的时候,再继续深入追问已经毫无意义,这时候就需要切换话题了。偶尔遇上几个能持续很多回合的同学,他们总能使人眼前一亮。如果再拓展一下周边知识点,就会发现这些人往往也会有所涉猎,这时我在心中已经暗暗地对这位同学伸出了大拇指。 其实很多业务场景,如果仅仅是会使用某项技术、框架,那是再简单不过了。但随着业务发展,系统的用户量、并发量涨上来之后,现有系统的问题就会层出不穷地暴露出来。如果不能深入地了解系统、技术和框架背后的深层原理,很多问题根本无法理解到本质,更谈不上解决,临时抱佛脚也于事无补。 所谓「授人以鱼不如授人以渔」

Redis

浪子不回头ぞ 提交于 2020-09-27 13:59:00
Redis Nosql ​ 现在是大数据时代,一般的关系型数据库无法快速处理那么大的访问量。 为什么使用Nosql 单机Mysql时代 ​ 那时候更多使用静态网页Html,访问量不会很大,单个数据库已经足够。 这样的模式存在什么问题? 数据量如果太大,一台服务器放不下 数据的索引(B+Tree),一台服务器也放不下 读写混合,一台服务器无法承受 Memcached(缓存) + MySQL + 垂直拆分 ​ 实际场景80%都是进行查询的操作,每次都去查数据库效率很低。所以我们希望使用缓存减轻数据库压力。 ​ 发展历程:优化数据结构和索引——》文件缓存(IO)——》Memcached 分库分表 + 水平拆分 + MySQL集群 ​ 以前使用MylSAM : 表锁 查一行数据锁住了整张表 高并发下有严重的问题 Innodb使用行锁解决 ​ MySQL在那个时代推出了表分区,但是使用的不多。 ​ 集群在这时已经能满足大部分需求。 大数据时代 ​ 2010-2020发生了翻天覆地的变化,各种实时变化的数据。 ​ MySQL等关系型数据库的弊端就暴露了,无法应付这种场景。 为什么要用NoSQL ​ 用户的每天生成的个人信息,社交网络,地理位置等等以PB计,呈爆发式增长。 ​ NoSQL非常适合应对这种场景。 什么是NoSQL ​ NoSQL = Not Only SQL 不仅仅是SQL

玩转Redis-HyperLogLog原理探索

六月ゝ 毕业季﹏ 提交于 2020-08-16 21:45:04
  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用。本文是《玩转Redis》系列第【10】篇,最新系列文章请前往 公众号“zxiaofan” 查看,或 百度搜索“玩转Redis zxiaofan” 即可。 本文关键字:玩转Redis、HyperLogLog原理、基数缓存、密集存储结构和稀疏存储结构; 大纲 伯努利试验 HyperLogLog结构 HyperLogLog对象头 pfcount及基数缓存 pfadd底层逻辑 密集存储结构和稀疏存储结构 HyperLogLog引发的思考 名词解释: 1、基数 :集合中不重复元素的个数; 2、HLL :HyperLogLog 的简写; 概要   上文 《玩转Redis-HyperLogLog统计微博日活月活》 介绍了牛逼哄哄的HyperLogLog,传入元素数量或体积非常大时,HLL所需空间固定且很小。12kb内存可计算接近 2^64 个不同元素的基数。如此厉害,怎能不继续深入探索呢? PS:看完这篇文章,你会发现HyperLogLog能统计的基数值实际并不是 2^64 。 1. 伯努利试验   介绍HyperLogLog底层原理前,我们先了解下伯努利试验(援引百度百科)。   伯努利试验(Bernoulli experiment)是在同样的条件下重复地、相互独立地进行的一种随机试验。   其特点是该随机试验只有两种可能结果

《三天给你聊清楚redis》第1天先唠唠redis是个啥(18629字)

穿精又带淫゛_ 提交于 2020-08-16 06:00:14
1、入门 Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构: 字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。 • Redis将所有的数据都存放在内存中,所以它的读写性能十分惊人,用作数据库,缓存和消息代理。 Redis具有内置的复制,Lua脚本,LRU逐出,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。 • Redis典型的应用场景包括:缓存、排行榜、计数器、社交网络、消息队列等 1.1NoSql入门概述 1)单机Mysql的美好时代 瓶颈: 数据库总大小一台机器硬盘内存放不下 数据的索引(B + tree)一个机器的运行内存放不下 访问量(读写混合)一个实例不能承受 2)Memcached(缓存)+ MySql + 垂直拆分 通过缓存来缓解数据库的压力,优化数据库的结构和索引 垂直拆分指的是:分成多个数据库存储数据(如:卖家库与买家库) 3)MySql主从复制读写分离 主从复制:主库来一条数据,从库立刻插入一条。 读写分离:读取(从库Master),写(主库Slave) 4)分表分库+水平拆分+MySql集群 主库的写压力出现瓶颈(行锁InnoDB取代表锁MyISAM) 分库:根据业务相关紧耦合在同一个库

Redis凭啥这么快?只能做缓存?架构师道出了真相(颠覆你的认知)

纵然是瞬间 提交于 2020-08-14 00:32:18
Redis到底有多快 Redis采用的是基于内存的采用的是 单进程单线程 模型的 KV 数据库 , 由C语言编写 ,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差!有兴趣的可以参考官方的基准程序测试《 How fast is Redis? 》( redis.io/topics/benchma ) 横轴是连接数,纵轴是QPS 。此时,这张图反映了一个数量级,希望大家在面试的时候可以正确的描述出来,不要问你的时候,你回答的数量级相差甚远! Redis为什么这么快 1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1); 2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的; 3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗; 4、使用多路I/O复用模型,非阻塞IO; 5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话