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


续集上一集: 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)
  • GEOSEARCH key [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius m|km|ft|mi] [BYBOX width height m|km|ft|mi] [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]:
    返回使用地理空间信息填充的排序集的成员,这些成员GEOADD位于给定形状指定的区域的边界内。该命令对命令进行了扩展GEORADIUS,因此除了在圆形区域内搜索外,它还支持在矩形区域内搜索。应使用此命令代替已弃用的GEORADIUSGEORADIUSBYMEMBER命令。

    查询的中心点由以下强制选项之一提供:
    FROMMEMBER: 使用给定存member在于排序集中的位置。
    FROMLONLAT:使用给定的longitude和latitude位置。

    查询的形状由以下强制选项之一提供:
    BYRADIUS: 类似GEORADIUS,根据给定的圆形区域内搜索。
    BYBOX:在轴对齐的矩形内搜索,由和确定。
    该命令可以选择使用以下选项返回附加信息:

    WITHDIST: 也返回返回的物品到指定中心点的距离。距离返回的单位与为半径或高度和宽度参数指定的单位相同。
    WITHCOORD: 同时返回匹配项的经度和纬度。
    WITHHASH:还以 52 位无符号整数的形式返回项目的原始 geohash 编码排序集分数。这仅对低级 hack 或调试有用,否则对一般用户来说没什么兴趣。
    默认情况下,匹配项未排序返回。要对它们进行排序,请使用以下两个选项之一:

    ASC:相对于中心点,从最近到最远对返回的项目进行排序。
    DESC:相对于中心点,从最远到最近对返回的项目进行排序。

代码命令示例:

redis:6379> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis:6379> GEOADD Sicily 12.758489 38.788135 "edge1" 17.241510 38.788135 "edge2"
(integer) 2
redis:6379> GEOSEARCH Sicily FROMLONLAT 15 37 BYRADIUS 200 km ASC
1) "Catania"
2) "Palermo"
redis:6379> GEOSEARCH Sicily FROMLONLAT 15 37 BYBOX 400 400 km ASC WITHCOORD WITHDIST
1) 1) "Catania"
   2) "56.4413"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"
2) 1) "Palermo"
   2) "190.4424"
   3) 1) "13.36138933897018433"
      2) "38.11555639549629859"
3) 1) "edge2"
   2) "279.7403"
   3) 1) "17.24151045083999634"
      2) "38.78813451624225195"
4) 1) "edge1"
   2) "279.7405"
   3) 1) "12.7584877610206604"
      2) "38.78813451624225195"
redis:6379> 

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事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
  • 没有事物隔离级别、不保证原子性、没有回滚机制。但是单条命令具有原子性,只要能够入队成功,其他命令执行失败不会影响其他命令的执行。
  • 共有3个阶段:开启事物—>命令入队—>执行事物(执行队列里面的命令集或者放弃执行队列的命令)

命令

  • multi :开启事物的一个标记。事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。
  • exec :执行队列(事物块)里的命令集。假如某些)key 正处于 WATCH 命令的监视之下,且事务块中有和这些key 相关的命令,那么 EXEC 命令只在这些key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断(abort)。
  • discard 取消事务,放弃执行事务块内的所有命令。如果正在使用 WATCH 命令监视某些 key,那么取消所有监视,等同于执行命令 UNWATCH
  • watch key [key ...] :监视一个或多个key ,如果在事务执行之前这个或这些)key 被其他命令所改动,那么事务将被打断。
  • unwatch :取消watch命令监视的所有key。

情况说明:

  1. 如果执行了exec或者discard命令,那么就不用执行unwatch命令,也就是说执行了exec或者discard命令后,watch所监视的key将无效,如果还要监视,那么必须重新执行watch命令来监视需要监视的key。
  2. 如果在入队命令的时候报错了,那么很抱歉,你是虽然还可以成功入队其他命令的,不过做的是无用功,因为执行exec命令的时候会报错——有人犯错集体受罚
  3. 如果事物在入队写命令的时候没有报错,但是执行(exec)的时候报错(类似于java的运行时异常)的,此时谁有错谁无法执行成功谁报错——冤有头债有主
  4. 如果watch命令监视的key出现先了变化,那么此时事物也是无法执行成功的,此时会返回一个nil。实际开发中,基本上使用事物都会使用watch来监听。
  5. 其实redis的watch命令就充当着乐观锁的一个作用。

六、发布订阅

简介:
       redis发布消息订阅系统就是一个消息通信模式,发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。说实话,实际工作开发时,如果要使用消息通宵,一般都会使用消息中间件,如ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ,来实现消息通信,不过redis还是可以用来实现简单的消息通信的。

命令

  • publish channel message :将信息 message 发送到指定的频道 channel ,返回接收到信息 message 的订阅者数量。
  • pubsub subcommand [argument [argument ...]] :是一个查看订阅与发布系统状态的内省命令, 它由数个不同格式的子命令组成。
    • pubsub channels [pattern] :列出当前的活跃频道。活跃频道指的是那些至少有一个订阅者的频道, 订阅模式的客户端不计算在内。
      pattern 参数是可选的:
      • 如果不给出 pattern 参数,那么列出订阅与发布系统中的所有活跃频道。
      • 如果给出 pattern 参数,那么只列出和给定模式 pattern 相匹配的那些活跃频道。
    • pubsub numsub [channel-1 ... channel-N]返回给定频道的订阅者数量, 订阅模式的客户端不计算在内。
    • pubsub numpat :返回订阅模式的数量。
  • psubscribe pattern [pattern ...] :订阅一个或多个符合给定模式的频道。每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。
  • punsubscribe [pattern [pattern ...]] :指示客户端退订所有给定模式。
    如果没有模式被指定,也即是,一个无参数的 PUNSUBSCRIBE 调用被执行,那么客户端使用 PSUBSCRIBE 命令订阅的所有模式都会被退订。在这种情况下,命令会返回一个信息,告知客户端所有被退订的模式。
  • subscribe channel [channel ...] :订阅给定的一个或多个频道的信息。
  • unsubscribe [channel [channel …]] :取消订阅一个或多个频道信息。

资源:

  1. redis英文官网:https://redis.io
  2. redis中文网:中文网其实就是翻译成中文的,也不是最新的,如果英语好个人建议直接看英文官网,不过反应会很慢,你懂的。

如果那个地方有错,私信我,我立马修改。谢谢!

Redis常用命令-史上最全最新版本(一):主要包含了redis服务相关的命令、五大基础数据类型命令。
感想:
          学习后,再整理好处还是很多的,可以达到巩固加深印象的作用,还可以当作笔记来使用,最重要的还是分享给大家,后续还会整理一些redis相关的,如主从复制、集群、缓存穿透、雪崩、持久化与哨兵模式的相关内容,陌生人,我们一起加油!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值