前言
Redis中的这三个数据类型在很多开源的项目中都有使用到,除了日常开发中使用Java去实现某些功能外,还可以通过这些特殊的数据类型进行实现,本文也简单介绍了这三种数据类型使用的场景,可以帮助读者在开发中实现功能提供新的思路。
一、Geospatial(地理位置)
Geospatial类型Redis官方文档-Redis geospatial | Redis
Redis中的Geospatial是一个用于地理空间数据的功能模块,它可以存储和查询地理坐标、半径、矩形、多边形等地理空间对象。通过使用Geospatial,您可以对地理空间对象进行各种操作,例如计算两个地点之间的距离、查找位于给定半径内的地点、查找位于给定矩形或多边形内的地点等。
基础命令
- GEOADD adds a location to a given geospatial index (note that longitude comes before latitude with this command).
- GEOSEARCH returns locations with a given radius or a bounding box.
命令演示
1. 添加地理位置
Geospatial规则: 两级无法直接添加,我们一般会下载城市数据,直接通过java序一次性导入!
有效的经度从-180度到180度. 有效的纬度从-85.05112878度到85.05112878度。
参数:key 值:经度 纬度 名称
127.0.0.1:6379> GEOADD china:city 116.40 39.90 beijin
(integer) 1
127.0.0.1:6379> GEOADD china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> GEOADD china:city 106.50 29.53 chognqin 114.05 22.52 shenzheng
(integer) 2
127.0.0.1:6379> GEOADD china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
2. 获取城市地理位置
127.0.0.1:6379> GEOPOS china:city beijin #获取城市的经度和纬度
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> GEOPOS china:city shanghai
1) 1) "121.47000163793563843"
2) "31.22999903975783553"
3. 计算两个城市之间的距离
127.0.0.1:6379> GEODIST china:city beijin shanghai
"1067378.7564"
127.0.0.1:6379> GEODIST china:city beijin shanghai km #单位有m、km、mi、ft
"1067.3788"
4. 以给定的经纬度为中心,找出某一半径内的元素
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km #经度110,纬度30为中心,寻找半径1000km以内的城市
1) "chognqin"
2) "xian"
3) "shenzheng"
4) "hangzhou"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km count 2 #限制查询的数量
1) "chognqin"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord #显示经度纬度
1) 1) "chognqin"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) 1) "108.96000176668167114"
2) "34.25999964418929977"
3) 1) "shenzheng"
2) 1) "114.04999762773513794"
2) "22.5200000879503861"
4) 1) "hangzhou"
2) 1) "120.1600000262260437"
2) "30.2400003229490224"
5. 以城市为中心寻找其它城市
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijin 1000 km
1) "beijin"
2) "xian"
6. 将经纬度转化为字符串
127.0.0.1:6379> GEOHASH china:city beijin
1) "wx4fbxxfke0"
7. 使用Zset的命令来操作Geospatial
==Geospatial的底层实现原理就是Zset,可以用Zset命令来操作Geospatial==
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chognqin"
2) "xian"
3) "shenzheng"
4) "hangzhou"
5) "shanghai"
6) "beijin"
127.0.0.1:6379> ZREM china:city xian
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chognqin"
2) "shenzheng"
3) "hangzhou"
4) "shanghai"
5) "beijin"
二、 HyperLogLog(基数统计)
HyperLogLog类型Redis官方文档-HyperLogLog | Redis
HyperLogLog常用于大数据量的统计,比如页面访问量统计或者用户访问量统计。其实现最多使用 12 KB,并提供 0.81% 的标准误差。
什么是基数?
基数在数学中是集合论中刻画任意集合大小的一个概念。它表示一个集合中不同元素的个数。例如,集合{1, 2, 3, 3, 4, 5, 5, 6, 6, 6}中有9个元素,但其中不重复的元素只有1、2、3、4、5、6,所以它的基数是6。
基础命令
- PFADD adds an item to a HyperLogLog.
- PFCOUNT returns an estimate of the number of items in the set.
- PFMERGE combines two or more HyperLogLogs into one.
命令演示
1. 创建元素,并统计其中的个数
127.0.0.1:6379> PFADD mykey a b c d e f g h i j #创建一组元素
(integer) 1
127.0.0.1:6379> PFCOUNT mykey #统计基数数量
(integer) 10
127.0.0.1:6379> PFADD mykey2 i jz x c v b n m
(integer) 1
127.0.0.1:6379> PFCOUNT mykey2
(integer) 8
2. 合并元素
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2 #mykey 和mykey2合并为mykey3(并集)
OK
127.0.0.1:6379> PFCOUNT mykey3
(integer) 15
三、BitMaps
BitMaps类型Redis官方文档-Redis bitmaps | Redis
Redis中的BitMaps是一种基于位图的数据结构,它允许用户将位图存储为字符串,并对其进行位操作。
基础命令
- SETBIT sets a bit at the provided offset to ==0 or 1==.
- GETBIT returns the value of a bit at a given offset.
- BITOP lets you perform bitwise operations against one or more strings.
命令演示
1. 使用BitMaps来记录状态
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0
2. 查看状态
127.0.0.1:6379> GETBIT sign 1
(integer) 0
127.0.0.1:6379> GETBIT sign 3
(integer) 1
3. 统计状态
127.0.0.1:6379> BITCOUNT sign
(integer) 4