目次
BitMap とは
使用シナリオ 1: ユーザー サインイン
ホームページ データベース Redis Redisにおけるビットマップの利用状況を分析する(サンプルシナリオの説明)

Redisにおけるビットマップの利用状況を分析する(サンプルシナリオの説明)

Jul 17, 2021 pm 04:02 PM
bitmap Redisクラスター

Redis では、set、get、およびその他のコマンドがよく使用されます。注意していれば、類似したコマンドがいくつかあることに気づきましたか?コマンドは setbit と getbit と呼ばれますが、何に使用されますか?

BitMap とは

# ビットを使用して要素に対応する値またはステータスを表し、キーは対応する要素そのものです。 8 ビットでバイトを形成できることがわかっているため、ビットマップ自体によりストレージ スペースが大幅に節約されます。

Redis のビットマップ

Redis は、バージョン 2.2.0 以降、setbit、getbit、bitcount などのビットマップ関連のコマンドをいくつか追加しました。これは新しいコマンドですが、setbit などのコマンドは set の単なる拡張であるため、新しいデータ型は追加されません。

setbit コマンドの紹介

コマンド SETBIT キー オフセット値

Complexity O(1)
オフセットのキーの値 (文字列) を設定またはクリアしますのビット値 (0 または 1 のみ)。

スペース占有と、初めてスペースを割り当てるのに必要な時間

2010 MacBook Pro では、オフセットは 2^32-1 (512MB 割り当て) ~ 300ms、オフセットが 2^30-1 (128MB 割り当て) の場合は ~80ms、オフセットが 2^28-1 (32MB 割り当て) の場合は ~30ms、オフセットが 2^26-1 (8MB 割り当て) の場合は 8ms かかります。

おおよそのスペース占有計算式は次のとおりです: ($offset/8/1024/1024)MB

使用シナリオ 1: ユーザー サインイン

多くの Web サイトではチェックイン機能が提供されており (ここではデータの実装は考慮されていません)、過去 1 か月のチェックイン状況を表示する必要があります。ビットマップを使用するにはどうすればよいでしょうか?暗号は一言で判明!

<?php
$redis = new Redis();
$redis->connect('127.0.0.1');

//用户uid
$uid = 1;

//记录有uid的key
$cacheKey = sprintf("sign_%d", $uid);

//开始有签到功能的日期
$startDate = '2017-01-01';

//今天的日期
$todayDate = '2017-01-21';

//计算offset
$startTime = strtotime($startDate);
$todayTime = strtotime($todayDate);
$offset = floor(($todayTime - $startTime) / 86400);

echo "今天是第{$offset}天" . PHP_EOL;

//签到
//一年一个用户会占用多少空间呢?大约365/8=45.625个字节,好小,有木有被惊呆?
$redis->setBit($cacheKey, $offset, 1);

//查询签到情况
$bitStatus = $redis->getBit($cacheKey, $offset);
echo 1 == $bitStatus ? '今天已经签到啦' : '还没有签到呢';
echo PHP_EOL;

//计算总签到次数
echo $redis->bitCount($cacheKey) . PHP_EOL;

/**
* 计算某段时间内的签到次数
* 很不幸啊,bitCount虽然提供了start和end参数,但是这个说的是字符串的位置,而不是对应"位"的位置
* 幸运的是我们可以通过get命令将value取出来,自己解析。并且这个value不会太大,上面计算过一年一个用户只需要45个字节
* 给我们的网站定一个小目标,运行30年,那么一共需要1.31KB(就问你屌不屌?)
*/
//这是个错误的计算方式
echo $redis->bitCount($cacheKey, 0, 20) . PHP_EOL;
ログイン後にコピー

使用シナリオ 2: アクティブ ユーザーのカウント

時間をキャッシュキーとして使用し、ユーザー ID をオフセットします。その日にアクティブな場合は、次のように設定します。 1

次に、特定の日/月/年のアクティブ ユーザーを計算する方法 (当面は、統計期間中にオンラインになった 1 日だけをアクティブと呼ぶことに同意します) を行うには、次の redis コマンド ## を使用してください。 #Command BITOP 操作 destkey key [key .. .]
説明: バイナリ ビットを格納する 1 つ以上の文字列キーに対してビット操作を実行し、結果を destkey に保存します。
注: BITOP コマンドは、AND、OR、NOT、および /1024=6MB

