redis-string类型命令操作笔记

redis-string类型

命令

1.赋值与取值

SET key value # 赋值

GET key       # 取值

2.递增数字

INCR num

3.增加指定的整数

`INCRBY`命令与`INCR`命令基本一样,只不过前者可以通过`increment`参数指定一次增加的数值,如:


redis> INCRBY bar 2
(integer) 2
redis> INCRBY bar 3
(integer) 5

4.减少指定的整数

DECR key

DECRBY key decrement

5.增加指定浮点数

INCRBYFLOAT key increment

redis> INCRBYFLOAT bar 2.7
"6.7"
redis> INCRBYFLOAT bar 5E+4
"50006.69999999999999929"

6.向尾部追加值

APPEND key value

APPEND作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于SET key value。返回值是追加后字符串的总长度。如:

redis> SET key hello
OK
redis> APPEND key " world!"
(integer) 12

此时key的值是"hello world!"。APPEND命令的第二个参数加了双引号,原因是该参数包含空格,在redis-cli中输入需要双引号以示区分。

 

7.获取字符串长度

STRLEN key

STRLEN命令返回键值的长度,如果键不存在则返回0。例如:

redis> STRLEN key
(integer) 12
redis> SET key 你好
OK
redis> STRLEN key
(integer) 6

前面提到了字符串类型可以存储二进制数据,所以它可以存储任何编码的字符串。例子中Redis接收到的是使用UTF-8编码的中文,由于“你”和“好”两个字的UTF-8编码的长度都是3,所以此例中会返回6。

8.同时获得/设置多个键值

MGET key [key …]


MSET key value [key value …]

MGET/MSET与GET/SET相似,不过MGET/MSET可以同时获得/设置多个键的键值。例如:

redis> MSET key1 v1 key2 v2 key3 v3
OK
redis> GET key2
"v2"
redis> MGET key1 key3
1) "v1"
2) "v3"

9.位操作

GETBIT key offset

SETBIT key offset value

BITCOUNT key [start] [end]

BITOP operation destkey key [key …]

一个字节由8个二进制位组成,Redis提供了4个命令可以直接对二进制位进行操作。为了演示,我们首先将foo键赋值为bar:

redis> SET foo bar
OK

bar的3个字母“b”“a”和“r”对应的ASCII码分别为98、97和114,转换成二进制后分别为1100010、1100001和1110010,

GETBIT命令可以获得一个字符串类型键指定位置的二进制位的值(0或1),索引从0开始:

redis> GETBIT foo 0
(integer) 0
redis> GETBIT foo 6
(integer) 1

如果需要获取的二进制位的索引超出了键值的二进制位的实际长度则默认位值是0:

redis> GETBIT foo 100000
(integer) 0


SETBIT命令可以设置字符串类型键指定位置的二进制位的值,返回值是该位置的旧值。如我们要将foo键值设置为aar,可以通过位操作将foo键的二进制位的索引第6位设为0,第7位设为1:

redis> SETBIT foo 6 0
(integer) 1
redis> SETBIT foo 7 1
(integer) 0
redis> GET foo
"aar"


如果要设置的位置超过了键值的二进制位的长度,SETBIT命令会自动将中间的二进制位设置为0,同理设置一个不存在的键的指定二进制位的值会自动将其前面的位赋值为0:

redis> SETBIT nofoo 10 1
(integer) 0
redis> GETBIT nofoo 5
(integer) 0

BITCOUNT命令可以获得字符串类型键中值是1的二进制位个数,例如:


redis> BITCOUNT foo
(integer) 10

可以通过参数来限制统计的字节范围,如我们只希望统计前两个字节(即"aa"):
redis> BITCOUNT foo 0 1
(integer) 6



BITOP命令可以对多个字符串类型键进行位运算,并将结果存储在destkey参数指定的键中。BITOP命令支持的运算操作有AND、OR、XOR和NOT。如我们可以对bar和aar进行OR运算:


redis> SET foo1 bar
OK
redis> SET foo2 aar
OK
redis> BITOP OR res foo1 foo2
(integer) 3
redis> GET res
"car"




Redis 2.8.7引入了BITPOS命令,可以获得指定键的第一个位值是0或者1的位置。还是以“bar”这个键值为例,如果想获取键值中的第一个二进制位为1的偏移量,则可以执行:



redis> SET foo bar
OK
redis> BITPOS foo 1
(integer) 1

正如BITPOS命令的结果所示,“bar”中的第一个值为1的二进制位的偏移量为1(同其他命令一样,BITPOS命令的索引也是从0开始算起)。那么有没有可能指定二进制位的查询范围呢?BITPOS命令的第二个和第三个参数分别可以用来指定要查询的起始字节(同样从0开始算起)和结束字节。注意这里的单位不再是二进制位,而是字节。如果我们想查询第二个字节到第三个字节之间(即“a”和“r”)出现的第一个值为1的二进制位的偏移量,则可以执行:

redis> BITPOS foo 1 1 2
(integer) 9


这里的返回结果的偏移量是从头开始算起的,与起始字节无关。另外要特别说明的一个有趣的现象是如果不设置结束字节且键值的所有二进制位都是1,则当要查询值为0的二进制位偏移量时,返回结果会是键值长度的下一个字位的偏移量。这是因为Redis会认为键值长度之后的二进制位都是0。

利用位操作命令可以非常紧凑地存储布尔值。比如如果网站的每个用户都有一个递增的整数ID,如果使用一个字符串类型键配合位操作来记录每个用户的性别(用户ID作为索引,二进制位值1和0表示男性和女性),那么记录100万个用户的性别只需占用100 KB多的空间,而且由于GETBIT和SETBIT的时间复杂度都是O(1),所以读取二进制位值性能很高。


注意:
使用SETBIT命令时,如果当前键的键值长度小于要设置的二进制位的偏移量时,Redis会自动分配内存并将键值的当前长度到指定的偏移量之间的二进制位都设置为0。如果要分配的内存过大,则很可能会造成服务器的暂时阻塞而无法接收同一时间的其他请求。举例而言,在一台2014年的MacBook Pro笔记本上,设置偏移量232-1的值(即分配500 MB的内存)需要耗费将近1秒的时间。分配过大的偏移量除了会造成服务器阻塞,还会造成空间浪费。还是举刚才存储网站用户性别的例子,如果这个网站的用户ID是从100000001开始的,那么会造成10多MB的浪费,正确的做法是给每个用户的ID减去100000000再进行存储。

参考链接:https://www.jianshu.com/p/86eee4c13645

书签:散列类型

 

 

你可能感兴趣的:(数据库MySQL)