Redis常用命令-史上最全最新版本(二)持续更新中……

Redis常用命令-史上最全最新版本(二)持续更新中……,第1张

Redis常用命令-史上最全最新版本(二)持续更新中……

Redis常用命令-史上最全最新版本(二)

四、三种特殊类型(geospatial、hperloglog、bitmaps)

1、geospatial (地理空间位置)2、hperloglog(基数)3、bitmaps(位图) 五、事物六、发布订阅
续集上一集: Redis常用命令-史上最全最新版本(一):https://blog.csdn.net/qq_17732903/article/details/122396378

四、三种特殊类型(geospatial、hperloglog、bitmaps) 1、geospatial (地理空间位置)

简介
      Redis3.2版本就推出了!这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人;主要适用于,朋友的定位,附近的人,打车距离计算等等与地理相关的场景。其实就是一个Zset集合的数据类型的特殊表现形式。
注意:很多中文文档里面介绍的都是地理空间位置(纬度、经度、名称),连中文官网翻译都是,其实不是的,而是先经度后纬度。按照命令语法翻译来是经度、纬度。即:地理空间位置(经度、纬度、名称)

geoadd key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]:

将指定的地理空间位置(经度、纬度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等 *** 作。
该命令以采用标准格式的参数x,y,所以经度必须在纬度之前。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引。规定范围:

有效的经度从-180度到180度。有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。由于是zset集合,那么也可以使用Zset集合的命令来 *** 作这些数据
示列:

127.0.0.1:6379> geoadd china:city 104.065735 30.659462 A # 添加一个城市A的地理位置
(integer) 1
127.0.0.1:6379> geoadd china:city 104.773447 29.352765 B
(integer) 1
127.0.0.1:6379> geoadd china:city 102.712251 25.040609 C
(integer) 1
127.0.0.1:6379> geoadd china:city 106.504962 29.533155 D
127.0.0.1:6379> zrange china:city 0 -1 # 使用zset集合的命令获取的地理位置的名字
1) "A"
2) "B"
3) "C"
4) "D"

geodist key member1 member2 [unit] :返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。
指定单位的参数 unit 必须是以下单位的其中一个:

m 表示单位为米。km 表示单位为千米。mi 表示单位为英里。ft 表示单位为英尺。

如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。
GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。

示列:

127.0.0.1:6379> geodist china:city A B km #表示A到B的直线距离
"160.5292"
127.0.0.1:6379> geodist china:city C D km #获取C到D的直线距离
"168.9100"

georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] :以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
在给定以下可选项时, 命令会返回额外的信息:

WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。WITHCOORD: 将位置元素的经度和维度也一并返回。WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。

命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:

ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。
在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。
虽然用户可以使用 COUNT 选项去获取前 N 个匹配元素,
但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。
但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。

示列:

127.0.0.1:6379> georadius china:city 100 20 1000 km withcoord #得到经度100 纬度20为圆心的成员
1) 1) "kunming"
   2) 1) "102.71225184202194214"
      2) "25.04060791987412671"
127.0.0.1:6379> georadius china:city 100 20 1000 km withdist
1) 1) "kunming"
   2) "626.0230"
127.0.0.1:6379> georadius china:city 100 20 1000 km withhash
1) 1) "kunming"
   2) (integer) 4021138666681726
127.0.0.1:6379> georadius china:city 100 20 3000 km count 2
1) "kunming"
2) "zigong"
127.0.0.1:6379> georadius china:city 100 20 3000 km asc
1) "kunming"
2) "zigong"
3) "chongqing"
4) "chengdu"
5) "wenzhou"
6) "hangzhou"
7) "beijing"
127.0.0.1:6379> georadius china:city 100 20 3000 km desc
1) "beijing"
2) "hangzhou"
3) "wenzhou"
4) "chengdu"
5) "chongqing"
6) "zigong"
7) "kunming"

georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] :
这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的,
而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点,指定成员的位置被用作查询的中心,注意返回值是包含自己本身的。其他用法和groraddius一模一样。
示列:

 127.0.0.1:6379> georadiusbymember china:city beijing 1000 km withcoord
1) 1) "beijing"
   2) 1) "116.40528291463851929"
      2) "39.9049884229125027"
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km withdist
1) 1) "beijing"
   2) "0.0000"
