Inhaltsverzeichnis
SETBIT" >SETBIT
GETBIT" >GETBIT
BITCOUNT" >BITCOUNT
BITPOS" >BITPOS
BITOP" >BITOP
应用场景" >应用场景
用户行为记录器
用户上线统计
Heim Datenbank Redis Eine eingehende Analyse von Bitmaps in Redis (Bitmap)

Eine eingehende Analyse von Bitmaps in Redis (Bitmap)

Dec 02, 2021 am 10:17 AM
redis 位图

Dieser Artikel stellt Ihnen die Bitmap in Redis vor. Ich hoffe, er wird Ihnen hilfreich sein!

Eine eingehende Analyse von Bitmaps in Redis (Bitmap)

Die Bitmap von Redis ist ein Array, das aus mehreren Binärbits besteht. Jedes Binärbit im Array verfügt über einen entsprechenden Offset (beginnend bei 0). Bitmap. [Verwandte Empfehlungen: Redis-Video-Tutorial]

Tatsächlich ist Bitmap kein neuer Datentyp, der von Redis bereitgestellt wird, sondern eine Erweiterung des String-Typs. Daher können Bitmap-Befehle direkt für Tasten vom Typ Zeichenfolge verwendet werden, und Tasten, die von Bitmap-Befehlen bedient werden, können auch von Befehlen vom Typ Zeichenfolge bedient werden.

Zum Beispiel gibt es einen Zeichenfolgenschlüssel foo:

redis> set foo bar
Nach dem Login kopieren

1 Byte besteht aus 8 binären Bits, daher lautet die binäre Form des foo-Schlüssels:

Eine eingehende Analyse von Bitmaps in Redis (Bitmap)

SETBIT

Durch den Befehl SETBIT Der binäre Bit-Einstellungswert am Offset kann für den Bitmap-Offset angegeben werden, der größer oder gleich 0 sein muss und der Wert nur 0 oder 1 sein kann. Die zeitliche Komplexität dieses Befehls beträgt O(1).

SETBIT-TastenoffsetwertSETBIT key offset value

SETBIT 命令在对二进制位进行设置之后,将返回二进制位被设置之前的旧值作为结果。

假设现在想把 bar 变为 aar,只需如下两步操作:

redis> setbit foo 6 0
(integer) 1
redis> setbit foo 7 1
(integer) 0
redis> get foo"aar"
Nach dem Login kopieren

当执行 SETBIT 命令尝试对一个位图进行设置的时候,如果位图不存在,或者位图当前的大小无法满足,Redis 将对被设置的位图进行扩展,并将所有未被设置的二进制位的值初始化为 0。比如:

redis> setbit far 10 1
Nach dem Login kopieren

由于 far 并不存在,所以 Redis 会将 0~9 的二进制位设置为 0,因为 Redis 对位图的扩展操作是以字节为单位进行的,所以实际上 far 一共有 16 个二进制位,并不是 10 个,且 11~15 的二进制位也是 0。

基于这种情况,当指定的二进制位偏移量过大时,Redis 需要一次性分配完所有内存,这可能会造成 Redis 服务器阻塞。比如存储用户的性别,1 代表男性,0 代表女性,使用 ID 作为二进制偏移量,如果 ID 从 10000000001 开始的,就需要将用户 ID 减去 10000000000 再进行存储,否则会造成内存浪费。

GETBIT

使用 GETBIT 命令可以获取位图指定偏移量上的二进制位的值。此命令的时间复杂度是 O(1)。

GETBIT key offset

如果输入的偏移量超过了位图目前拥有的最大偏移量,将返回 0 作为结果。

BITCOUNT

通过 BITCOUNT 命令可以统计位图中值为 1 的二进制位数量。此命令的时间复杂度是 O(n)。

BITCOUNT key [start end]

