Redis6新数据类型
Bitmaps
鉴于合理地操作位能够有效地提高内存使用率和开发效率。Redis6 推出了 一种新的“数据类型”——Bitmaps。
Bitmaps本身不是一个数据类型,实际上它就是字符串(key-value),只不过,他可以对字符串的位进行操作。我们可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,而对于数组的下标,我们将它称为偏移量。
命令 | 描述 |
---|---|
setbit key offest value | 设置key中偏移量offest的值为value(0或1) |
getbit key offest | 获取key中偏移量为offest的值 |
bitcount key [start] [end] | 获取key中偏移量从start8 到 end8 范围内1的个数 start和end可以不写,表示0到-1,即求key中所有的1的数量 |
bitop and destkey key1 key2 … keyn | 求多个key 的交集,并将结果保存到destkey |
bitop or destkey key1 key2 … keyn | 求多个key 的并集,并将结果保存到destkey |
bitop not destkey key1 key2 … keyn | 求多个key 的非,并将结果保存到destkey |
bitop xordestkey key1 key2 … keyn | 求多个key 的异或,并将结果保存到destkey |
注意:
1、为什么bitcount的start和end要*8呢?因为start和end表示的不是简单的偏移量,而是字节,而一个字节等于8位,即8个偏移量,所以,我们在算的时候,要乘以8.
2、多个key的交集就是偏移量相等的情况下,值都为1的个数。
并集就是偏移量不相等的情况下,值为1的个数相加,再加上偏移量相等情况下,值为1的个数。
简单说一下bitmap的并吧,然后其他的应该就都懂了,举个例子,key1和key2是两个Bitmap变量。我们求他们的and,也就是并集。那么,就是让key1的值和key2的值做 &(与)运算,然后计算最后1的个数。
HyperLogLog
Redis中的HyperLogLog 主要用来做基数统计,他的优点是:在输入的元素的数量或者体积非常大的时候,计算基数所需的空间总是固定的,并且是很小的。
在Redis中,每个HyperLogLog 键只需要话费12 KB内存,就可以计算接近 2 的 64 次方 个不同元素的基数。这和计算基数时,元素越多耗费内存越大的集合形参鲜明的对比。
不过,由于HyperLogLog只会根据输入的元素来计算基数,而不会储存输入的基数,因此,HyperLogLog 不能像集合那样返回输入的各个元素。
命令 | 描述 |
---|---|
pfadd key element1 element2 … | 添加指定元素到key中 |
pfcount key | 计算key的基数 |
pfmerge destkey key1 key2 … | 把key1和key2的值放到destkey中(destkey也是HyperLogLog类型) |
Geospatial
Redis3.2 中增加了对GEO(Geographic,地理信息)类型的支持。该类型就是元素的2维坐标。Redis基于该类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度Hash等常见操作。
命令 | 描述 |
---|---|
geoadd key longitude1 latitude1 member1 longitude2 latitude2 member2 … | 向key中添加若干个经度、维度、名称 |
geopos key member | 通过key和member获取经纬度信息 |
geodist key member1 member2 [m/km/mi/ft] | 获取key中member1和member2之间的直线距离(默认是米) |
georadius key longitude latitude radius [m/km/mi/ft] | 以给定经纬度为圆心,radius为半径,找出key中在这个圆内的元素 |
注意:
1、两极无法直接添加,一般会下载城市数据,直接通过java程序一次性导入。
2、有效的经度从-180 到 180 度, 有效的纬度从-85.05112878 到 85.05112878。
3、当坐标位置超出指定范围,添加命令会返回错误。
4、已经添加的数据,无法再次添加。
5、m表示米,km表示千米,mi表示英里,ft表示英尺。