# 4 つの操作の任意のパラメーターをサポートします。使用シナリオ 3: ユーザーのオンライン ステータス

私は少し前にプロジェクトを開発しましたが、相手は現在のユーザーがオンラインかどうかを問い合わせるためのインターフェースを私に提供してくれました。相手がどうやってるか分からないので自分で考えました ビットマップを使うのが省スペースで効率的な方法です 必要なキーは 1 つだけで、ユーザー ID はオフセットされます オンラインであれば、は 1 に設定され、オンラインでない場合は 1.0 に設定されます。上記のシナリオと同様に、5000W ユーザーには 6MB のスペースのみが必要です。

//日期对应的活跃用户
$data = array(
'2017-01-10' => array(1,2,3,4,5,6,7,8,9,10),
'2017-01-11' => array(1,2,3,4,5,6,7,8),
'2017-01-12' => array(1,2,3,4,5,6),
'2017-01-13' => array(1,2,3,4),
'2017-01-14' => array(1,2)
);

//批量设置活跃状态
foreach($data as $date=>$uids) {
  $cacheKey = sprintf("stat_%s", $date);
  foreach($uids as $uid) {
    $redis->setBit($cacheKey, $uid, 1);
  }
}

$redis->bitOp('AND', 'stat', 'stat_2017-01-10', 'stat_2017-01-11', 'stat_2017-01-12') . PHP_EOL;
//总活跃用户:6
echo "总活跃用户:" . $redis->bitCount('stat') . PHP_EOL;

$redis->bitOp('AND', 'stat1', 'stat_2017-01-10', 'stat_2017-01-11', 'stat_2017-01-14') . PHP_EOL;
//总活跃用户:2
echo "总活跃用户:" . $redis->bitCount('stat1') . PHP_EOL;

$redis->bitOp('AND', 'stat2', 'stat_2017-01-10', 'stat_2017-01-11') . PHP_EOL;
//总活跃用户:8
echo "总活跃用户:" . $redis->bitCount('stat2') . PHP_EOL;
ログイン後にコピー
推奨学習: 「redis ビデオ チュートリアル

以上がRedisにおけるビットマップの利用状況を分析する(サンプルシナリオの説明)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ThinkPHP6 を使用した Redis クラスターの実装 ThinkPHP6 を使用した Redis クラスターの実装 Jun 20, 2023 am 08:36 AM

インターネットの急速な発展に伴い、高い同時実行性の問題がますます顕著になってきました。この問題に対応するために、Redis の登場が重要な解決策となっており、従来のリレーショナル データベースにおけるメモリの読み書きによる過剰な読み書きの負荷の問題を解決します。ただし、単一ノード Redis は、同時実行性が高い状況では依然としてパフォーマンスのボトルネックがあるため、Redis クラスターを使用する必要があります。この記事では、ThinkPHP6 を使用して Redis クラスターを実装する方法について説明します。 1. Redis Cluster の概要 Redis Cluster は、Redis が提供する公式クラスターです。

Redis を介して PHP データ キャッシュのクラスター デプロイメントを実装するにはどうすればよいですか? Redis を介して PHP データ キャッシュのクラスター デプロイメントを実装するにはどうすればよいですか? Aug 10, 2023 am 08:13 AM

Redis を介して PHP データ キャッシュのクラスター デプロイメントを実装するにはどうすればよいですか?はじめに: PHP アプリケーションが高い同時実行性と大規模なトラフィックに直面すると、データベースのパフォーマンスのボトルネックが発生することがよくありますが、このとき、キャッシュ テクノロジを使用すると、システムのパフォーマンスと同時実行性を大幅に向上させることができます。 Redis は、高性能のメモリ内キー/値データベースとして、キャッシュ ソリューションの実装に広く使用されています。この記事では、パフォーマンスとスケーラビリティをさらに向上させるために、Redis を介して PHP データ キャッシュのクラスター デプロイメントを実装する方法を紹介します。 1. Redis Cluster Redis の概要

Redis および Node.js クラスター ソリューション: 高可用性を実現する方法 Redis および Node.js クラスター ソリューション: 高可用性を実現する方法 Jul 29, 2023 pm 05:42 PM

