
正文
redishyperloglog亿的简单介绍
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
redis数据类型和应用场景
Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。),Redis数据都是缓存在计算机内存中并且它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,实现数据的持久化。谈到存储数据,那么必然要涉及到相关的数据类型,redis主要有以下数据类型:
描述:string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。value其实不仅是String,也可以是数字。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
常用命令:get、set、incr、decr、mget等。
应用场景:规key-value缓存应用。常规计数: 点赞数, 粉丝数。
描述: hash 是一个键值(key = value)对集合。Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
常用命令:hget,hset,hgetall 等。
应用场景:存储部分变更数据,如商品信息等。
描述:list 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
常用命令:lpush(添加左边元素),rpush,lpop(移除左边第一个元素),rpop,lrange(获取列表片段,LRANGE key start stop)等。
应用场景:消息队列,关注列表,粉丝列表等都可以用Redis的list结构来实现。
描述: set是string类型的无序集合。集合是通过hashtable实现的,概念和数学中个的集合基本类似,可以交集,并集,差集等等,set中的元素是没有顺序的。所以添加,删除,查找的复杂度都是O(1)。
常用命令:sadd,spop,smembers,sunion 等。
应用场景:交集,并集,差集(微博中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中)
描述:zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同是可以打分(排序)
常用命令:zadd,zrange,zrem,zcard等
应用场景:排行榜,带权重的消息队列
描述:Bitmaps这个“数据结构”可以实现对位的操作。 把数据结构加上引号主要因为:
Bitmaps本身不是一种数据结构, 实际上它就是字符串 , 但是它可以对字符串的位进行操作。
Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。其实大多数Bitmaps的应用场景可以用其他数据类型来实现,用Bitmaps主要是存储空间占用特别少
常用命令:getbit key offset;setbit key offset value
应用场景:统计用户访问,统计电影某天的的播放量
描述:Redis 在 2.8.9 版本添加了 HyperLogLog 结构。Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。这类数据结构的基本大的思路就是使用统计概率上的算法,牺牲数据的精准性来节省内存的占用空间及提升相关操作的性能
常用命令:pfadd, pfcount,pfmerge
应用场景:统计网站的每日UV
描述:GEO功能在Redis3.2版本提供,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能.geo的数据类型为zset.
常用命令:geoadd,geopos, geodist
应用场景:附近位置、摇一摇
参考列表:
Redis五种数据类型及应用场景
相关问答
Q1: HyperLoglog
在数据量比较小的情况下, set 这种数据结构 可以很好的统计;然而当用户量大到 千万级或上亿级别 的时候使用set的话会占用较大的空间可以粗略计算下:假设 10000000 个用户,key为long(按8字节算),value 为bool (4字节,单独的bool类型),java为例,不考虑内存对齐,补考set具体实现封装entry等消耗,则需要
10000000 *(8+4)bytes ~= 1144 mb ~= 1GB
那有没有一种办法可以节约下内存的空间呢?当然是有的,就是我么今天要聊得 HyperLogLog ,该方法不是一种精确的统计方式,有一定的误差 ,在量小的情况下误差会比较大,当时当数据大到一定程度的时候,稍许的误差在某些指标下,例如活跃度计算,也就不那么重要了,1000w中少个1-2w 误差大概在 标准误差为 0.81% 。
先介绍下伯努利实验
硬币拥有正反两面,一次的上抛至落下,最终出现正反面的概率都是50%。假设一直抛硬币,直到它出现正面为止,我们记录为一次完整的试验,间中可能抛了一次就出现了正面,也可能抛了4次才出现正面。无论抛了多少次, 只要出现了正面,就记录为一次试验 。这个试验就是伯努利试验
那么对于多次的伯努利试验,假设这个多次为n次。就意味着出现了n次的正面。假设每次伯努利试验所经历了的 抛掷次数 为k,第一次伯努利试验,次数设为k1,以此类推,第n次对应的是kn
其中,对于这n次伯努利试验中,必然会 有一个最大的抛掷次数k ,例如抛了12次才出现正面,那么称这个为k_max,代表抛了最多的次数。
伯努利试验容易得出有以下结论:
最终结合极大似然估算的方法,发现在n和k_max中存在估算关联:n = 2^(k_max) 。这种通过局部信息预估整体数据流特性的方法似乎有些超出我们的基本认知,需要用概率和统计的方法才能推导和验证这种关联关系。
例如下面的样子:
第一次试验: 抛了3次才出现正面,此时 k=3,n=1
第二次试验: 抛了2次才出现正面,此时 k=2,n=2
第三次试验: 抛了6次才出现正面,此时 k=6,n=3
第n 次试验:抛了12次才出现正面,此时我们估算, n = 2^12
假设上面例子中实验组数共3组,那么 k_max = 6,最终 n=3,我们放进估算公式中去,明显: 3 ≠ 2^6 。也即是说,当试验次数很小的时候,这种估算方法的误差是很大的。
如果只是进行一轮的n次伯努利实验 ,当足够大的时候估算的误差会减少,但是还不够,还需要进一步减少误差,最简单的方式也就是 多来几轮,然后 对 k_max取平均值 ,这也就是loglog的做法定义
其中 m为轮数,constant为修正系数 R_(打不出)的定义为 k_max的m次的平均值
HyperLoglog和Loglog的区别是 平均值得方式,hyper使用的调和平均值 公式如下
L = S.length
L = m * p
以 K 为单位,S 占用的内存 = L / 8 / 1024
在 Redis 中,HyperLogLog设置为:m=16834,p=6,L=16834 * 6。占用内存为=16834 * 6 / 8 / 1024 = 12K
形象化为:
第0组 第1组 .... 第16833组
[000 000] [000 000] [000 000] [000 000] .... [000 000]
redis 设定了 16384个桶,每个桶使用6bit来存储k_max的中 最大为 2^6-1 ,其中将hashcode为64位,高14位(16384)用来分桶,低50位用来计算k_max
最终统计 constan* 16384*(16384/( 1/kmax1 +1/kmax2 +.....))
在估算的计算公式中, constant 变量不是一个定值,它会根据实际情况而被分支设置,例如下面的样子。
假设:m为分桶数,p是m的以2为底的对数。
[参考摘录自]( )
Q2: redis的HyperLogLog有什么用
Redis是一个开源的使用C语言编写、开源、支持网络、可基于内存亦可持久化的日志型、高性能的Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String)、哈希(Map)、 列表(list)、集合(sets) ...
关于redishyperloglog亿和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







