一.Redis简介
Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。
它支持多种类型的数据结构,如字符串(String),散列(Hash),列表(List),集合(Set),有序集合(Sorted Set或者是ZSet)与范围查询,Bitmaps(可以把Bitmaps想象成一个以位为单位数组,数组中的每个单元只能存0或者1,数组的下标在bitmaps中叫做偏移量。单个bitmaps的最大长度是512MB,即2^32个比特位。命令:setbit key offset value。例如:setbit unique:users:2017-07-11 0 1 代表2017-07-11这天的独立访问用户的Bitmaps,用下标代表用户ID,1表示访问,0表示未访问,则上述命令代表第一个用户2017-07-11这天访问了系统。
命令:getbit key offset
例如: setbit unique:users:2017-07-11 0 1
getbit unique:users:2017-07-11 0
返回: 1
假如offset=0的元素不存在,则返回结果0
命令:bitcount key [start] [end]
例如:setbit unique:users:2017-07-11 0 1
setbit unique:users:2017-07-11 9 1
bitcount unique:users:2017-07-11
返回: 2
bitcount unique:users:2017-07-11 0 0
返回:1
),Hyperloglogs(使用HyperLogLog解决海量数据统计问题,HyperLogLog 提供不精确的去重计数方案,标准误差大概在 0.81%,基本指令,用法和set集合的sadd类似
pfadd key value1 //新增一个元素(key value)
pfadd key value2 //新增一个元素(key value)
pfadd key value3 //新增一个元素(key value)
pfadd key value3 //新增一个元素(key value)
pfadd key value4 value5 value6 value7 //新增多个元素(key value4 value5 value6 value7)
pfcount key //统计该key去重后的元素个数(返回7)
HyperLogLog
HyperLogLog
,下面简称为HLL
,它是 LogLog
算法的升级版,作用是能够提供不精确的去重计数。存在以下的特点:
- 代码实现较难。
- 能够使用极少的内存来统计巨量的数据,在
Redis
中实现的HyperLogLog
,只需要12K
内存就能统计2^64
个数据。
取 Java
语言来说,一般long
占用8字节,而一字节有8位,即:1 byte = 8 bit,即long
数据类型最大可以表示的数是:2^63-1
。对应上面的2^64
个数,假设此时有2^63-1
这么多个数,从 0 ~ 2^63-1
,按照long
以及1k = 1024字节
的规则来计算内存总数,就是:((2^63-1) * 8/1024)K
,这是很庞大的一个数,存储空间远远超过12K
。而 HyperLogLog
却可以用 12K
就能统计完。
Redis 中的 HyperLogLog 原理
前面我们已经认识到,它的实现中,设有 16384 个桶,即:2^14 = 16384,每个桶有 6 位,每个桶可以表达的最大数字是:2^5+2^4+...+1 = 63 ,二进制为: 111 111
。
对于命令:pfadd key value
在存入时,value 会被 hash 成 64 位,即 64 bit 的比特字符串,前 14 位用来选择这个 value 的比特串中从右往左
第一个 1 出现的下标位置数值要存到那个桶中去,即前 14 位用来分桶。设第一个1出现位置的数值为 index 。当 index=5 时,就是: ....10000 [01 0000 0000 0000]
之所以选 14位
来表达桶编号是因为,分了 16384 个桶,而 2^14 = 16384,刚好地,最大的时候可以把桶利用完,不造成浪费。假设一个字符串的前 14 位是:00 0000 0000 0010 (从右往左看) ,其十进制值为 2。那么 index 将会被转化后放到编号为 2 的桶。
) 和地理空间(Geospatial)索引半径查询。其中常见的数据结构类型有:String、List、Set、Hash、ZSet这5种。
Redis 内置了复制(Replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(Transactions) 和不同级别的磁盘持久化(Persistence),并通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(High Availability)。