Redis三种特殊数据类型
三种特殊数据类型
geospatial 地理位置
朋友的定位,附近的人,打车距离计算。
Redis的Geo
可以查询一些测试数据 http://www.jsons.cn/lngcode/
可以推算地理位置之间的信息,两地之间的距离,周围的人
参数:key 值(经度、纬度,名称)
geoadd 添加地理位置 geoadd china:city 116.40 39.90 beijing
规则: 两极无法直接添加,一般会下载城市数据,通过java程序一次性导入
geopos 获取指定城市的经纬度 geopos china:city beijing
geodist 返回两个给定位置之间的距离 geodist china:city beijing chongqing km
我附近的人? (获得所有附近的人的定位)一般通过半径查询
georadius georadius china:city 110 30 500 km [withdist withcoord count 1]
以100,30经纬度为中心,寻找方圆500km的城市,withdist 显示距离 withcoord显示坐标 count 限制数量
georadiusbymember 找出指定元素周围的其他元素
GEORADIUSBYMEMBER china:city beijing 1000 km
geohash 返回一个或多个位置元素的geohash表示
将二维坐标转换为一维字符串 ,两个字符串越接近,距离越近
geo底层实现
底层其实就是Zset,可以使用Zset命令来操作geo
zrange china:city 0 -1
zrem china:city xian
Hyperloglog
什么是基数?
基数就是集合中不重复的元素
Redis Hyperloglog基数统计的算法
优点:
占用内存固定,2^64不同的元素的技术,只需要花费12kb内存,如果从内存角度比较的话,Hyperloglog是首选,0.81%错误率!统计UV,是可以接受的
网页的UV(一个人访问一个网站多次。还是算作一个人)
传统的方式:set保存用户id,然后可以统计set中的元素数量作为标准
这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id
pfadd 创建一组元素
pfcount 统计基数数量
pfmerge 合并两组,可以查看并集的基数数量
如果允许容错,那么就使用pf,如果不允许容错,就只有使用set或者自己的数据类型
Bitmap
位存储
Bitmap位图,数据结构!都是操作二进制位来进行记录,就只有0和1两个状态
setbit 设置位数据
getbit 获取位数据
bitcount 获取1的个数