vlambda博客
学习文章列表

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的个数