Rumah  >  Artikel  >  pangkalan data  >  Analisis mendalam bitmap dalam Redis (bitmap)

Analisis mendalam bitmap dalam Redis (bitmap)

青灯夜游
青灯夜游ke hadapan
2021-12-02 10:17:184934semak imbas

Artikel ini akan memperkenalkan anda kepada peta bit dalam Redis, saya harap ia akan membantu anda!

Analisis mendalam bitmap dalam Redis (bitmap)

Peta bit Redis ialah tatasusunan yang terdiri daripada berbilang bit perduaan Setiap bit perduaan dalam tatasusunan mempunyai offset yang sepadan (daripada Bermula dari 0), offset ini boleh digunakan untuk. beroperasi pada satu atau lebih bit binari yang dinyatakan dalam peta bit. [Cadangan berkaitan: Tutorial video Redis]

Sebenarnya, bitmap bukanlah jenis data baharu yang disediakan oleh Redis, ia adalah lanjutan daripada jenis rentetan. Oleh itu, arahan bitmap boleh digunakan secara langsung pada kekunci jenis rentetan, dan kekunci yang dikendalikan oleh arahan bitmap juga boleh dikendalikan oleh perintah jenis rentetan.

Sebagai contoh, terdapat kunci rentetan foo:

redis> set foo bar

1 bait terdiri daripada 8 bit binari, jadi bentuk binari kekunci foo ialah:

Analisis mendalam bitmap dalam Redis (bitmap)

SETBIT

Melalui arahan SETBIT, anda boleh menentukan nilai tetapan bit binari pada offset untuk bitmap mestilah lebih besar daripada Sama dengan 0, nilai hanya boleh 0 atau 1. Kerumitan masa arahan ini ialah O(1).

SETBIT key offset value

Selepas menetapkan bit binari, arahan SETBIT akan mengembalikan nilai lama sebelum bit binari ditetapkan sebagai hasilnya.

Andaikan sekarang anda ingin menukar bar menjadi aar, anda hanya memerlukan dua langkah berikut:

redis> setbit foo 6 0
(integer) 1
redis> setbit foo 7 1
(integer) 0
redis> get foo"aar"

Apabila melaksanakan perintah SETBIT untuk cuba menetapkan bitmap, jika bitmap melakukannya tidak wujud , atau saiz semasa bitmap tidak dapat dipenuhi, Redis akan mengembangkan peta bit yang ditetapkan dan memulakan nilai semua bit binari yang tidak ditetapkan kepada 0. Contohnya:

redis> setbit far 10 1

Memandangkan jauh tidak wujud, Redis akan menetapkan bit perduaan daripada 0 kepada 9 kepada 0. Kerana Redis mengembangkan peta bit dalam bait, sebenarnya Terdapat 16 digit perduaan jauh di atas, bukan 10, dan digit binari 11~15 juga 0.

Berdasarkan situasi ini, apabila mengimbangi bit binari yang ditentukan terlalu besar, Redis perlu memperuntukkan semua memori sekaligus, yang mungkin menyebabkan pelayan Redis disekat. Contohnya, apabila menyimpan jantina pengguna, 1 mewakili lelaki dan 0 mewakili perempuan, menggunakan ID sebagai offset binari Jika ID bermula dari 10000000001, anda perlu menolak 10000000000 daripada ID pengguna sebelum menyimpannya, jika tidak, ia akan menyebabkan pembaziran. ingatan.

GETBIT

Gunakan arahan GETBIT untuk mendapatkan nilai bit binari pada offset peta bit yang ditentukan. Kerumitan masa arahan ini ialah O(1).

GETBIT key offset

Jika offset input melebihi offset maksimum bitmap pada masa ini, 0 akan dikembalikan sebagai hasilnya.

BITCOUNT

Arahan BITCOUNT boleh digunakan untuk mengira bilangan bit binari dengan nilai 1 dalam peta bit. Kerumitan masa arahan ini ialah O(n).

BITCOUNT key [start end]

Secara lalai, arahan BITCOUNT mengira bit perduaan dalam semua bait yang terkandung dalam bitmap Ia juga boleh dikonfigurasikan dengan parameter mula dan parameter akhir pilihan sahaja bit binari dalam julat bait yang ditentukan (bukan ofset binari). Sebagai contoh, anda ingin mengira bilangan nombor perduaan dengan nilai 1 dalam dua bait ar:

redis> bitcount foo 1 2
(integer) 7

Parameter mula dan akhir juga menyokong penggunaan indeks negatif Penggunaan di bawah ialah bersamaan dengan di atas:

redis> bitcount foo -2 -1
(integer) 7

BITPOS

Dengan melaksanakan arahan BITPOS, cari bit binari pertama yang ditetapkan kepada nilai yang ditentukan dalam bitmap dan kembalikan bit binari ini mengimbangi.

BITPOS key value [start end]

BITPOS juga menerima parameter permulaan dan parameter akhir pilihan, membenarkan arahan BITPOS untuk mencari hanya dalam bit binari dalam julat bait yang ditentukan.

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

Pemprosesan sempadan:

  • Apabila cuba mencari nilai 1 dalam peta bit yang tidak wujud atau peta bit dengan semua bit ditetapkan kepada 0 bit binari, Perintah BITPOS akan mengembalikan -1 sebagai hasilnya.
  • Jika bit binari dengan nilai 0 ditemui dalam peta bit dengan semua bit ditetapkan kepada 1, arahan BITPOS akan mengembalikan offset maksimum bitmap tambah 1 sebagai hasilnya

BITOP

Gunakan arahan BITOP untuk melaksanakan operasi bit binari yang ditentukan pada satu atau lebih bitmap dan simpan hasil operasi dalam kunci yang ditentukan.

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"

Analisis mendalam bitmap dalam 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 分别进行处理。

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

Atas ialah kandungan terperinci Analisis mendalam bitmap dalam Redis (bitmap). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam