Bitmaps
简介
现代计算机用二进制(位)作为信息的基础单位,1个字节等于8位,例如“abc”字符串是由3个字节组成,但实际在计算机存储时将其用二进制表示,“abc”分别对应的ASCII码分别是97、98、99,对应的二进制分别是01100001,01100010,01100011,如图:
合理地使用操作位能够有效的提高内存使用率和开发效率。Redis提供了Bitmaps这个“数据类型”可以实现对位的操作:
- Bitmaps本身不是一种数据类型,实际上是字符串,但是它可以对字符串的位进行操作。
- Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同,可以把Bitmaps想象成一个以位为单位的数值,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量
命令
命令 | 说明 |
---|---|
setbit key offset value | 设置或者清空key的value在offset的bit值 |
bitcount key [start end] | 统计字符串被设置为1的bit数 |
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL] | 把Redis字符串当作位数组,并能对变长位宽和任意未字节对齐的指定整型位域进行寻址 |
BITOP operation destkey key [key …] | 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上 |
BITPOS key bit [start] [end] | 返回字符串里面第一个被设置为1或者0的bit位 |
GETBIT key offset | 返回key对应的string在offset处的bit值 当offset超出了字符串长度的时候,这个字符串就被假定为由0比特填充的连续空间 |
Bitmaps与set的区别
假设网站有一亿用户,每天独立访问的用户有5千万,如果每天用集合类型和Bitmaps分别存储活跃用户
很明显,这种情况下使用Bitmaps更节省空间,尤其是随着时间的推移节省的内存很可观的
但Bitmaps并不是万能的,假如该网站每天的独立访问用户很少,例如只有10万(大量的僵尸用户),那么两者的对比如下表所示,很显然,这时候使用Bitmaps就不太合适,因为基本上大部分位都是0
HyperLogLog
简介
-
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
-
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
-
因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog不能像集合那样,返回输入的各个元素。
命令
命令 | 说明 |
---|---|
pfadd key element [element…] | 添加指定元素到HyperLogLog中 |
pfcount key [key…] | 计算HLL的近似基数,可以计算多个HLL,比如用HLL存储每天的UV,计算一周的UV可以使用7天的UV合并计算即可 |
pfmerge destkey sourcekey[sourcekey…] | 将一个或多个HLL合并后的结果存储在另一个HLL中,比如每月活跃用户可以使用每天的活跃用户来合并计算 |
Geospatial
简介
Redis 3.2中增加了对GEO类型的支持,GEO是Geographic(地理信息)的缩写。该类型就是元的2维坐标,在地图上就是经纬度。Redis基于该类型,提供了经纬度的设置,查询,范围查询,距离查询,经纬度Hash等常见操作。
命令
命令 | 说明 |
---|---|
geoadd key longitude latitude member [geoadd key longitude latitude member] | 添加一个或者多个地址位置(经度,纬度,名称) |
geopos key member [member…] | 获取一个或者多个地区的坐标值 |
geodist key member1 member2 [m|km|ft|mi] | 获取两个位置之间的直线距离,单位(m:米(默认值);km:千米;mi:英里;ft:英尺) |
georadius key longitude latitude radius m|km|ft|mi | 以给定的经纬度为中心,找出某一个半径内的元素 |
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] | 这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点指定成员的位置被用作查询的中心。 |
geohash key member[member…] | 返回一个或多个位置元素的 Geohash 表示 |
GEOADD命令需要注意的地方:
- 两极无法直接添加,一般会下载城市数据,直接通过Java程序一次性导入。
- 有效的经度从-180°到180°。有效的纬度是从-85.05112878°到85.05112878°
- 坐标位置超出指定范围时,该命令将会返回一个错误。
- 已经添加的数据,是无法再次往里面添加的。
参考地址
https://blog.csdn.net/qq_16399991/article/details/83512937
https://blog.csdn.net/maoyuanming0806/article/details/81814610
http://www.redis.cn/commands.html