ホームページ  >  記事  >  データベース  >  Redis の特殊なデータ型についての深い理解: カーディナリティ統計、ビットマップ、地理的位置

Redis の特殊なデータ型についての深い理解: カーディナリティ統計、ビットマップ、地理的位置

青灯夜游
青灯夜游転載
2021-12-22 09:59:402327ブラウズ

この記事では、Redis の 3 つの特殊なデータ型 (カーディナリティ統計、ビットマップ、地理的位置) について説明します。お役に立てば幸いです。

Redis の特殊なデータ型についての深い理解: カーディナリティ統計、ビットマップ、地理的位置

5 つの基本データ型に加えて、Redis には HyperLogLogs (カーディナリティ統計)、Bitmaps# という 3 つの特別なデータ型もあります。 ## (ビットマップ) および 地理空間 (地理的位置)。 [関連する推奨事項: Redis ビデオ チュートリアル ]

HyperLogLogs (カーディナリティ統計)

Redis バージョン 2.8.9 では、Hyperloglog データ構造が更新されました。

  • #基数とは何ですか?

  • 例: A = {1, 2, 3, 4, 5}、B = {3, 5, 6, 7, 9};カーディナリティ (非反復要素) = 1、2、4、6、7、9; (フォールト トレランスが許可されます。つまり、特定のエラーが許容されます)

  • HyperLogLogs カーディナリティ統計はどのような問題を解決するために使用されますか?

  • この構造は、登録された IP の数、毎日アクセスされる IP の数、リアルタイム UV などのさまざまなカウントをカウントするために非常にメモリを節約できます。ページ、オンライン ユーザーの数、共通の友達の数。

  • #その利点は何ですか?

  • たとえば、大規模な Web サイトの場合、毎日 100 万の IP が存在し、1 つの IP が 15 バイトを消費すると大まかに計算すると、100 万の IP は 15M になります。 HyperLogLog の各キーは Redis の 12K のコンテンツを占有し、理論上のストレージはおよそ 2^64 の値に近づきます。保存されたコンテンツが何であっても、これはカーディナリティの推定に基づくアルゴリズムであり、より正確にカーディナリティを推定することしかできません。少量の固定メモリを使用して、コレクション内の固有の要素を保存および識別します。さらに、この推定のベースは必ずしも正確ではなく、標準誤差 0.81% の近似値です (IP 番号統計や UV など、一定の誤差を許容できるビジネス シナリオの場合、これは無視できます) )。

  • # 関連コマンド use

    127.0.0.1:6379> pfadd key1 a b c d e f g h i	# 创建第一组元素
    (integer) 1
    127.0.0.1:6379> pfcount key1					# 统计元素的基数数量
    (integer) 9
    127.0.0.1:6379> pfadd key2 c j k l m e g a		# 创建第二组元素
    (integer) 1
    127.0.0.1:6379> pfcount key2
    (integer) 8
    127.0.0.1:6379> pfmerge key3 key1 key2			# 合并两组:key1 key2 -> key3 并集
    OK
    127.0.0.1:6379> pfcount key3
    (integer) 13

    ビットマップ (ビット ストレージ)

ビットマップはビットマップ データ構造であり、記録のためにバイナリ ビットを操作し、0 と 1 の 2 つの状態のみを持ちます。

  • どんな問題を解決するために使用されますか?

    例: ユーザー情報、アクティブ、非アクティブの統計!ログインではなく、ログインしてください!チェックインする、チェックインしないでください!
  • ビットマップ
は両方の状態で使用できます。

1 年間のチェックイン ステータスを保存するにはどれくらいのメモリが必要ですか? 365 日 = 365 ビット 1 バイト = 8 ビット 46 バイト程度です。

    # 関連コマンドを使用します
  • ビットマップを使用して月曜日からのチェックインを記録します日曜日へ!月曜日: 1 火曜日: 0 水曜日: 0 木曜日: 1...

    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 0
    (integer) 0
    127.0.0.1:6379> setbit sign 5 0
    (integer) 0
    127.0.0.1:6379> setbit sign 6 1
    (integer) 0
  • 特定の日にチェックインがあるかどうかを確認してください。
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 5
(integer) 0

