美文网首页
Redis其他数据类型详解

Redis其他数据类型详解

作者: 武三水 | 来源:发表于2020-06-09 21:27 被阅读0次

    Redis其他数据类型

    打开Xshell之后,如何打开6379?

    [root@iZ2ze5s090y2d3q50krshoZ ~]# redis-cli -a 密码
    

    1、bitmap 位图

    help @string

    GETBIT key offset
    含义:对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
      summary: Returns the bit value at offset in the string value stored at key    
      since: 2.2.0
    举例:
    # 对不存在的 key 或者不存在的 offset 进行 GETBIT, 返回 0
    127.0.0.1:6379> EXISTS bit
    (integer) 0
    127.0.0.1:6379> GETBIT bit 113
    (integer) 0
    
    # 对已存在的 offset 进行 GETBIT
    127.0.0.1:6379> SETBIT bit 113 1
    (integer) 0
    127.0.0.1:6379> GETBIT bit 113
    (integer) 1
    
    
    SETBIT key offset value
      summary: Sets or clears the bit at offset in the string value stored at key
      since: 2.2.0
      
    含义:对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
    举例:
    redis> SETBIT bit 10086 1
    (integer) 0
    
    redis> GETBIT bit 10086
    (integer) 1
    
    redis> GETBIT bit 100   # bit 默认被初始化为 0
    (integer) 0
    
    BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
      summary: Perform arbitrary bitfield integer operations on strings
      since: 3.2.0
    
    含义:对字符串执行任意位于位域整数操作
    
    
    
    BITCOUNT key [start end]
      summary: Count set bits in a string
      since: 2.6.0
    
    含义:得到总数
    举例:
    127.0.0.1:6379> SETBIT mykeys 10 1
    (integer) 0
    127.0.0.1:6379> SETBIT mykeys 11 1
    (integer) 0
    127.0.0.1:6379> SETBIT mykeys 21 1
    (integer) 0
    127.0.0.1:6379> SETBIT mykeys 10 2 
    (integer) 0
    127.0.0.1:6379> BITCOUNT mykeys
    (integer) 4
    
     BITOP operation destkey key [key ...]
      summary: Perform bitwise operations between strings
      since: 2.6.0
    含义:在字符串之间执行位操作
    

    公司记录某个人一个月的打卡情况
    一年365天怎么记录一个人在某个网站的登录,活跃情况

    两个状态的都能用这种方法进行性能压榨

    都是操作二进制位来进行记录,就只有0 和 1 两个状态!
    365 天 = 365 bit 1字节 = 8bit 46 个字节左右!
    测试登录次数
    127.0.0.1:6379> setbit login 0 1
    (integer) 0
    127.0.0.1:6379> setbit login 3 1
    (integer) 0
    127.0.0.1:6379> bitcount login 0 -1
    (integer) 2
    
    周一:1 周二:0 周三:0 周四:1 ......
    查看某一天是否有打卡!
    统计操作,统计 打卡的天数!
    

    2、Geospatial 地理位置

    127.0.0.1:6379> help @geo
    
      GEOADD key longitude latitude member [longitude latitude member ...]
      summary: Add one or more geospatial items in the geospatial index represented using a sorted set
      since: 3.2.0
    
      GEODIST key member1 member2 [unit]
      summary: Returns the distance between two members of a geospatial index
      since: 3.2.0
    
      GEOHASH key member [member ...]
      summary: Returns members of a geospatial index as standard geohash strings
      since: 3.2.0
    
      GEOPOS key member [member ...]
      summary: Returns longitude and latitude of members of a geospatial index
      since: 3.2.0
    
    /**初学者知道就行//
      GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
      summary: Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point
      since: 3.2.0
      含义:查询标识地理空间索引的排序集,以获取与某一点的最大距离的成员
    
      GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
      summary: Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a member
      since: 3.2.0
    

    朋友的定位,附近的人,打车距离计算?
    在Redis3.2 版本推出了Geospatial ! 这个功能可以推算地理位置的信息,两地之间的距离。
    可以查询一些测试数据:http://www.jsons.cn/lngcodeinfo/0706D99C19A781A3/

    给定几个城市的经纬度:

    太原:112.549248,37.857014

    北京:116.405285,39.904989

    成都:104.065735,30.659462

    武汉:114.298572,30.584355

    西安: 108.948024,34.263161

    洛阳:112.434468,34.663041

    getadd
    # getadd 添加地理位置
    # 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
    # 有效的经度从-180度到180度。
    # 有效的纬度从-85.05112878度到85.05112878度。
    
    # 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
    # 127.0.0.1:6379> geoadd china:city 39.90 116.40 beijing
    (error) ERR invalid longitude,latitude pair 39.900000,116.400000
    # 参数 key 值()
    
    #插入城市的经纬度
    127.0.0.1:6379> geoadd china:city 112.549284 37.857014 taiyuan
    127.0.0.1:6379> geoadd china:city 116.405285 39.904989 beijing
    127.0.0.1:6379> geoadd china:city 104.065735 30.659462 chengdu
    127.0.0.1:6379> geoadd china:city 114.298572 30.584355 wuhan
    127.0.0.1:6379> geoadd china:city 108.948024 34.263161 xian
    127.0.0.1:6379> geoadd china:city 112.434468 34.663041 luoyang
    
    # 获取指定的城市的经度和纬度!
    127.0.0.1:6379> geopos china:city beijing
    1) 1) "116.40528291463851929"
       2) "39.9049884229125027"
    127.0.0.1:6379> geopos china:city beijing luoyang
    1) 1) "116.40528291463851929"
       2) "39.9049884229125027"
    2) 1) "112.43446558713912964"
       2) "34.6630405862934694"
    
    
    #两人之间的距离!
    #单位:
    #m 表示单位为米。
    #km 表示单位为千米。
    #mi 表示单位为英里。
    #ft 表示单位为英尺。
    #georadius 以给定的经纬度为中心, 找出某一半径内的元素
    #我附近的人? (获得所有附近的人的地址,定位!)通过半径来查询!
    #获得指定数量的人,200
    #所有数据应该都录入:china:city ,才会让结果更加请求!
    #查询太原到北京的距离
    127.0.0.1:6379> geodist china:city beijing taiyuan
    "404109.2735"
    127.0.0.1:6379> geodist china:city beijing taiyuan km
    "404.1093"
    
    #找某个地点(微信定位)方圆1000km内的城市,附近的朋友
    127.0.0.1:6379> georadius china:city 110 32 500 km
    1) "xian"
    2) "luoyang"
    3) "wuhan"
    
    
    # 找出位于指定元素周围的其他元素!
    127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
    1) "taiyuan"
    2) "beijing"
    3) "xian"
    4) "luoyang"
    
    # 查看地图中全部的元素
    127.0.0.1:6379> ZRANGE china:city 0 -1
    1) "chengdu"
    2) "xian"
    3) "luoyang"
    4) "wuhan"
    5) "taiyuan"
    6) "beijing"
    
    # 移除指定元素!
    127.0.0.1:6379> zrem china:city beijing 
    (integer) 1
    

    3、 Hyperloglog(基数)

    推荐一个博客:

    关于这个算法的一个博客:https://www.jianshu.com/p/55defda6dcd2

    场景如网页的 UV (一个人访问一个网站多次,但是还是算作一个人!)
    通过使用一种特殊的算法,而达到使用一个固定空间达到统计基数的作用。
    这种算法有误差,是一种概率学问题。0.81% 错误率! 但对于统计UV这类的任务,是可以忽略不计的!
    测试使用
    如果允许有误差,那么一定可以使用 Hyperloglog !
    如果不允许误差,就使用 set 或者自己的数据类型即可!

    127.0.0.1:6379> help @hyperloglog
    
      PFADD key element [element ...]
      summary: Adds the specified elements to the specified HyperLogLog.
      since: 2.8.9
    
      PFCOUNT key [key ...]
      summary: Return the approximated cardinality of the set(s) observed by the HyperLogLog at key(s).
      since: 2.8.9
    
      PFMERGE destkey sourcekey [sourcekey ...]
      summary: Merge N different HyperLogLogs into a single one.
      since: 2.8.9
    
    
    127.0.0.1:6379> pfadd pf a b c d e f g
    (integer) 1
    127.0.0.1:6379> pfadd pf2 c d e f g
    (integer) 1
    127.0.0.1:6379> pfcount pf pf2
    (integer) 7
    127.0.0.1:6379> pfmerge a pf pf2
    OK
    

    相关文章

      网友评论

          本文标题:Redis其他数据类型详解

          本文链接:https://www.haomeiwen.com/subject/ubzetktx.html