在默认情况下,BITCOUNT 命令对位图包含的所有字节中的二进制位进行统计,也可以通过可选的 start 参数和 end 参数,让 BITCOUNT 只对指定字节范围内的二进制位进行统计(不是二进制偏移量)。比如,希望统计 ar 两个字节中值为 1 的二进制数量:

redis> bitcount foo 1 2
(integer) 7
Nach dem Login kopieren

start 和 end 参数也支持使用负数索引,下方的用法与上方的等效:

redis> bitcount foo -2 -1
(integer) 7
Nach dem Login kopieren

BITPOS

通过执行 BITPOS 命令,在位图中查找第一个被设置为指定值的二进制位,并返回这个二进制位的偏移量。

BITPOS key value [start end]

BITPOS 也接受可选的 start 参数和 end 参数,让 BITPOS 命令只在指定字节范围内的二进制位中进行查找。

redis> get foo"aar"redis> bitpos foo 1
(integer) 1
redis> bitpos foo 0
(integer) 0
redis> bitpos foo 0 1 2
(integer) 8
redis> bitpos foo 1 1 2
(integer) 9
redis> bitpos foo 1 -1 -1
(integer) 17
Nach dem Login kopieren

针对边界的处理:

  • 当尝试对一个不存在的位图或者一个所有位都被设置成了 0 的位图中查找值为 1 的二进制位时,BITPOS 命令将返回 -1 作为结果。
  • 如果在一个所有位都被设置成 1 的位图中查找值为 0 的二进制位,那么 BITPOS 命令将返回位图最大偏移量加上 1 作为结果

BITOP

通过 BITOP 命令,对一个或多个位图执行指定的二进制位运算,并将运算结果存储到指定的键中。

BITOP operation destkey key [key ...]

Nach dem Setzen des Binärbits gibt der SETBIT-Befehl den alten Wert zurück, bevor das Binärbit als Ergebnis gesetzt wird. 🎜🎜Angenommen, Sie möchten jetzt bar in aar ändern, benötigen Sie nur die folgenden zwei Schritte: 🎜
redis> set foo1 bar
OK
redis> set foo2 aar
OK
redis> bitop or res foo1 foo2
(integer) 3
redis> get res"car"
Nach dem Login kopieren
Nach dem Login kopieren
🎜Wenn Sie den SETBIT-Befehl ausführen, um zu versuchen, eine Bitmap festzulegen, wenn die Bitmap nicht vorhanden ist oder die aktuelle Größe der Bitmap nicht möglich ist Wenn Sie zufrieden sind, erweitert Redis die festgelegte Bitmap und initialisiert die Werte aller nicht gesetzten Binärbits auf 0. Zum Beispiel: 🎜rrreee🎜Da Far nicht existiert, setzt Redis die Binärbits von 0 auf 9 auf 0. Da Redis die Bitmap in Bytes erweitert, gibt es tatsächlich insgesamt 16 Fars. Es gibt keine 10 Binärziffern Binärziffern von 11 bis 15 sind ebenfalls 0. 🎜
🎜Wenn in dieser Situation der angegebene Binärbit-Offset zu groß ist, muss Redis den gesamten Speicher auf einmal zuweisen, was dazu führen kann, dass der Redis-Server blockiert. Wenn Sie beispielsweise das Geschlecht des Benutzers speichern, steht 1 für männlich und 0 für weiblich, wobei die ID als binärer Offset verwendet wird. Wenn die ID bei 10000000001 beginnt, müssen Sie vor dem Speichern 10000000000 von der Benutzer-ID abziehen, da es sonst zu einer Verschwendung kommt der Erinnerung. 🎜

🎜🎜GETBIT🎜🎜🎜🎜Verwenden Sie den GETBIT-Befehl, um den Wert des Binärbits am angegebenen Offset der Bitmap abzurufen. Die zeitliche Komplexität dieses Befehls beträgt O(1). 🎜🎜GETBIT-Schlüsseloffset🎜🎜Wenn der Eingabeoffset den maximalen Offset überschreitet, den die Bitmap derzeit besitzt, wird 0 als Ergebnis zurückgegeben. 🎜

