1. ホーム
  2. データベース
  3. レディス

Redisにおけるビットマップの説明

2022-01-15 18:45:37

1. ビットマップとは?

<ブロッククオート

ビットマップはビットマップとも呼ばれ、何かの状態を表すビットのことです。ビットは2進数なので、0と1の2つの状態しかないことは皆さんご存知でしょう。

2. なぜビットマップが必要なのか?

<ブロッククオート

ビッグデータのためにビットマップがありますが、各ビットは2つの状態しか表すことができないので、ビッグデータのそれぞれについて2つの状態しかない場合に限ります。
10億人のユーザーの活動をカウントする状態を直接見てみましょう。

3. 事例紹介

3.1、ケースの説明

<ブロッククオート

何億人ものユーザーがいるシステムで、1日ごとのユーザーのログイン回数を数える必要がある場合、どのように解決すればいいでしょうか。
前提条件:9月19日に添え字が100、101、102、103の4人のユーザがログインしていること
9月20日に100、101、102のユーザーがログインしている状態に設定されている
質問です。
1. 9月19日にログインした人のうち、何人が連れ去られたのか?
A:直接入手すればいい。
2. 9月19日と9月20日に連続してログインした人数を取り出してください。
A:両日のデータを取得&Amp;演算します。
3. 9月19日から9月20日の間に1日にログインした人数を取り出してください。
A: 両日ともデータを取って|算出しています。

3.2. 解答

3.2.1, 解決策1 - 従来のデータベースを使って解決する

<ブロッククオート

従来のデータベースを使用して統計を取る必要がある場合、テーブルを作成し、ユーザーがログインしたら、そのユーザーのid、ユーザーがログインした時間などのレコードをテーブルに挿入する必要があります。しかし、問題は、1日ごとのデータ量が非常に大きく、日々の活動をカウントする効率が悪いので、この解決策は考えられません。

3.2.2, 解決策2 - ビットマップソリューションの使用

ユーザーログインの状態は2つしかないので、ビットマップを使用することができます
例えば、0は未ログイン、1はログインしていることを意味します。

// Set the system to have four users with subscripts 100, 101, 102, and 103 logged in on September 19 start
127.0.0.1:6379> setbit login_09_19 100 1
(integer) 0
127.0.0.1:6379> setbit login_09_19 101 1
(integer) 0
127.0.0.1:6379> setbit login_09_19 102 1
(integer) 0
127.0.0.1:6379> setbit login_09_19 103 1
(integer) 0
// Set four users with subscripts 100, 101, 102, and 103 to be logged in on September 19 end

// Set the system to have 100, 101, and 102 users logged in on September 20 start
127.0.0.1:6379> setbit login_09_20 100 1
(integer) 0
127.0.0.1:6379> setbit login_09_20 101 1
(integer) 0
127.0.0.1:6379> setbit login_09_20 102 1
(integer) 0
// Set the subscript 100, 101, and 102 to be logged in on September 20 end

// Find out how many people logged into the system on September 19. start
127.0.0.1:6379> bitcount login_09_19
(integer) 4
// Find out how many people logged into the system on September 19th? end

// Find out how many people logged into the system on September 19 and September 20 consecutively. start
127.0.0.1:6379> bitop and login_in_09_19_20:and login_09_19 login_09_20
(integer) 13
127.0.0.1:6379> bitcount login_in_09_19_20:and
(integer) 3
// Find out how many people logged into the system on September 19 and September 20 consecutively. end

// Find out how many people logged in on either September 19 or September 20. start
127.0.0.1:6379> bitop or login_in_09_19_20:or login_09_19 login_09_20
(integer) 13
127.0.0.1:6379> bitcount login_in_09_19_20:or
(integer) 4
// Find out how many people logged in on any day between September 19 and September 20. end


Redisにおけるbitmapについての記事は以上です。Redisのbitmapについては、Script Houseの過去記事を検索するか、下記の関連記事を引き続き閲覧してください。