Redis新数据类型

Bitmaps

  Redis提供了Bitmaps这个“数据类型”可以实现对位的操作
  Bitmaps本身不是一 种数据类型,实际上它就是字符串( key-value )
但是它可以对字符串的位进行操作。极大的节约内存空间

  Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字
符串的方法不太相同。可以把 Bitmaps想象成一个以位为单位的数组,   
数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。

但Bitmaps并不是万金油,假如该网站每天的独立访问用户很少 ,例如只有10万(大量的僵尸用户)
那么两者的对比如下表所示,很显然,这时候使用Bitmaps就不太合适了,因为基本上大部分位都是0。

Bitmaps的偏移量对应势必会造成一定的浪费 ,通常的做法是每次减去指定数字.

  在第一次初始化Bitmaps时,假如偏移量非常大,那么整个初始化过程执行会
比较慢,可能会造成redis的阻塞

数据命令
setbit <key><offset><value>        设置Bitmaps中某个偏移量的值(0或1)
                                  offset:偏移量从0开始
getbit <key><offset>                获取bitmaps中某个偏移量的值
                                  获取键的第offset位(从0开始)
bitcount <key> [start end]        统计字符串从start字节到end字节比特值为一的数量
                                                                (一个字节是8位)
                                  -1表示最后一位,-2表示倒数第二个位
                                  start和end都是字节的下标数,都包含
bitop and(or/not/xor) <destkey>   [key...]
               bitop是一个复合操作,它可以做多个Bitmaps的and (交集)、or(并集)、not(非)
                   xor(异或)操作并将结果保存在destkey中

hyperloglog

  在工作当中,我们经常会遇到与统计相关的功能需求,比如统计网站PV
( PageView页面访问量) ,可以使用Redis的incr. incrby 轻松实现。。
但像UV ( UniqueVisitor ,独立访客)、独立IP数、搜索记录数等需要去重和
计数的问题如何解决?这种求集合中不重复元素个数的问题称为基数问题。

  解决基数问题有很多种方案:
( 1 )数据存储在MySQL表中,使用distinct count计算不重复个数、
( 2 )使用Redis提供的hash、set、 bitmaps等数据结构来处理.
以上的方案结果精确,但随着数据不断增加,导致占用空间越来越大,对于非
常大的数据集是不切实际的。。能否能够降低一定的精度来平衡存储空间?
 Redis推出了HyperLogLog.
 
  但是,因为HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素
本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。

  什么是基数?
  比如数据集{1, 3,5,7,5, 7, 8},那么这个数据集的基数集为{1, 3,5 ,7, 8},
基数(不重复元素)为5.
基数估计就是在误差可 接受的范围内,快速计算基数。

数据命令
pafadd <key><element> [element...]   添加指定元素到haperloglog中
                                      支持一次添加多个,空格隔开
pfcount <key> [key...]       计算HLL的近似基数,可以计算出多个HLL
pfmerge <destkey><scurcekey> [sourcekey...]    将一个或多个HLL合并后的结果
                                            存储在另一个HLL中

Geospatial

Redis 3.2中增加了对GEO类型的支持。
GEO , Geographic ,地理信息的缩写。
该类型,就是元素的2维坐标,在地图.上就是经纬度。redis 基于该类型,提供了经纬度设置,查询
范围查询,距离查询,经纬度Hash等常见操作。
两极无法直接添加,-般会下载城市数据,直接通过Java程序- -次性导入。

有效的经度从-180 度到180 度。有效的纬度从-85.05112878 度到
85.05112878度。
当坐标位置超出指定范围时,该命令将会返回一个错误。
已经添加的数据,是无法再次往里面添加的。

geoadd<key> <longitude> <latitude> <member> [longitude latitude member..]
                                             添加地理位置(经度,纬度,名称)。
          例:geoadd china:city 121 .47 31.23 shanghai
 geopos <key><member> [member...]                获取指定地区坐标值
  
 geodist <key> <member1> <member2> [m/km/ft/miγ]     获取两个位置之间的直线距离。
 
 单位:
	m表示单位为米[默认值]。
	km表示单位为千米。。
	mi表示单位为英里。。
	ft表示单位为英尺。
	如果用户没有显式地指定单位参数,那么GEODIST默认使用米作为单位。
	
georadius<key>< longitude> <latitude> radius m/km/ft/mi        以给定的经纬度为中心 
                                                            找出某一半径内的元素。

I

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值