🎜🎜BITCOUNT🎜🎜🎜🎜Mit dem Befehl BITCOUNT kann die Anzahl der Binärbits mit dem Wert 1 in der Bitmap gezählt werden. Die zeitliche Komplexität dieses Befehls beträgt O(n). 🎜🎜BITCOUNT key [start end]🎜🎜Standardmäßig zählt der BITCOUNT-Befehl die Binärbits in allen in der Bitmap enthaltenen Bytes. Er kann auch den optionalen Startparameter und Endparameter übergeben Zählt nur binäre Bits innerhalb des angegebenen 🎜Byte🎜-Bereichs (keine binären Offsets). Sie möchten beispielsweise die Anzahl der Binärzahlen mit dem Wert 1 in den beiden Bytes von ar zählen: 🎜rrreee🎜Die Start- und Endparameter unterstützen auch die Verwendung negativer Indizes. Die folgende Verwendung entspricht der oben genannten: 🎜 rrreee

🎜🎜BITPOS🎜🎜🎜🎜Suchen Sie durch Ausführen des BITPOS-Befehls das erste Binärbit, das auf den angegebenen Wert in der Bitmap gesetzt ist, und geben Sie den Offset dieses Binärbits zurück. 🎜🎜BITPOS-Schlüsselwert [Start Ende]🎜🎜BITPOS akzeptiert auch optionale Startparameter und Endparameter, sodass der BITPOS-Befehl nur in Binärbits innerhalb des angegebenen 🎜Byte🎜-Bereichs suchen kann. 🎜rrreee🎜Grenzverarbeitung: 🎜
  • Wenn Sie versuchen, ein binäres Bit mit dem Wert 1 in einer Bitmap zu finden, die nicht existiert, oder in einer Bitmap, in der alle Bits auf 0 gesetzt sind, gibt der BITPOS-Befehl -1 als zurück Ergebnis.
  • Wenn Sie in einer Bitmap, in der alle Bits auf 1 gesetzt sind, nach einem Binärbit mit dem Wert 0 suchen, gibt der Befehl BITPOS als Ergebnis den maximalen Offset der Bitmap plus 1 zurück
  • < /ul>

    🎜🎜BITOP🎜🎜🎜🎜Verwenden Sie den BITOP-Befehl, um bestimmte binäre Bitoperationen für eine oder mehrere Bitmaps auszuführen und die Operationsergebnisse im angegebenen Schlüssel zu speichern. 🎜🎜BITOP operation destkey key [key ...]🎜

    operation 参数的值可以是 AND、OR、XOR、NOT 中的任意一个,这 4 个值分别对应逻辑并、逻辑或、逻辑异或和逻辑非 4 种运算,其中 AND、OR、XOR 这 3 种运算允许用户使用任意数量的位图作为输入,而 NOT 运算只允许使用一个位图作为输入。BITOP 命令在将计算结果存储到指定键中之后,会返回被存储位图的字节长度。

    当 BITOP 命令在对两个长度不同的位图执行运算时,会将长度较短的那个位图中不存在的二进制位的值看作 0。

    redis> set foo1 bar
    OK
    redis> set foo2 aar
    OK
    redis> bitop or res foo1 foo2
    (integer) 3
    redis> get res"car"
    Nach dem Login kopieren
    Nach dem Login kopieren

    Eine eingehende Analyse von Bitmaps in Redis (Bitmap)

    注意:BITOP 可能是一个缓慢的命令,它的时间复杂度是 O(N),在处理长字符串时应注意一下效率问题。

    应用场景

    用户行为记录器

    用用户 ID 作为偏移量,若用户做了某种行为则通过 SETBIT 将二进制位设置为 1,通过 GETBIT 判断用户是否做了某种行为,通过 BITCOUNT 可以知道有多少用户执行了行为。

    用户上线统计

    可以使用 SETBIT 和 BITCOUNT 来实现,以用户 ID 作为 key ,假设今天是上线统计功能开放的第一天,ID 为 1 的用户上线后就通过 SETBIT 1 0 1。当要计算此用户的总共以来的上线次数时,使用 BITCOUNT 命令就可以得出的结果。

    使用这种方式存储数据,即使 10 年后,1个用户就只占用几百字节的内存,它的处理速度依然很快。如果 bitmap 数据比较大,建议将 bitmap 拆分成多个小的 bitmap 分别进行处理。

    更多编程相关知识,请访问:编程入门!!

    Das obige ist der detaillierte Inhalt vonEine eingehende Analyse von Bitmaps in Redis (Bitmap). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So erstellen Sie den Redis -Clustermodus So erstellen Sie den Redis -Clustermodus Apr 10, 2025 pm 10:15 PM

