In the daily development process, there are often some bool type data that need to be accessed. For example, if you record the number of times a user has checked in within a year, the number of times a user has checked in is 1, and the number of times a user has not signed is 0. If key-value is used for storage, each user will be recorded 365 times. When there are hundreds of millions of users, the storage space required will be very huge. To solve this problem, you can use bitmaps in redis.
Bitmap (bitmap) also belongs to the string data type. A string type value in Redis can store up to 512 MB of content. Each string is composed of multiple bytes, and each byte is composed of 8 Bits. The bitmap structure uses "bits" to achieve storage. It achieves the purpose of data access by setting bits to 0 or 1, which greatly increases the number of value storage, and its storage upper limit is 2^32.
A bitmap is essentially an ordinary byte string, that is, a bytes array. This bitmap array can be processed by using the getbit/setbit command, and its structure is as follows:
Bitmaps are usually used for some specific applications, such as tracking user check-ins or logins frequency. The above picture shows the number of check-ins a user has come to the website within 10 days. 1 represents a sign-in and 0 represents a non-check-in. This way, the user's activity level can be easily counted. Using a bitmap to record each record only occupies one bit, which greatly reduces the memory space usage compared to using strings directly.
Redis officials also conducted an experiment. They simulated a system with 128 million users, and then used Redis bitmaps to count the "average number of daily users". The final time spent was approximately is 50ms and only takes up 16 MB of memory.
If string type storage is used, a website must record a user's check-in record for one year, then 365 key-value pairs are required. If bitmap storage is used, 1 is stored when the user signs in, otherwise 0 is stored. In the end, a storage result like 00010101... will be generated, in which each day's record only occupies one bit, and one year is 365 bits, which is about 46 bytes. If you only want to count the number of days that users have signed in, then count the number of 1.
The advantage of bitmap operations is that compared to strings, it is not only highly efficient, but also very space-saving.
The bit array of Redis is automatically expanded. If an offset position is set beyond the existing content range, the bit array will be automatically expanded.
is used to set or clear the value of a certain bit, and its return value is the value stored in the original bit. In the initial state, all bits of key are 0. The example is as follows:
SETBIT key offset value
where offset represents the offset, starting from 0. Examples are as follows:
127.0.0.1:6379> SET user:1 a OK #设置偏移量offset为0 127.0.0.1:6379> SETBIT user:1 0 1 (integer) 0 #当对应位的字符是不可打印字符,redis会以16进制形式显示 127.0.0.1:6379> GET user:1 "\xe1"
is used to get the value of a certain bit. Examples are as follows:
127.0.0.1:6379> GETBIT user:1 0 (integer) 1
When the offset offset is greater than the length of the string, or when the key does not exist, 0 is returned.
redis> EXISTS bits (integer) 0 redis> GETBIT bits 100000 (integer) 0
counts the number of values that are 1 in the specified position interval. The syntax format is as follows:
BITCOUNT key [start end]
The example is as follows:
127.0.0.1:6379> BITCOUNT user:1 (integer) 8
Just specify the start and end parameters to count only specific bytes. The start and end parameters are similar to the parameters of the GETRANGE command. Negative numbers can be used. For example, -1 represents the first digit from the last, and -2 represents the second digit from the last. .
Perform bit operations on one or more string keys that store binary bits, and save the results to destkey
The operation can It is any one of the four types: AND, OR, NOT, The result is saved to destkey.
BITOP OR destkey key [key …] , perform logical OR on one or more keys, and save the result to - destkey .
BITOP XOR destkey key [key …], perform logical XOR on one or more keys, and save the result to destkey.
BITOP NOT destkey key, perform logical negation on the given key and save the result to destkey.
Except for NOT operations, other operations can accept one or more keys as input.
Statistics on active users for the day
Each user creates a bitmap key, based on a certain day, and the number of subsequent days from this day is the offset,
The above is the detailed content of How to use Bitmap in Redis. For more information, please follow other related articles on the PHP Chinese website!