1.Append
Append key value
如果key已经存在并且是一个字符串,append命令将value追加到key原来的值末尾。
如果key不存在,append就简单地将给定key设为value,就像执行set key value一样。
返回值:
追加value之后,key中字符串的长度
命令:
# 对不存在的 key 执行 APPEND
redis> EXISTS myphone # 确保 myphone 不存在
(integer) 0
redis> APPEND myphone "nokia" #对不存在key进行APPEND等同于SET myphone "nokia"
(integer) 5 # 字符长度
# 对已存在的字符串进行 APPEND
redis> APPEND myphone " - 1110" # 长度从 5 个字符增加到 12 个字符
(integer) 12
redis> GET myphone
"nokia - 1110"
2.Bitcount
Bitcount key [start] [end]
计算给定字符串中,被设置为1的比特位的数量
一般情况下,给定的整个字符串都会被进行计数,通过指定额外的start或end参数,可以让计数只在特定的位上进行。
Start和end参数设置和getrange命令类似,都可以使用负数值:比如-1表示最后一个字节,-2表示倒数第二个字节,以此类推。
不存在的key被当成是空字符串来处理,因此一个不存在的key进行bigcount操作,结果为0。
返回值:
被设置为1的位的数量。
命令:
redis> BITCOUNT bits
(integer) 0
redis> SETBIT bits 0 1 # 0001
(integer) 0
redis> BITCOUNT bits
(integer) 1
redis> SETBIT bits 3 1 # 1001
(integer) 0
redis> BITCOUNT bits
(integer) 2
模式:使用bitmap实现用户上线次数统计
Bitmap对于一些特定类型的计算非常有效。
假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户A上线了多少天,用户B上线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加beta测试等活动---------这个模式可以使用setbit和bitcount来实现。
比如说,每当用户在某一天上线的时候,我们就使用setbit,以此作为用户的key,将那天所代表的网站的上线日作为offset参数,并将这个offset上的为设置为1。
举个例子,如果今天是网站上线的第100天,而用户Peter在今天阅览过网站,那么执行命令setbit peter 100 1;如果明天peter也继续阅览网站,那么执行命令setbit peter 101 1;以此类推。
当要计算Peter总共以来的上线次数,就使用bitcount命令:执行bitcount peter,得出的结果就是peter上线的总天数。
性能
前面的上线次数统计例子,即使运行10年,占用的空间也只是每个用户10*365比特位(bit),也即是每个用户456字节。对于这种大小的数据来说,bitcount的处理速度就像get和incr这种o(1)复杂度的操作一样快。
如果你的bitcount数据非常大,那么可以考虑使用以下两种方法:
①将一个大的bitmap分散到不同的key中,作为小的bitmap来处理。使用lua脚本可以很方便地完成这一工作。
②使用bitcount的start和end参数,每次只对所需要的部分位进行计算,将位的累积工作(accumulating)放到客户端进行,并且对结果进行缓存(caching)。
3.Decr
Decr key
将key中存储的数字值减一。
如果key不存在,那么key的值会先被初始化为0,然后再执行DECR操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64位(bit)有符号数字表示之内。
返回值:
执行DECR命令之后key的值。
命令:
# 对存在的数字值 key 进行 DECR
redis> SET failure_times 10
OK
redis> DECR failure_times
(integer) 9
# 对不存在的 key 值进行 DECR
redis> EXISTS count
(integer) 0
redis> DECR count
(integer) -1
# 对存在但不是数值的 key 进行 DECR
redis> SET company YOUR_CODE_SUCKS.LLC
OK
redis> DECR company
(error) ERR value is not an integer or out of range
4.DECRBY
DECRBY key decrement
将key所存储的值减去减量decrement
如果key不存在那么key值会先被初始化为0,然后再执行DECRBY操作。
如果值包含错误的类型,或字符串的值不能表示为数字,那么返回一个错误。
本操作的值限制在64位(bit)有符号数字表示之内。
返回值:
减去decrement之后,key的值。
命令:
# 对已存在的 key 进行 DECRBY
redis> SET count 100
OK
redis> DECRBY count 20
(integer) 80
# 对不存在的 key 进行DECRBY
redis> EXISTS pages
(integer) 0
redis> DECRBY pages 10
(integer) -10
5.Get
Get key
返回key所关联的字符串值。
如果key不存在那么返回特殊值nil。
假如key存储的值不是字符串类型,返回一个错误,因为get只能用于处理字符串值。
返回值:
当key不存在时,返回nil,否则,返回key的值。
如果key不是字符串类型,那么返回一个错误。
命令:
# 对不存在的 key 或字符串类型 key 进行 GET
redis> GET db
(nil)
redis> SET db redis
OK
redis> GET db
"redis"
# 对不是字符串类型的 key 进行 GET
redis> DEL db
(integer) 1
redis> LPUSH db redis mongodb mysql
(integer) 3
redis> GET db
(error) ERR Operation against a key holding the wrong kind of value
6.Getbit
Getbit key offset
对key所储存的字符串值,获取指定偏移量上的位(64)。
当offset比字符串值的长度大,或者key不存在时,返回0。
返回值:
字符串值指定偏移量上的位(bit)。
命令:
# 对不存在的 key 或者不存在的 offset 进行 GETBIT, 返回 0
redis> EXISTS bit
(integer) 0
redis> GETBIT bit 10086
(integer) 0
# 对已存在的 offset 进行 GETBIT
redis> SETBIT bit 10086 1
(integer) 0
redis> GETBIT bit 10086
(integer) 1
7.Getrange
GETRANGE key start end
返回key中字符串值的子字符串,字符串的截取范围由start和end两个偏移量决定(包括start和end在内)。
负数偏移量表示从字符串最后开始计数,-1表示随后一个字符,-2表示倒数第二个,以此类推。
Getrange通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。
返回值:
截取得出的子字符串。
命令:
redis> SET greeting "hello, my friend"
OK
redis> GETRANGE greeting 0 4 # 返回索引0-4的字符,包括4。
"hello"
redis> GETRANGE greeting -1 -5 # 不支持回绕操作
""
redis> GETRANGE greeting -3 -1 # 负数索引
"end"
redis> GETRANGE greeting 0 -1 # 从第一个到最后一个
"hello, my friend"
redis> GETRANGE greeting 0 1008 #值域范围不超过实际字符串,超过部分自动被符略
"hello, my friend"
8.Getset
GETSET key value
将给定key的值设为value,并返回key的旧值(old value)。
当key存在但不是字符串类型时,返回一个错误。
返回值:
返回给定key的旧值。
当key没有旧值时,也即是,key不存在时,返回nil。
命令:
redis> GETSET db mongodb # 没有旧值,返回 nil
(nil)
redis> GET db
"mongodb"
redis> GETSET db redis # 返回旧值 mongodb
"mongodb"
redis> GET db
"redis"
模式
GETSET可以和INCR组合使用,实现一个有原子性(atmoic)复位操作的计数器(counter)。
举例来说,每次当某个事件发生时,进程可能对一个名为mycount的key调用incr操作,通常我们还需要在一个原子时间内同时完成获得计数器的值和将计数器值复位为0两个操作。
可以用命令GETSET mycounter 0来实现这一目标
命令:
redis> INCR mycount
(integer) 11
redis> GETSET mycount 0 # 一个原子内完成 GET mycount 和 SET mycount 0 操作
"11"
redis> GET mycount # 计数器被重置
"0"