127.0.0.1:6379> georadiusbymember china:city beijing 2000 km withdist
1) 1) "zigong"
   2) "1581.7053"
2) 1) "chongqing"
   2) "1464.2210"
3) 1) "chengdu"
   2) "1517.9907"
4) 1) "wenzhou"
   2) "1380.8801"
5) 1) "hangzhou"
   2) "1122.4833"
6) 1) "beijing"
   2) "0.0000"

geopos key member [member ...] :从key里返回所有给定位置元素的位置(经度和纬度)。
给定一个sorted set表示的空间索引,密集使用 geoadd 命令,它以获得指定成员的坐标往往是有益的。
当空间索引填充通过 geoadd 的坐标转换成一个52位Geohash,所以返回的坐标可能不完全以添加元素的,但小的错误可能会出台。
因为 GEOPOS 命令接受可变数量的位置元素作为输入, 所以即使用户只给定了一个位置元素, 命令也会返回数组回复。
示列:

127.0.0.1:6379> geopos china:city zigong
1) 1) "104.77344900369644165"
   2) "29.35276427138213506"
127.0.0.1:6379> geopos china:city zigong aa #没有元素时返回空
1) 1) "104.77344900369644165"
   2) "29.35276427138213506"
2) (nil)

geohash key member [member ...] :该命令将返回11个字符的Geohash字符串,所以没有精度Geohash,损失相比,使用内部52位表示。
示列:

127.0.0.1:6379> geohash china:city zigong beijing
1) "wm4wbpt8nr0"
2) "wx4g0b7xrt0"
127.0.0.1:6379> geohash china:city zigong beijing aa
1) "wm4wbpt8nr0"
2) "wx4g0b7xrt0"
3) (nil)
2、hperloglog(基数)

简介
       Redis 在 2.8.9 版本添加了 HyperLogLog 结构,HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

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

pfadd key element [element ...] :将除了第一个参数以外的参数存储到以第一个参数为变量名的HyperLogLog结构中.
这个命令的一个副作用是它可能会更改这个HyperLogLog的内部来反映在每添加一个唯一的对象时估计的基数(集合的基数).
如果一个HyperLogLog的估计的近似基数在执行命令过程中发了变化, PFADD 返回1,否则返回0,如果指定的key不存在,这个命令会自动创建一个空的HyperLogLog结构(指定长度和编码的字符串).。
示列:

127.0.0.1:6379> pfadd hperloglog a b c d e f g h i j
(integer) 1

pfcount key [key ...] :统计元素的基数数量。

当参数为一个key时,返回存储在HyperLogLog结构体的该变量的近似基数,如果该变量不存在,则返回0.当参数为多个key时,返回这些HyperLogLog并集的近似基数,这个值是将所给定的所有key的HyperLoglog结构合并到一个临时的HyperLogLog结构中计算而得到的。注意返回的结果数据量太大了以后会有误差的,误差约0.81%。

示列:

127.0.0.1:6379> pfadd hperloglog1 h m c d e f l m k z 
(integer) 1
127.0.0.1:6379> pfcount hperloglog1
(integer) 9

pfmerge destkey sourcekey [sourcekey ...] :合并成一个新的hperloglog,基数接近于可见集合的并集。

示列:

127.0.0.1:6379> pfmerge hperlog hperloglog hperloglog1
OK
127.0.0.1:6379> pfcount hperlog
(integer) 15

适用场景:可以接受误差的统计地方,如访问量啊,粉丝数量啊什么的。

3、bitmaps(位图)

简介
       Bitmaps并不属于Redis中数据结构的一种,它的命令基于String *** 作,是set、get等一系列字符串 *** 作的一种扩展,与其不同的是,它提供的是位级别的 *** 作,从这个角度看,我们也可以把它当成是一种位数组、位向量结构。当我们需要存取一些boolean类型的信息时,Bitmap是一个非常不错的选择,在节省内存的同时也拥有很好的存取速度(getbit/setbit *** 作时间复杂度为O(1))。
       可以把Bitmaps想象成一个以位为单位数组,数组中的每个单元只能存0或者1,数组的下标在bitmaps中叫做偏移量。单个bitmaps的最大长度是512MB,即2^32个比特位。

