Redis的新数据类型

举报
小小张自由--张有博 发表于 2022/05/19 17:59:32 2022/05/19
【摘要】 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"



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。