一、介绍
String类型,也就是字符串类型,是Redis中最简单的存储类型。
其value是字符串,虽然都是字符串,不过根据字符串的格式不同,又可以分为3类:
- string:普通字符串
- int:整数类型,可以做自增、自减操作
- float:浮点类型,可以做自增、自减操作
不管是哪种格式,都属于字符串,因此底层都是字节数组形式存储,只不过为了节省空间,数值类型的字符串在编码的时候会不同。
数值类型会直接把数字直接转化为二进制的形式去存储,这样一来,一个字节就可以即表示一个很大的数字了,可以更节省空间
字符串只能把字符转成字节码然后再去存储,相对来说占用内存更多一点。
甚至你可以把一张图片编译成字节存到string类型中,但是字符串类型的最大空间不能超过512m,因此一般情况下也不会向一个key存储太多数据,因此一般也不会存图片,最多存图片的地址。
String的常见命令有:
增改查如下,删除是通用命令里面的。
-
SET:添加或者修改已经存在的一个String类型的键值对,如果key不存在则是新增,如果存在则是修改
-
GET:根据key获取String类型的value
-
MSET:批量添加多个String类型的键值对
-
MGET:根据多个key获取多个String类型的value
除了基本的存取以外,既然redis在存储数值类型的编码不同,因此对于数值类型就有一些特殊功能了。
-
INCR:让一个整型的key自增1
-
INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
把值变成负数就是自减,eg:incrby age -1 -
DECR:自减1,但使用时一般都是使用INCR
-
INCRBYFLOAT:让一个浮点类型的数字自增并指定步长,但是浮点数没有默认增长,必须指定增长的步长
以下两个是组合命令
-
SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
setnx name lisi
等价于set name lisi nx
-
SETEX:添加一个String类型的键值对,并且指定有效期
setex name 10 jack
等价于:set name jack ex 10
,ex就是expire
贴心小提示:以上命令除了INCRBYFLOAT 都是常用命令
二、代码实现
SET 和GET
127.0.0.1:6379> set name Rose //原来不存在
OK
127.0.0.1:6379> get name
"Rose"
127.0.0.1:6379> set name Jack //原来存在,就是修改
OK
127.0.0.1:6379> get name
"Jack"
MSET和MGET
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> MGET name age k1 k2 k3
# 返回值是多个值形成的数组,redis中数组就会以下面的形式进行返回
1) "Jack" //之前存在的name
2) "10" //之前存在的age
3) "v1"
4) "v2"
5) "v3"
INCR和INCRBY和DECY
127.0.0.1:6379> get age
"10" # 这个10就是一个普通字符串,但是它是一个数值类型的,因此底层编码就是数字
127.0.0.1:6379> incr age # 增加1
(integer) 11
127.0.0.1:6379> get age # 获得age
"11"
127.0.0.1:6379> incrby age 2 # 一次增加2
(integer) 13 # 返回目前的age的值
127.0.0.1:6379> incrby age 2
(integer) 15
127.0.0.1:6379> incrby age -1 # 也可以增加负数,相当于减
(integer) 14
127.0.0.1:6379> incrby age -2 # 一次减少2个
(integer) 12
127.0.0.1:6379> DECR age # 相当于 incr 负数,但是一般在使用的时候一般都使用incr,只不过是给它正负而已
(integer) 11
127.0.0.1:6379> get age
"11"
INCRBYFLOAT
浮点数没有默认增长,必须指定增长的步长
127.0.0.1:6379> set score 10.1
OK
127.0.0.1:6379> INCRBYFLOAT score 0.5
"10.6"
127.0.0.1:6379> INCRBYFLOAT score 0.5
"11.1"
127.0.0.1:6379> INCRBYFLOAT score 0.5
SETNX
SETNX是条组合命名,set
和 nx
,nx
是参数,跟在 set
后面
我们在 set
的时候,其实后面可以跟很多很多参数,其中有一个参数就是 nx
因此 setnx name lisi
等价于 set name lisi nx
127.0.0.1:6379> help setnx
SETNX key value
summary: Set the value of a key, only if the key does not exist # 如果key不存在才添加添加,存在就不添加。因此这个才是真正的新增功能,它只有新增效果
since: 1.0.0
group: string
127.0.0.1:6379> set name Jack # 设置名称
OK
127.0.0.1:6379> setnx name lisi # 由于name已经存在,所以lisi的操作失败
(integer) 0 # 返回值是0,表示没有数据改变
127.0.0.1:6379> get name
"Jack" # 重新查看name的值,依然是Jack
127.0.0.1:6379> setnx name2 lisi
(integer) 1 # name2 不存在,所以操作成功
127.0.0.1:6379> get name2
"lisi"
SETEX
EX:代表有效期。
通用命令中有一个叫 EXPIRE
,它的作用是设置一个key的有效期,通过 ttl
可以查看key的剩余有效期,但是 EXPIRE
是在key已经存在的情况下。
SETEX
就表示:添加一个key,并且设置有效期。
这也是条组合命名:setex name 10 jack
等价于:set name jack ex 10
,ex就是expire
127.0.0.1:6379> setex name 10 jack
OK
127.0.0.1:6379> ttl name
(integer) 8
127.0.0.1:6379> ttl name
(integer) 7
127.0.0.1:6379> ttl name
(integer) 5