Redis および Node.js のクラスター ソリューション: 高可用性を実現する方法 はじめに: インターネットの急速な発展に伴い、データ処理はますます大規模かつ複雑になってきました。システムの高可用性とスケーラビリティを確保するには、分散クラスター アーキテクチャを使用して、大量のデータの保存と処理のニーズに対処する必要があります。高性能のインメモリ データベースとしての Redis を、バックエンド プログラミング言語としての Node.js と組み合わせることで、可用性の高い分散クラスター ソリューションを構築できます。この記事ではRedisとNode.jsを使って実装する方法を紹介します。

Redis の Redis クラスターと PHP の使用方法 Redis の Redis クラスターと PHP の使用方法 May 15, 2023 pm 03:22 PM

Redis は、強力なメモリ内キーと値のペアのストレージ データベースです。通常の RDBMS (リレーショナル データベース管理システム) よりも高いパフォーマンスと優れた拡張性を備えています。 Redis の利点の 1 つは、分散システムのコア テクノロジとして使用できることです。この記事では、Redis Cluster の概念と、PHP で Redis Cluster を使用する方法について説明します。 Redis クラスターとは何ですか?簡単に言えば、Redis クラスターは複数の Redis インスタンスの集合体です。 Redis クラスターでできること

Go 言語でデータベース関数を学習し、Redis クラスターで読み取りおよび書き込み操作を実装します。 Go 言語でデータベース関数を学習し、Redis クラスターで読み取りおよび書き込み操作を実装します。 Jul 29, 2023 pm 12:21 PM

Go 言語でデータベース機能を学習し、Redis クラスターで読み取りおよび書き込み操作を実装します。 はじめに: データベースは今日のインターネット アプリケーションに不可欠な部分であり、Go 言語はシンプルで効率的なプログラミング言語として、優れたデータベース操作機能も備えています。この記事では、Go 言語でデータベース関数を使用し、Redis クラスターで読み取りおよび書き込み操作を実装する方法を紹介します。 1. Go 言語でのデータベース機能 Go 言語でのデータベース操作は主に、database/sql パッケージを通じて実装されます。このパッケージは基本的なデータを提供します

Redis と PHP クラスター ソリューション: 高可用性とスケーラビリティを実現する方法 Redis と PHP クラスター ソリューション: 高可用性とスケーラビリティを実現する方法 Jul 30, 2023 pm 08:51 PM

Redis と PHP クラスター ソリューション: 高可用性とスケーラビリティを実現する方法 はじめに: Redis は、高速でスケーラブルなアプリケーションを構築するためによく使用される、オープン ソースの高性能インメモリ データベースです。一般的なサーバー側スクリプト言語として、PHP を Redis と併用して、高可用性とスケーラビリティのクラスター ソリューションを実現できます。この記事では、Redis と PHP を使用して高可用性とスケーラブルなクラスターを構築する方法を紹介し、コード例を通じて詳しく説明します。 1. Redis クラスター Re の構築、インストール、設定

Redis および Julia 言語を使用して高可用性クラスター機能を実装する方法 Redis および Julia 言語を使用して高可用性クラスター機能を実装する方法 Sep 20, 2023 am 10:58 AM

Redis および Julia 言語を使用して高可用性クラスター機能を実装する方法 はじめに: インターネット ビジネスの発展に伴い、システムの可用性に対する要件はますます高くなっています。障害が発生した場合でもシステムがサービスを提供し続けることができるようにするために、高可用性はさまざまな業界で重要な要件の 1 つになっています。この記事では、Redis 言語と Julia 言語を使用して高可用性クラスター機能を実装する方法を紹介し、具体的なコード例を示します。 1. 高可用性クラスターとは何ですか? 高可用性クラスターは、複数のノードをまとめてシステム全体を形成します。

Redis でビットマップを使用する方法 Redis でビットマップを使用する方法 May 31, 2023 pm 09:40 PM

日々の開発プロセスでは、アクセスする必要がある bool 型データがよくあります。たとえば、ユーザーが 1 年間にチェックインした回数を記録する場合、サインインしている場合は 1、サインインしていない場合は 0 になります。 Key-Value をストレージに使用すると、各ユーザーが 365 回記録されることになり、ユーザーが数億人になると、必要なストレージ容量が非常に大きくなります。この問題を解決するには、redis でビットマップを使用します。ビットマップも文字列データ型に属します。 Redis の文字列型の値は、最大 512MB のコンテンツを保存できます。各文字列は複数のバイトで構成され、各バイトは 8 ビットで構成されます。ビットマップ構造は「ビット」を使用して記憶を実現し、ビットを 0 または 1 に設定することでデータ アクセスの目的を達成します。

See all articles