redis之string

来源:互联网 发布:mit人工智能实验室 编辑:程序博客网 时间:2024/05/18 22:42

1.Append

Append key value

如果key已经存在并且是一个字符串,append命令将value追加到key原来的值末尾。

如果key不存在,append就简单地将给定key设为value,就像执行set key value一样。

返回值:

追加value之后,key中字符串的长度

命令:

# 对不存在的 key 执行 APPENDredis> EXISTS myphone       # 确保 myphone 不存在(integer) 0redis> APPEND myphone "nokia" #对不存在key进行APPEND等同于SET myphone "nokia"(integer) 5  # 字符长度# 对已存在的字符串进行 APPENDredis> APPEND myphone " - 1110"     # 长度从 5 个字符增加到 12 个字符(integer) 12redis> GET myphone"nokia - 1110"

2.Bitcount

Bitcount key [start] [end]

计算给定字符串中,被设置为1的比特位的数量

一般情况下,给定的整个字符串都会被进行计数,通过指定额外的startend参数,可以让计数只在特定的位上进行。

Startend参数设置和getrange命令类似,都可以使用负数值:比如-1表示最后一个字节,-2表示倒数第二个字节,以此类推。

不存在的key被当成是空字符串来处理,因此一个不存在的key进行bigcount操作,结果为0

返回值:

被设置为1的位的数量。

命令:

redis> BITCOUNT bits(integer) 0redis> SETBIT bits 0 1          # 0001(integer) 0redis> BITCOUNT bits(integer) 1redis> SETBIT bits 3 1          # 1001(integer) 0redis> BITCOUNT bits(integer) 2

模式:使用bitmap实现用户上线次数统计

Bitmap对于一些特定类型的计算非常有效。

假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户A上线了多少天,用户B上线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加beta测试等活动---------这个模式可以使用setbitbitcount来实现。

比如说,每当用户在某一天上线的时候,我们就使用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的处理速度就像getincr这种o(1)复杂度的操作一样快。

如果你的bitcount数据非常大,那么可以考虑使用以下两种方法:

①将一个大的bitmap分散到不同的key中,作为小的bitmap来处理。使用lua脚本可以很方便地完成这一工作。

②使用bitcountstartend参数,每次只对所需要的部分位进行计算,将位的累积工作(accumulating)放到客户端进行,并且对结果进行缓存(caching)

3.Decr

Decr key

key中存储的数字值减一。

如果key不存在,那么key的值会先被初始化为0,然后再执行DECR操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在64(bit)有符号数字表示之内。

返回值:

执行DECR命令之后key的值。

命令:

# 对存在的数字值 key 进行 DECRredis> SET failure_times 10OKredis> DECR failure_times(integer) 9# 对不存在的 key 值进行 DECRredis> EXISTS count(integer) 0redis> DECR count(integer) -1# 对存在但不是数值的 key 进行 DECRredis> SET company YOUR_CODE_SUCKS.LLCOKredis> 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 进行 DECRBYredis> SET count 100OKredis> DECRBY count 20(integer) 80# 对不存在的 key 进行DECRBYredis> EXISTS pages(integer) 0redis> DECRBY pages 10(integer) -10

5.Get

Get key

返回key所关联的字符串值。

如果key不存在那么返回特殊值nil

假如key存储的值不是字符串类型,返回一个错误,因为get只能用于处理字符串值。

返回值:

key不存在时,返回nil,否则,返回key的值。

如果key不是字符串类型,那么返回一个错误。

命令:

# 对不存在的 key 或字符串类型 key 进行 GETredis> GET db(nil)redis> SET db redisOKredis> GET db"redis"# 对不是字符串类型的 key 进行 GETredis> DEL db(integer) 1redis> LPUSH db redis mongodb mysql(integer) 3redis> 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, 返回 0redis> EXISTS bit(integer) 0redis> GETBIT bit 10086(integer) 0# 对已存在的 offset 进行 GETBITredis> SETBIT bit 10086 1(integer) 0redis> GETBIT bit 10086(integer) 1

7.Getrange

GETRANGE key start end

返回key中字符串值的子字符串,字符串的截取范围由startend两个偏移量决定(包括startend在内)

负数偏移量表示从字符串最后开始计数,-1表示随后一个字符,-2表示倒数第二个,以此类推。

Getrange通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。

返回值:

截取得出的子字符串。

命令:

redis> SET greeting "hello, my friend"OKredis> 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)

举例来说,每次当某个事件发生时,进程可能对一个名为mycountkey调用incr操作,通常我们还需要在一个原子时间内同时完成获得计数器的值和将计数器值复位为0两个操作。

可以用命令GETSET mycounter 0来实现这一目标

命令:

redis> INCR mycount(integer) 11redis> GETSET mycount 0  # 一个原子内完成 GET mycount 和 SET mycount 0 操作"11"redis> GET mycount       # 计数器被重置"0"

0 0