setbit key offset value:设置值,只能存储0和1,适用二元判断类型,如果offset相同,会覆盖前面已存在的值。getbit key offset :获取值 获取键的第offset位的值(从0开始计算),如果返回0代表没有访问,返回1代表访问过,注意不存在1000,自然返回0。

示列:

127.0.0.1:6379> setbit bitmaps 0 0 #设置值
(integer) 0
127.0.0.1:6379> setbit bitmaps 1 1 #设置值
(integer) 0
127.0.0.1:6379> getbit bitmaps 0 #获取值
(integer) 0
127.0.0.1:6379> getbit bitmaps 1 
(integer) 1
127.0.0.1:6379> setbit bitmaps 1 0 #覆盖了原来的
(integer) 1
127.0.0.1:6379> getbit bitmaps 1
(integer) 0
#获取Bitmaps指定范围值为1的个数 ,start和and代表字节数,一个字节8位,1到3个字节就是索引在8到23之间
127.0.0.1:6379> bitcount bitmaps 1 10 
(integer) 0
127.0.0.1:6379> bitcount bitmaps 0 1 #表示获取偏移量(索引、下标) 在0-8之间为1的数量
(integer) 3

bitcount key [start] [end] :获取Bitmaps指定范围值为1的个数 ,start和and代表字节数,一个字节8位,1到3个字节表示就是索引在8到23之间 1个字节=8bit。bitpos key bit [start] [end] :第一个获取某种状态的偏移量 计算Bitmaps中第一个值为tergetBit的偏移量,注意字节是从0开始计算的。bitop operation destkey key [key ...] :bitop是一个复合 *** 作,它可以做多个Bitmaps的and(交集)、or(并集)、not(非)、xor(异或) *** 作,并将结果保存在destkey中。

示列:bitpos 和bitop 命令,眨眼一看似乎有点相近。别弄错了。

127.0.0.1:6379> setbit user:day1 0 1 #设置值
(integer) 0
127.0.0.1:6379> setbit user:day1 1 1
(integer) 0
127.0.0.1:6379> setbit user:day1 2 0
(integer) 0
127.0.0.1:6379> setbit user:day1 3 1
(integer) 0
127.0.0.1:6379> setbit user:day1 4 1
(integer) 0
127.0.0.1:6379> setbit user:day1 5 1
(integer) 0
127.0.0.1:6379> setbit user:day2 0 1
(integer) 0
127.0.0.1:6379> setbit user:day2 2 1
(integer) 0
127.0.0.1:6379> setbit user:day2 3 0
(integer) 0
127.0.0.1:6379> setbit user:day2 4 0
(integer) 0
127.0.0.1:6379> setbit user:day2 5 1
(integer) 0
127.0.0.1:6379> bitop and user:and user:day1 user:day2 # 求那些用户2天都打卡了或者说都访问了我的网站
(integer) 1

127.0.0.1:6379> bitop or user:or user:day1 user:day2 # 求这两天一共用多少员工或者用户打过卡或者访问过我的网站
(integer) 1

127.0.0.1:6379> bitpos user:day1 0  #得到第一个没有打卡的员工是那个,返回2,表示偏离量是2的那个位置第一次出现没打卡或者说为0
(integer) 2
127.0.0.1:6379> bitpos user:day1 1 1  #从第一个字节(偏移量(下标))8位开始查找第一个出现1的下标是那个。如果下标不够就返回-1
(integer) -1
127.0.0.1:6379> bitpos user:day1 1 0 #得到第一个打卡的员工是那个,返回0,表示偏离量是0的那个位置第一次出现打卡或者说为1
(integer) 0
127.0.0.1:6379> bitpos user:day1 1 0 3 #查找范围0-3个字节(0到24位)出现1的位置。
(integer) 0

适用场景:常常用来,做如签到、考勤、是否活跃、是否过期等等一些精准是否完成的统计的一些地方。

五、事物

待续……

六、发布订阅

待续…………

点赞收藏不迷路。
如果那个地方有错,私信我,我立马修改。谢谢!
感想:
          学习后,再整理好处还是很多的,可以达到巩固加深印象的作用,还可以当作笔记来使用,最重要的还是分享给大家,后续还会整理一些redis相关的,如主从复制、集群、缓存穿透、雪崩、持久化与哨兵模式的相关内容,欢迎关注转发点赞支持我继续做下去,陌生人,我们一起加油!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5703592.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存