Der Redis -Cluster -Modus bietet Redis -Instanzen durch Sharding, die Skalierbarkeit und Verfügbarkeit verbessert. Die Bauschritte sind wie folgt: Erstellen Sie ungerade Redis -Instanzen mit verschiedenen Ports; Erstellen Sie 3 Sentinel -Instanzen, Monitor -Redis -Instanzen und Failover; Konfigurieren von Sentinel -Konfigurationsdateien, Informationen zur Überwachung von Redis -Instanzinformationen und Failover -Einstellungen hinzufügen. Konfigurieren von Redis -Instanzkonfigurationsdateien, aktivieren Sie den Cluster -Modus und geben Sie den Cluster -Informationsdateipfad an. Erstellen Sie die Datei nodes.conf, die Informationen zu jeder Redis -Instanz enthält. Starten Sie den Cluster, führen Sie den Befehl erstellen aus, um einen Cluster zu erstellen und die Anzahl der Replikate anzugeben. Melden Sie sich im Cluster an, um den Befehl cluster info auszuführen, um den Clusterstatus zu überprüfen. machen

So löschen Sie Redis -Daten So löschen Sie Redis -Daten Apr 10, 2025 pm 10:06 PM

So löschen Sie Redis -Daten: Verwenden Sie den Befehl Flushall, um alle Schlüsselwerte zu löschen. Verwenden Sie den Befehl flushdb, um den Schlüsselwert der aktuell ausgewählten Datenbank zu löschen. Verwenden Sie SELECT, um Datenbanken zu wechseln, und löschen Sie dann FlushDB, um mehrere Datenbanken zu löschen. Verwenden Sie den Befehl del, um einen bestimmten Schlüssel zu löschen. Verwenden Sie das Redis-Cli-Tool, um die Daten zu löschen.

So lesen Sie Redis -Warteschlange So lesen Sie Redis -Warteschlange Apr 10, 2025 pm 10:12 PM

Um eine Warteschlange aus Redis zu lesen, müssen Sie den Warteschlangenname erhalten, die Elemente mit dem Befehl LPOP lesen und die leere Warteschlange verarbeiten. Die spezifischen Schritte sind wie folgt: Holen Sie sich den Warteschlangenname: Nennen Sie ihn mit dem Präfix von "Warteschlange:" wie "Warteschlangen: My-Queue". Verwenden Sie den Befehl LPOP: Wischen Sie das Element aus dem Kopf der Warteschlange aus und geben Sie seinen Wert zurück, z. B. die LPOP-Warteschlange: my-queue. Verarbeitung leerer Warteschlangen: Wenn die Warteschlange leer ist, gibt LPOP NIL zurück, und Sie können überprüfen, ob die Warteschlange existiert, bevor Sie das Element lesen.

So verwenden Sie den Befehl Redis So verwenden Sie den Befehl Redis Apr 10, 2025 pm 08:45 PM

