Redis新数据类型
Posted 两片空白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis新数据类型相关的知识,希望对你有一定的参考价值。
目录
Bitmaps
简介
现代计算机用二进制(位)作为信息的基本单位,1个字节等于8位。合理的使用和操作位可以有效的提高内存的使用率和开发效率。
redis提供了Bitmaps这个"数据类型"可以实现对位的操作。
- Bitmaps本身不是一种数据类型,实际上它就是字符串,但是它可以对字符串的位进行操作。
- Bitmaps单独提供了一套命令,所以在redis中使用Bitmaps和使用字符串的方法不大相同。可以将Bitmaps想象成一个以位为单位的数组,数组的每个单位只能存储0和1,数组的下标在Bitmaps中叫做偏移量。
命令
- setbit:向Bitmaps中插入数据。
格式:setbit key offset value //offset:偏移量从0开始
实例:
每个独立的用户是否访问过网站保存在Bitmaps中,将访问过的用户置1,没有访问过的用户置0,使用用户id作偏移量。
假设现在有20个用户,用户id为1,6,11,15,19的用户访问过网站。使用命令初始化数据如下:
- getbit:获得Bitmaps中对应偏移量的值
格式:getbit key offset
获得Bitmaps中第offset位的值。从0开始算。
注释:因为115根本不存在,所以也返回0。
- bitcount:统计字符串被设置为1的位的个数。也可以指定start和end参数,可以让计数只在特定的位上进行。start和end可以为负数,比如:-1表示最后一位,-2表示倒数第二位。start和end不填写时表示查找范围为全部。
start和end的范围为[start,end],且start和end表示的是字节的下标数。
格式:bitcount key start end
统计字符串从start字节到end字节比特位为1的个数。
由上面的例子知道第1,6,11,15,19位为1。最少占3字节。
注意:setbit是设置第几位的值。bitcount计算的是以字节为单位范围内1的个数。
- bitop:是一个复合操作,它可以做多个Bitmaps的and(交集),or(并集),not(非),xor(异或)操作。
格式:bitop 复合操作 destkey key [key... ...]
//符合操作后的结果保存早destkey中。
实例:
Bitmaps和set对比
假设有1亿个用户,每天独立访问的用户有5千万。使用set集合和bitmaps来保存活跃的用户可以得到表:
set只需要保存活跃的用户,而bitmaps的重点在于标明用户是否活跃。所以set需要存储的用户量为5千万,bitmaps则需要表明所有用户是否活跃,所以需要存储的用户量为1亿,但是只需要用1位来表明即可。
很明显,使用Bitmaps能节省很多的内存空间,尤其是随着时间的推移,节省的内存空间更多。
但是,当活跃的用户量比较少时,set保存活跃用户的id,记录的的用户数量少,占用的内存会比较少。而bitmaps还是需要记录所有用户是否活跃。这个时候使用bitmaps就不大合适了。
HyperLogLog
介绍
在工作中,我们经常会遇到按照搜索记录需要进行去重和计数的问题。这种在集合中求不重复的元素和计数的问题称为基数问题。
什么是基数:不重复元素个数。
比如数据集合1,3,5,7,5,7,9,那么这个集合的基数集为1,3,5,7,9。基数(不重复元素)为5。基数估计就是在误差可接受的范围内,快速计算基数。
解决基数问题的方案有很多:
- 数据保存在mysql中,使用distinct count计算不重复个数。
- 使用Redis提供的hash,set,bitmaps可以进行去重。
但是随着数据量的增加,导致占用空间越来越大,对于非常大的数据集是不切实际的。
能否降低一定的精度来平衡存储空间?redis推出了HyperLogLog。
Redis的HyperLogLog是用来做基数统计的算法,优点在于,在输入元素的数量或者体积非常大时,计算基数所需要的空间总是固定的,并且非常的小。在Redis中,每一个HyperLogLog键只需要花费12KB的内存,就可以计算2^64个不同元素的基数。
但是。因为HyperLogLog只会根据输入的元素来计算基数,而不会存储元素本身,所以HyperLogLog不能像集合一样,返回输入的各个元素。
命令
- pfadd:向HyperLogLog中输入元素。
格式:pfadd key element element ...
当执行命令后,HyperLogLog数据结构中估计的近似基数发生变化,则返回1,如果基数没有变化,返回0.
实例:
- pfcount:计算HyperLogLog数据结构中近似的基数。可以计算多个HyperLogLog,计算多个HyperLogLog的基数,则是将每一个HyperLogLog合并起来计算。
格式:pfcount key
- pfmerge:将一个或者多个HyperLogLog合并后的结果存储在另外一个HyperLogLog中。
格式:pfmerge destkey key1 key2...
Geospatial
简介
该类型是用来记录地理信息的操作,用来表示的是元素的二维坐标,在地图上的经纬度。redis基于该类型,提供了经纬度的设置,查询,范围查询,距离查询,经纬度的Hash等常见操作。
命令
- geoadd:添加地理位置(经度,纬度,名称)
格式:geoadd key 经度 维度 名称
两极无法直接添加,有效经度从-180度到180度,纬度从-85.05112878度到85.05112878度。
当坐标位置超出指定范围,该命令返回一个错误。
已经添加的数据,无法再次添加。
- geopos:获取指定地区的坐标
格式:geopos key 名称
- geodist:获取两位置之间的直线距离
格式:geodist key 名称1 名称2 距离单位
距离单位有:m:米,km:千米,ft:英尺,mi:英里。默认使用米作为单位。
- georadius:以给定经纬度为中心,找出某一半径内的元素。
格式:georadius key 经度 纬度 半径范围 距离单位
以上是关于Redis新数据类型的主要内容,如果未能解决你的问题,请参考以下文章
Redis02(配置文件Redis6新数据类型:BitmapsHyperLogLogGeospatial,Redis_Jedis_及实例Redis与Spring Boot整合)