redis读写操作:string
这里讲的类型主要是指value的·类型
STRING
STRING是redis中最基本的数据类型,redis中的STRING类型是二进制安全的,
即它可以包含任何数据,比如一个序列化的对象甚至一个jpg图片,要注意的是redis中的字符串大小上限是512M。
STRING
APPEND
使用APPEND命令时,如果key已经存在,则会直接在value后追加值,如果key不存在,则会先创建一个value为空字符串的key,然后再追加:
127.0.0.1:6379> APPEND k1 hello (integer) 5
127.0.0.1:6379> GET k1 "hello"
127.0.0.1:6379> APPEND k1 world (integer) 10
127.0.0.1:6379> GET k1 "helloworld"
DECR
DECR命令可以实现对value的减1操作,如果key不存在,则key对应的初始值会被置为0,如果key的value不为数字,则会报错,如下:
127.0.0.1:6379> SET k3 19 OK
127.0.0.1:6379> DECR k3 (integer) 18
127.0.0.1:6379> GET k3 "18"
127.0.0.1:6379> SET k4 aa OK
127.0.0.1:6379> DECR k4 (error) ERR value is not an integer or out of range
DECRBY
DECRBY和DECR类似,不同的是DECRBY可以指定步长,如下:
127.0.0.1:6379> GET k3 "8"
127.0.0.1:6379> DECRBY k3 4 (integer) 4
127.0.0.1:6379> GET k3 "4"
GET
GET命令用来获取对应key的value,如果key不存在则返回nil,如下:
127.0.0.1:6379> GET k5 (nil)
GETRANGE
GETRANGE用来返回key所对应的value的子串,子串由start和end决定,
从左往右计算,如果下标是负数,则从右往左计算,其中-1表示最后一个字符,-2是倒数第二个…,如下:
127.0.0.1:6379> SET k1 helloworld OK
127.0.0.1:6379> GETRANGE k1 0 2 "hel"
127.0.0.1:6379> GETRANGE k1 -3 -1 "rld"
GETSET
GETSET命令可以用来获取key所对应的value,并对key进行重置,如下:
127.0.0.1:6379> SET k1 v1 OK
127.0.0.1:6379> GET k1 "v1"
127.0.0.1:6379> GETSET k1 vv "v1"
127.0.0.1:6379> GET k1 "vv"
INCR
INCR操作可以对指定key的value执行加1操作,如果指定的key不存在,那么在加1操作之前,会先将key的value设置为0,如果key的value不是数字,则会报错。如下:
127.0.0.1:6379> INCR k2 (integer) 1
INCRBY
INCRBY和INCR功能类似,不同的是可以指定增长的步长,如下:
127.0.0.1:6379> INCRBY k2 99 (integer) 100
INCRBYFLOAT
INCRBYFLOAT命令可以用来增长浮点数,如下:
127.0.0.1:6379> SET k1 0.5 OK
127.0.0.1:6379> INCRBYFLOAT k1 0.33 "0.83"
MGET与MSET
MGET与MSET分别用来批量设置值和批量获取值,如下:
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 OK
127.0.0.1:6379> MGET k1 k2 k3 1) "v1" 2) "v2" 3) "v3"
SETEX
SETEX用来给key设置value,同时设置过期时间,等效于先给key设置value,再给key设置过期时间,如下:
127.0.0.1:6379> SETEX k1 30 v1 OK
127.0.0.1:6379> TTL k1 (integer) 26
127.0.0.1:6379> GET k1 "v1"
PSETEX
PSETEX的作用和SETEX类似,不同的是,这里设置过期时间的单位是毫秒,如下:
127.0.0.1:6379> PSETEX k1 60000 v1 OK
127.0.0.1:6379> PTTL k1 (integer) 55412
SETNX
SETNX是 SET if Not eXists的简写,SET命令在执行时,如果key已经存在,则新值会覆盖掉旧值,
而对于SETNX命令,如果key已经存在,则不做任何操作,如果key不存在,则效果等同于SET命令。如下:
127.0.0.1:6379> SETNX k1 v1 (integer) 1
127.0.0.1:6379> SETNX k1 vv (integer) 0
127.0.0.1:6379> GET k1 "v1"
MSETNX
MSETNX兼具了SETNX和MSET的特性,但是MSETNX在执行时,如果有一个key存在,则所有的都不会执行,如下:
127.0.0.1:6379> MSETNX k1 v1 k2 v2 (integer) 0
因为k1已经存在,所以k2也没执行成功。
SETRANGE
SETRANGE用来覆盖一个已经存在的key的value,如下:
127.0.0.1:6379> set k1 helloworld OK
127.0.0.1:6379> get k1 "helloworld"
127.0.0.1:6379> SETRANGE k1 5 redis (integer) 10
127.0.0.1:6379> get k1 "helloredis"
但是如果已经存在的key的value长度小于offset,则不足的地方用0补齐,如下:
127.0.0.1:6379> set k1 helloredis OK
127.0.0.1:6379> SETRANGE k1 20 --java (integer) 26
127.0.0.1:6379> GET k1 "helloredis\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00--java"
STRLEN
STRLEN用来计算key的value的长度,如下:
127.0.0.1:6379> STRLEN k1 (integer) 26
BIT相关的命令
是指BITCOUNT/BITFIELD/BITOP/BITPOS/SETBIT/GETBIT 几个命令,灵活使用这几个命令,可以给我们的项目带来很多惊喜。
准备知识
在学习这几个命令之前,我们得先了解下redis中字符串的存储方式,redis中的字符串都是以二进制的方式进行存储的,比如说我执行如下命令:
127.0.0.1:6379> SET k1 a OK
a对应的ASCII码是97,转换为二进制数据是01100001,我们BIT相关命令都是对这个二进制数据进行操作。请继续往下看。
GETBIT
GETBIT命令可以返回key对应的value在offset处的bit值,以上文提到的k1为例,a对应的二进制数据是01100001,
所以当offset为0时,对应的bit值为0;offset为1时,对应的bit值为1;offset为2时,对应的bit值为1;offset为3时,对应的bit值为0,依此类推….,如下:
127.0.0.1:6379> GETBIT k1 0 (integer) 0
127.0.0.1:6379> GETBIT k1 1 (integer) 1
127.0.0.1:6379> GETBIT k1 2 (integer) 1
127.0.0.1:6379> GETBIT k1 3 (integer) 0
127.0.0.1:6379> GETBIT k1 4 (integer) 0
127.0.0.1:6379> GETBIT k1 5 (integer) 0
127.0.0.1:6379> GETBIT k1 6 (integer) 0
127.0.0.1:6379> GETBIT k1 7 (integer) 1
SETBIT
SETBIT可以用来修改二进制数据,比如a对应的ASCII码为97,c对应的ASCII码为99,97转为二进制是01100001,99转为二进制是01100011,
两个的差异在于第六位一个是0一个是1,通过SETBIT命令,我们可以将k1的第六位的0改为1(第六位是从0开始算),如下:
127.0.0.1:6379> SETBIT k1 6 1 (integer) 0
127.0.0.1:6379> GET k1 "c"
此时,k1中存储的字符也就变为了c。SETBIT在执行时所返回的数字,表示该位上原本的bit值。
BITCOUNT
BITCOUNT可以用来统计这个二进制数据中1的个数,如下:
127.0.0.1:6379> BITCOUNT k1 (integer) 4
关于BITCOUNT,redis官网上有一个非常有意思的案例:用户上线次数统计。节选部分原文如下:
举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 SETBIT peter 100 1 ;
如果明天 peter 也继续阅览网站,那么执行命令 SETBIT peter 101 1 ,以此类推。
当要计算 peter 总共以来的上线次数时,就使用 BITCOUNT 命令:执行 BITCOUNT peter ,得出的结果就是 peter 上线的总天数。
这种统计方式最大的好处就是节省空间并且运算速度快。每天占用一个bit,一年也就365个bit,10年也就10*365个bit,也就是456个字节,对于这么大的数据,bit的操作速度非常快。
BITOP
BITOP可以对一个或者多个二进制位串执行并(AND)、或(OR)、异或(XOR)以及非(NOT)运算,
如下:a对应的ASCII码转为二进制是01100001,c对应的二进制位串是01100011。对这两个二进制位串分别执行AND\OR\XOR的结果如下:
127.0.0.1:6379> set k1 a OK
127.0.0.1:6379> set k2 c OK
127.0.0.1:6379> BITOP and k3 k1 k2 (integer) 1
127.0.0.1:6379> get k3 "a" 127.0.0.1:6379> BITOP or k3 k1 k2 (integer) 1
127.0.0.1:6379> get k3 "c"
127.0.0.1:6379> BITOP xor k3 k1 k2 (integer) 1
127.0.0.1:6379> get k3 "\x02"
另外,BITOP也可以执行NOT运算,但是注意参数个数,如下:
127.0.0.1:6379> BITOP not k3 k4 (integer) 1
这里会对k4的二进制位串取反,将取反结果交给k3.
BITPOS
BITPOS用来获取二进制位串中第一个1或者0的位置,如下:
127.0.0.1:6379> set k1 a OK
127.0.0.1:6379> BITPOS k1 1 (integer) 1
127.0.0.1:6379> BITPOS k1 0 (integer) 0
也可以在后面设置一个范围,不过后面的范围是字节的范围,而不是二进制位串的范围。
OK,STRING中BIT相关的命令我们就介绍这么多


浙公网安备 33010602011771号