String字符串:
set k1 keyName nx:只有keyName不存在的时候才能设置成功,可实现分布式锁。
set k1 keyName xx :只有keyName存在的时候才能设置成功,即更新操作。
mset k1 a k2 b
mget k1 k2
批量set和get。
append k1 "hello":将"hello"追加到k1字符串的后面。
getrange k1 3 4:取k1的第4个到第五个字符。
getrange k1 3 -1:取k1的第4个到最后一个字符,利用正负向索引。
setrange k1 3 hahahaha:从第四个位置开始覆盖。
strlen k1:获取字符串的长度
incr k1:k1 加 1
decr k1: k1 减 1
incrby k1 66:k1 加 66
decrby k1 66:k1 减 66
bitmap:
setbit k1 1 1: 即 01000000 -> 对应ASCII码: @
setbit k1 7 1: 即 01000010 -> 对应ASCII码: A
setbit k1 9 1:即 01000010 01000000 get k1为: A@
-----
eg:当前k1为:01000010 01000000
(01234567 8910111213141516)
bitpos:查找0或1第一次出现的二进制位置
bitpos k1 1 0 0:1
bitpos k1 1 1 1:9
bitpos k1 0 1:1
bitcount:统计在字节范围内1出现的次数
bitcount k1 0 0:2
bitcount k1 1 1:1
bitcount k1 0 1:3
------
给定k1 : 01000001 (A) k2:01000010 (B)
bitop and andkey k1 k2:k1与k2按位与运算
get andkey:@
bitop or orkey k1 k2:k1与k2按位或运算
get orkey:C
bitmap应用场景1:
假设一个电商平台要统计一个用户的登录天数,统计时间随机,怎么做最优?
如果用传统的MySQL关系型数据库当然可以实现,但是在数据量巨大的互联网巨头公司的用户量的需求下,显然太耗费空间与性能。
使用setbit实现:
setbit tom 0 1 : tom第1天登录
setbit tom 6 1 : tom第7天登录
setbit tom 364 1 : tom第365天登录
如果要统计tom最后两周的登录天数?
bitcount tom -2 -1 即可。
占用空间:
每个人365/8=46B
假设一千万用户,则需要46B*10000000=460M
bitmap应用场景2:
假设电商平台(2亿用户)过节大促,给每个当天登录的用户都发放一份礼物,求需要多少份礼物?(即:活跃用户统计)
将上面的k v 反转即可
即:日期作为key 登录的userId为value
setbit 20210101 1 1:2021年1月1日 id为1的登录了
setbit 20210102 1 1:2021年1月2日 id为1的登录了
setbit 20210102 7 1:2021年1月2日 id为7的也登录了
此时统计这两天的登录用户数:
bitop or destkey 20210101 20210102
bitcount destkey 0 -1