統計操作、記録された日数を数えてください!

127.0.0.1:6379> bitcount sign # 统计这周的打卡记录,就可以看到是否有全勤!
(integer) 3

地理空間 (地理的位置)

Redis の Geo は Redis 3.2 バージョンでリリースされました! この関数は地理的位置情報 (2 つの場所の間の距離、半径、マイルからの人々) を計算できます。離れて。

#geoadd

地理位置情報を追加

127.0.0.1:6379> geoadd china:city 118.76 32.04 manjing 112.55 37.86 taiyuan 123.43 41.80 shenyang
(integer) 3
127.0.0.1:6379> geoadd china:city 144.05 22.52 shengzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3

ルール

2 つのレベルを直接追加することはできません。通常は都市データをダウンロードします (この Web サイトで GEO をクエリできます: http://www.jsons.cn/lngcode)。

有効な経度の範囲は -180 度から 180 度までです。

有効な緯度の範囲は、-85.05112878 度から 85.05112878 度までです。

# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
127.0.0.1:6379> geoadd china:city 39.90 116.40 beijin
(error) ERR invalid longitude,latitude pair 39.900000,116.400000
  • geopos

指定されたメンバーの経度と緯度を取得します

127.0.0.1:6379> geopos china:city taiyuan manjing
1) 1) "112.54999905824661255"
   1) "37.86000073876942196"
2) 1) "118.75999957323074341"
   1) "32.03999960287850968"
現在の位置を取得します。これは座標値である必要があります!

geodist

存在しない場合は、空を返します 単位は次のとおりです

m

km

マイル
  • フィート フィート
  • 127.0.0.1:6379> geodist china:city taiyuan shenyang m
    "1026439.1070"
    127.0.0.1:6379> geodist china:city taiyuan shenyang km
    "1026.4391"
  • georadius

##近くにいる人==> 近くにいるすべての人の住所、場所、半径を取得します 指定人数を取得

127.0.0.1:6379> georadius china:city 110 30 1000 km			以 100,30 这个坐标为中心, 寻找半径为1000km的城市
1) "xian"
2) "hangzhou"
3) "manjing"
4) "taiyuan"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "xian"
   2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord withdist count 2
1) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
2) 1) "manjing"
   2) "864.9816"
   3) 1) "118.75999957323074341"
      2) "32.03999960287850968"

パラメータキー経度緯度半径単位[表示結果の経度緯度][表示結果の距離][表示結果の数]

#georadiusbymember

指定されたメンバーの特定の半径内にある他のメンバーを表示します

127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km
1) "manjing"
2) "taiyuan"
3) "xian"
127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km withcoord withdist count 2
1) 1) "taiyuan"
   2) "0.0000"
   3) 1) "112.54999905824661255"
      2) "37.86000073876942196"
2) 1) "xian"
   2) "514.2264"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
パラメータは georadius と同じです

geohash (あまり使用されません)

このコマンドは 11 文字のハッシュ文字列を返します

127.0.0.1:6379> geohash china:city taiyuan shenyang
1) "ww8p3hhqmp0"
2) "wxrvb9qyxk0"
Convert 2 次元の経度と緯度を 1 次元の文字列に変換します。2 つの文字列が近いほど、距離は近くなります。

Underlying

geo底层的实现原理实际上就是Zset, 我们可以通过Zset命令来操作geo

127.0.0.1:6379> type china:city
zset

查看全部元素 删除指定的元素

127.0.0.1:6379> zrange china:city 0 -1 withscores
 1) "xian"
 2) "4040115445396757"
 3) "hangzhou"
 4) "4054133997236782"
 5) "manjing"
 6) "4066006694128997"
 7) "taiyuan"
 8) "4068216047500484"
 9) "shenyang"
1)  "4072519231994779"
2)  "shengzhen"
3)  "4154606886655324"
127.0.0.1:6379> zrem china:city manjing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "xian"
2) "hangzhou"
3) "taiyuan"
4) "shenyang"
5) "shengzhen"

更多编程相关知识,请访问:编程视频!!

以上がRedis の特殊なデータ型についての深い理解: カーディナリティ統計、ビットマップ、地理的位置の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。