Redis的新数据类型
Bitmaps
介绍
现代计算机用二进制(位)作为信息的基础单位,1个字节等于8位,例如“abc”
字符串是由3个字节组成,但实际在计算机存储时将其用二进制表示,“bc”分别对应的ASCII码分别是97、98、99,对应的二进制分别是01100001、01100010和01100011,如下图:
合理地使用操作位能够有效地提高内存使用率和开发效率。。
Redis提供了Bitmaps这个"数据类型”可以实现对位的操作:
(1)Bitmaps本身不是一种数据类型,实际上它就是字符串(key-value),但是它可以对字符串的位进行操作。“
(2)
Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。
特点:极大地节省空间,减少内存的使用,提高CPU的利用率。对于大数据量有明显的效果
命令
存储:setbit key 偏移量 1/0
获取:getbit key 偏移量
内容计数:bitcount key
127.0.0.1:6379> setbit users:2021 1 1
(integer) 0
127.0.0.1:6379> setbit users:2021 6 1
(integer) 0
127.0.0.1:6379> setbit users:2021 11 1
(integer) 0
127.0.0.1:6379> setbit users:2021 15 1
(integer) 0
127.0.0.1:6379> getbit users:2021 1
(integer) 1
127.0.0.1:6379> getbit users:2021 6
(integer) 1
127.0.0.1:6379> getbit users:2021 15
(integer) 1
127.0.0.1:6379> getbit users:2021 8
(integer) 0
127.0.0.1:6379> bitcount users:2021
(integer) 4
127.0.0.1:6379>
HyperLogLog
简介
在工作当中,我们经常会遇到与统计相关的功能需求,比如统计网站PV
(PageView页面访问量),可以使用Redis的incr、incrby轻松实现。
但像UV(UniqueVisitor,独立访客)、独立IP数、搜索记录数等需要去重和计数的问题如何解决?这种求集合中不重复元素个数的问题称为基数问题。·
解决基数问题有很多种方案:
(1)数据存储在MySQL表中,使用distinct count计算不重复个数,
(2)使用Redis提供的hash、set bitmaps等数据结构来处理以上的方案结果精确,但随着数据不断增加,导致占用空间越来越大,对于非常大的数据集是不切实际的。。
能否能够降低一定的精度来平衡存储空间?Redis推出了HyperLogLog.
Redis HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
什么是基数?
比如数据集{1,3,5,7,5,7,8},那么这个数据集的基数集为{1,3,5,7,8},基数(不重复元素)为5.基数估计就是在误差可接受的范围内,快速计算基数。·
存储:pfadd key value
内容计数:pfcount key
命令
127.0.0.1:6379> pfadd program "java"
(integer) 1
127.0.0.1:6379> pfadd program "php"
(integer) 1
127.0.0.1:6379> pfadd program "java"
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> pfadd program "c++" "mysql"
(integer) 1
127.0.0.1:6379> pfcount program
Geospatial
简介
Redis3.2中增加了对GE0类型的支持。GE0,Geographic,地理信息的缩写。
该类型,就是元素的2维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作。
存储地图的数据类型,经度纬度
命令
1、geoadd:
将指定的地理空间位置(纬度、经度、名称)添加到指定的key
中。这些数据将会存储到sorted set
这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。
该命令以采用标准格式的参数x,y,所以经度必须在纬度之前。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引。具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001 规定如下:
- 有效的经度从-180度到180度。
- 有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。
127.0.0.1:6379[2]> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379[2]> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379[2]> geoadd china:city 106.50 29.53 chongqin 114.05 22.52 shenzhen
(integer) 2
127.0.0.1:6379[2]> geoadd china:city 108.96 34.26 xian 120.16 30.24 hangzhou
2、geopos:获取指定城市的精度和经度
127.0.0.1:6379[2]> geopos china:city beijing chongqin
1) 1) "116.39999896287918"
2) "39.900000091670925"
2) 1) "106.49999767541885"
2) "29.529999579006592"
3、geodist:返回两个给定位置之间的距离。
如果两个位置之间的其中一个不存在, 那么命令返回空值。
指定单位的参数 unit 必须是以下单位的其中一个:
m 表示单位为米。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。
GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。
127.0.0.1:6379[2]> geodist china:city beijing shanghai km
"1067.3788"
- 点赞
- 收藏
- 关注作者
评论(0)