首頁  >  文章  >  資料庫  >  Redis的特殊資料型別如何使用

Redis的特殊資料型別如何使用

WBOY
WBOY轉載
2023-06-03 11:10:081135瀏覽

    一、HyperLogLog 基底數統計

    1.1 什麼是基底數?

    我們直接透過一個例子就可以理解什麼是基數統計,例如資料集{1, 2, 3, 3, 5, 5,}, 那麼這個資料集的基數集是{1,2, 3,5}, 基數(不重複元素)為4。也就是說是不重複元素的個數。

    1.2 使用基數統計的好處

    每個 HyperLogLog 鍵只需要花費 12 KB 內存,就可以計算接近 2^64 個不同元素的基數。這和計算基數時,元素越多耗費記憶體就越多的集合形成鮮明對比。如果要從記憶體角度來比較的話Hyperloglog是首選。

    1.3 應用場景

        網頁的uv(一個人造訪一個網站多次,但是還是算做一個人)

    • 傳統的方式: set(因為set不允許重複,如果重複就覆蓋)保存用戶的id,然後就可以統計,set中元素數量作為標準判斷,這個方式如果保存大量的用戶id,就會比較麻煩並且在大型網站中會佔用大量的記憶體。我們的目的是為了計數,而不是保存用戶id。

    • 使用HyperLogLog:一個HyperLogLog 鍵只需要12KB,能夠計算的數量卻非常巨大,佔用的記憶體空間大大減少。

    1.4 注意事項 

    如果允許容錯(0.81% 錯誤率,計數的話可以忽略不計),那麼一定可以使用Hyperloglog!如果不允許容錯,就使用set或自己的資料類型即可!

    1.5 基本指令

    ##11PFADD key element [element ...]2PFCOUNT key [key ...]3PFMERGE destkey sourcekey [sourcekey ...]
    序號 指令及描述

    新增指定元素到HyperLogLog 中。
    傳回給定 HyperLogLog 的基數估算值。
    將多個HyperLogLog 合併為一個HyperLogLog

    #1.6 使用

    127.0.0.1:6379> pfadd mykey1 a b c d e f   #给第一组添加数据
    (integer) 1
    127.0.0.1:6379> pfcount mykey1  #统计mykey1的基数数量
    (integer) 6
    127.0.0.1:6379> pfadd mykey2 e e f j  #给第二组添加数据
    (integer) 1
    127.0.0.1:6379> pfcount mykey2     #统计mykey2的基数数量
    (integer) 3
    127.0.0.1:6379> pfmerge mykey3 mykey1 mykey2   # 合并两组 mykey1 mykey2 => mykey3 并集
    OK
    127.0.0.1:6379> pfcount mykey3    #统计mykey3的基数数量
    (integer) 7

    二、Geospatial 地理位置

    2.1 介紹

      Redis3.2 版本開始推出的Geospatial,可以推算地理位置的訊息,兩地之間的距離,方圓幾裡的人。
    • 2.2 使用場景

    • ????朋友定位

    • ???? 看附近的人

    ???? 搭計程車距離計算

    2.3 基本指令序號GEOADD key 經度緯度地點名稱GEOPOS key 地點名稱GEODIST key 地點1 地點2 單位以給定的經緯度為中心, 找出某一半徑內的元素GEORADIUSBYMEMBER key 地點距離數值單位#GEOHASH key 地點1 地點2zrange key start stopzrem key 地點
    #指令及描述 1
    將指定的地理空間位置(緯度、經度、名稱)加入指定的key中 2
    從key傳回所有給定位置元素的位置(經度和緯度)。 3
    傳回兩個給定位置之間的距離,如果兩個位置之間的其中一個不存在, 那麼指令傳回空值。

    4

    GEORADIUS key 經度緯度範圍數值單位
    5
    #找出位於指定範圍內的元素,中心點是由給定的位置元素決定 6
    將傳回11個字元的Geohash字串,如果兩個字串越接近,那麼則距離越近。 7
    取得指定key中座標資訊 8
    刪除指定key下指定目標的資料############

    查询地点经纬度:

    城市经纬度查询-国内城市经度纬度在线查询工具

    2.4 详细讲解

    2.4.1 GEOADD

    作用:添加地理位置

    规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!

    语法:GEOADD key 经度 纬度 地点名称

    注意事项

    有效的经度从-180度到180度。

    有效的纬度从-85.05112878度到85.05112878度。

    当坐标位置超出上述指定范围时,该命令将会返回一个错误。

    使用

    #添加单个信息
    127.0.0.1:6379> geoadd address 116.708463 23.37102 shantou   
    (integer) 1
    #添加多个信息
    127.0.0.1:6379> geoadd address 116.405285 39.904989 beijin 121.472644 31.231706 shanghai
    (integer) 2
    2.4.2 GEOPOS

    作用:获得指定地点的位置信息(经纬度)

    语法:GEOPOS key 地点名称

    使用

    127.0.0.1:6379> geopos address beijin   #获得北京的地理位置
    1) 1) "116.40528291463851929"  #经度
       2) "39.9049884229125027"   #纬度
    2.4.3 GEODIST

    作用:返回两个给定位置之间的距离,如果两个位置之间的其中一个不存在, 那么命令返回空值。

    语法:GEODIST key 地点1 地点2 单位

    单位参数:

    • m 表示单位为米。

    • km 表示单位为千米。

    • mi 表示单位为英里。

    • ft 表示单位为英尺。

    如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

    使用:

    127.0.0.1:6379> geodist address beijin shanghai km  #查询北京与上海之间的距离
    "1067.5980"
    2.4.4 GEORADIUS

    作用:以给定的经纬度为中心, 找出某一半径内的元素。

    语法:GEORADIUS key 经度 纬度  范围数值  单位

    使用:

    #查找以116,39这个经纬度为中心,寻找方圆1500km的城市
    127.0.0.1:6379> georadius address 116 39 1500 km
    1) "shanghai"
    2) "beijin"
     
    # 显示到中间距离的位置
    127.0.0.1:6379> georadius address 116 39 1500 km withdist
    1) 1) "shanghai"
       2) "996.7313"
    2) 1) "beijin"
       2) "106.5063"
     
    #显示他人的定位信息
    127.0.0.1:6379> georadius address 116 39 1500 km withcoord
    1) 1) "shanghai"
       2) 1) "121.47264629602432251"
          2) "31.23170490709807012"
    2) 1) "beijin"
       2) 1) "116.40528291463851929"
          2) "39.9049884229125027"
     
    #筛选出最近的城市以及显示其距离
    127.0.0.1:6379> georadius address 116 39 1500 km withdist withcoord count 1
    1) 1) "beijin"
       2) "106.5063"
       3) 1) "116.40528291463851929"
          2) "39.9049884229125027"
     
     
    #筛选最近两个城市以及显示其距离
    127.0.0.1:6379> georadius address 116 39 1500 km withdist withcoord count 2
    1) 1) "beijin"
       2) "106.5063"
       3) 1) "116.40528291463851929"
          2) "39.9049884229125027"
    2) 1) "shanghai"
       2) "996.7313"
       3) 1) "121.47264629602432251"
          2) "31.23170490709807012"
    2.4.5 GEORADIUSBYMEMBER

    作用:找出位于指定范围内的元素,中心点是由给定的位置元素决定。

    语法:GEORADIUSBYMEMBER  key 地点  距离数值  单位

    使用:

    #找出距离北京方圆1500km内的城市
    127.0.0.1:6379> georadiusbymember address beijin 1500 km
    1) "shanghai"
    2) "beijin"
    2.4.6 GEOHASH

    作用:将返回11个字符的Geohash字符串,如果两个字符串越接近,那么则距离越近。

    语法:GEOHASH  key 地点1  地点2

    ???? 使用:

    127.0.0.1:6379> geohash address beijin shantou
    1) "wx4g0b7xrt0"
    2) "ws4uzy8d030"
    2.4.7 ZRANGE

    作用:获得指定key中坐标信息。

    语法:zrange  key  start stop

    使用:

    127.0.0.1:6379> zrange address 0 -1
    1) "shantou"
    2) "shanghai"
    3) "beijin"
    2.4.8 ZREM

    作用:删除指定key下指定目标的数据。

    语法:zrem  key 地点

    使用:

    127.0.0.1:6379> zrem address shanghai
    (integer) 1

    三、BitMap

    介绍

    BitMap是通过一个bit位来表示某个元素对应的值或者状态,只有0 和 1 两个状态,其中的key就是对应元素本身。365 天 = 365 bit ,1字节 = 8bit ,也就是说统计一年的用户状态只需要46 个字节左右,所以其能够节省很大的空间。

    应用场景

    • (1)用户签到

    • (2)统计活跃用户

    • (3)用户在线状态(在线就设置为1,不在线就设置为0)

    使用

    • 需求:记录 周一到周日的打卡

    • 1:表示有打卡

    • 0:表示没有打卡

    127.0.0.1:6379> setbit sign 0 1
    (integer) 0
    127.0.0.1:6379> setbit sign 1 1
    (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 0
    (integer) 0

    查看某一天是否有打卡

    127.0.0.1:6379> getbit sign 3
    (integer) 1
    127.0.0.1:6379> getbit sign 6
    (integer) 0

    统计本周的打卡记录

    127.0.0.1:6379> bitcount sign
    (integer) 4

    以上是Redis的特殊資料型別如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除