Die Verwendung der REDIS -Anweisung erfordert die folgenden Schritte: Öffnen Sie den Redis -Client. Geben Sie den Befehl ein (Verbschlüsselwert). Bietet die erforderlichen Parameter (variiert von der Anweisung bis zur Anweisung). Drücken Sie die Eingabetaste, um den Befehl auszuführen. Redis gibt eine Antwort zurück, die das Ergebnis der Operation anzeigt (normalerweise in Ordnung oder -err).

So verwenden Sie Redis Lock So verwenden Sie Redis Lock Apr 10, 2025 pm 08:39 PM

Um die Operationen zu sperren, muss die Sperre durch den Befehl setNX erfasst werden und dann den Befehl Ablauf verwenden, um die Ablaufzeit festzulegen. Die spezifischen Schritte sind: (1) Verwenden Sie den Befehl setNX, um zu versuchen, ein Schlüsselwertpaar festzulegen; (2) Verwenden Sie den Befehl Ablauf, um die Ablaufzeit für die Sperre festzulegen. (3) Verwenden Sie den Befehl Del, um die Sperre zu löschen, wenn die Sperre nicht mehr benötigt wird.

So konfigurieren Sie die Ausführungszeit der Lua -Skript in CentOS Redis So konfigurieren Sie die Ausführungszeit der Lua -Skript in CentOS Redis Apr 14, 2025 pm 02:12 PM

Auf CentOS -Systemen können Sie die Ausführungszeit von LuA -Skripten einschränken, indem Sie Redis -Konfigurationsdateien ändern oder Befehle mit Redis verwenden, um zu verhindern, dass bösartige Skripte zu viele Ressourcen konsumieren. Methode 1: Ändern Sie die Redis -Konfigurationsdatei und suchen Sie die Redis -Konfigurationsdatei: Die Redis -Konfigurationsdatei befindet sich normalerweise in /etc/redis/redis.conf. Konfigurationsdatei bearbeiten: Öffnen Sie die Konfigurationsdatei mit einem Texteditor (z. B. VI oder Nano): Sudovi/etc/redis/redis.conf Setzen Sie die LUA -Skriptausführungszeit.

So verwenden Sie die Befehlszeile der Redis So verwenden Sie die Befehlszeile der Redis Apr 10, 2025 pm 10:18 PM

Verwenden Sie das Redis-Befehlszeilen-Tool (REDIS-CLI), um Redis in folgenden Schritten zu verwalten und zu betreiben: Stellen Sie die Adresse und den Port an, um die Adresse und den Port zu stellen. Senden Sie Befehle mit dem Befehlsnamen und den Parametern an den Server. Verwenden Sie den Befehl Hilfe, um Hilfeinformationen für einen bestimmten Befehl anzuzeigen. Verwenden Sie den Befehl zum Beenden, um das Befehlszeilenwerkzeug zu beenden.

So optimieren Sie die Leistung von Debian Readdir So optimieren Sie die Leistung von Debian Readdir Apr 13, 2025 am 08:48 AM

In Debian -Systemen werden Readdir -Systemaufrufe zum Lesen des Verzeichnisinhalts verwendet. Wenn seine Leistung nicht gut ist, probieren Sie die folgende Optimierungsstrategie aus: Vereinfachen Sie die Anzahl der Verzeichnisdateien: Teilen Sie große Verzeichnisse so weit wie möglich in mehrere kleine Verzeichnisse auf und reduzieren Sie die Anzahl der gemäß Readdir -Anrufe verarbeiteten Elemente. Aktivieren Sie den Verzeichnis -Inhalt Caching: Erstellen Sie einen Cache -Mechanismus, aktualisieren Sie den Cache regelmäßig oder bei Änderungen des Verzeichnisinhalts und reduzieren Sie häufige Aufrufe an Readdir. Speicher -Caches (wie Memcached oder Redis) oder lokale Caches (wie Dateien oder Datenbanken) können berücksichtigt werden. Nehmen Sie eine effiziente Datenstruktur an: Wenn Sie das Verzeichnis -Traversal selbst implementieren, wählen Sie effizientere Datenstrukturen (z.

See all articles