系统学习redis之三——redis数据类型之string类型及操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统学习redis之三——redis数据类型之string类型及操作相关的知识,希望对你有一定的参考价值。
redis数据类型介绍
redis数据类型有string类型、hash类型、list类型、set类型、zset类型等。
string类型及操作
string是最简单的类型,一个key对应一个value,string是二进制安全的。redis的string可以包含任何数据,比如jpg图片或者序列化的对象
操作:
1)Set:设置key对应的值为string类型的value
例如:设置一个name=xiaoming的键值对:
[[email protected] redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SET name xiaoming
OK
127.0.0.1:6379> GET name
"xiaoming"
127.0.0.1:6379>
127.0.0.1:6379> SET name crystal #会把上一个值“lijie”覆盖掉,说明在redis里面,一个key只能对应一个值
OK
127.0.0.1:6379> GET name
"crystal"
127.0.0.1:6379>
补充:删除一个key,用DEL:
例如:删除名字为“name这个”key
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
2)Setnx:设置key对应的值为string类型的value,如果key已经存在,返回0,并且不会覆盖原来的设置。如果不存在,就设置一个新值。nx就是not exist的意思。
例如添加一个age=10的键值对
127.0.0.1:6379> SETNX age 10 #第一次设置,age这个key原来是不存在的,返回值不为0,然后添加了age这个键值对
(integer) 1
127.0.0.1:6379> GET age #get得到的这个10就是上一步设置的
"10"
127.0.0.1:6379> SETNX age 20 #重新设置age=20,返回值为0,表示age这个key已经存在,并且设置不成功
(integer) 0
127.0.0.1:6379> GET age #再get得到age的值,还是第一次设置的10,value20没有设置成功
"10"
127.0.0.1:6379>
3)Setex:设置key对应的值为string类型的value,并指定此键值对应的有效期。
例如:添加一个color=red的键值对,并指定有效期为10秒
127.0.0.1:6379> SETEX color 10 red #设置color=red,并且有效期为10秒钟
OK
127.0.0.1:6379> GET color #设置好之后,立即get,能得到color的值
"red"
127.0.0.1:6379> GET color #过10秒钟再get,数据就已经失效了。注意,不是value值过期了,而是整个key-value键值对都消失了。nil在redis里表示空
(nil)
127.0.0.1:6379>
127.0.0.1:6379> SETNX color red #用setnx验证一下,重新设置color=red,能够设置成功,说明color=red这个键值对是不存在的
(integer) 1
127.0.0.1:6379> GET color #现在这个键值对就永远能够get到了
"red"
127.0.0.1:6379>
4)Setrange:设置指定key的value值的子字符串
例如:将crystal的126邮箱设置为gmai邮箱
127.0.0.1:6379> SET mail [email protected] #先设置一个mail值
OK
127.0.0.1:6379> GET mail
"[email protected]"
127.0.0.1:6379> SETRANGE mail 8 gmail.com #将126.com改成gmail.com。8表示字母的下标,而且是从0开始,@的下标是7,所以从第8个字符开始替换
(integer) 17 #17表示总的字符数
127.0.0.1:6379> GET mail
"[email protected]"
127.0.0.1:6379>
#但是setrange有个问题:假如要替换的新字符串没有原来的字符串长,那么就只会从开始替换,之后没有替换完的部分,不会覆盖。
例如:将上面的gmail.com再替换成126.com,就替换不完全了:
127.0.0.1:6379> GET mail
"[email protected]"
127.0.0.1:6379> SETRANGE mail 8 126.com
(integer) 17
127.0.0.1:6379> GET mail
"[email protected]" #可以看到,想要的值应该是crystal.com,但是最后多了om两个字母,就是因为126.com只有7个字符,gmail.com有9个字符,还整下2个字符,是覆盖不了的。
127.0.0.1:6379>
5)mset:一次设置多个key的值,即批量设置。成功就会返回OK,就表示所有的值都设置了。失败了就会返回0,表示没有任何值被设置
例如:一次性设置name=crystal,age=20这两个值:
127.0.0.1:6379> MSET name crystal age 20
OK
127.0.0.1:6379> GET name
"crystal"
127.0.0.1:6379> GET age
"20"
127.0.0.1:6379>
#返回的是OK,且两个值都get到了,说明设置成功了
6)msetnx:一次设置多个key的值,mset和msetnx的关系类似于set和setnx的关系。msetnx成功则表示所有的值都设置了,失败就返回0,表示没有任何值被设置,但是不会覆盖已经存在的key。
例如:上个例子中已经设置了name=crystal,age=20,这次先设置两三次值:
A:color=red,[email protected](先把前面已经设置的这两个键值对先清空,保证它们不存在)
127.0.0.1:6379> MSETNX color red email [email protected]
(integer) 1 #因为color=red,[email protected]这两个键值对都不存在,所以设置成功
127.0.0.1:6379> GET color
"red"
127.0.0.1:6379> GET email
"[email protected]"
127.0.0.1:6379>
B:设置color=yellow,hair=black
127.0.0.1:6379> MSETNX color yellow hair black
(integer) 0 #因为color这个键值对是存在的,所以这里返回值为0,说明失败了。color还是之前的red,没有被覆盖,而hair=black这个键值对也没有设置成功
127.0.0.1:6379> GET color
"red"
127.0.0.1:6379> GET hair
(nil)
127.0.0.1:6379>
C设置color=yellow,[email protected]
127.0.0.1:6379> MSETNX color yellow email [email protected]
(integer) 0 #因为color和email这两个key原来都存在,所以都设置失败,且没有覆盖原来的值
127.0.0.1:6379>
127.0.0.1:6379> GET color
"red"
127.0.0.1:6379> GET email
"[email protected]"
127.0.0.1:6379>
7)get:获取key对应的string值,如果key不存在,就返回nil,表示空
例如:获取name这个key的值:
127.0.0.1:6379> GET name
"crystal.crystal"
127.0.0.1:6379> GET key1 #key1这个key是不存在的,因此返回nil
(nil)
127.0.0.1:6379>
8)getset:获取key的旧值,并设置key的新值,并且在设置的时候返回key的旧值
例如将上面的color=red,设置为color=yellow
127.0.0.1:6379> GET color #当前color=red
"red"
127.0.0.1:6379>
127.0.0.1:6379> GETSET color yellow #将color重新设置为yellow
"red" #这里会返回color的旧值
127.0.0.1:6379> GET color #再重新get color的值,就变成了yellow
"yellow"
127.0.0.1:6379>
9)getrange:过去key的value值的子字符串
例如:获取email对应的value值的子字符串
127.0.0.1:6379> GET email
"[email protected]"
127.0.0.1:6379>
127.0.0.1:6379> GETRANGE email 0 6 #0和6都表示字符的下标,这里表示获取email的value值的下标为第0-6的字符
"crystal"
127.0.0.1:6379> GETRANGE email 0 7 #获取email的value值的下标为第0-7的字符
"[email protected]"
127.0.0.1:6379>
10)mget:一次获取多个key的值,如果对应的key不存在,则对应返回nil
例如:一次性获取name、email和name、email和color(color这个key不存在)几个key的结果对比
127.0.0.1:6379> MGET name email #一次性获取name和email两个key的值,因为两个key都存在,所以返回了正确的value值
1) "crystal"
2) "[email protected]"
127.0.0.1:6379>
127.0.0.1:6379> DEL color #把之前设置的color这个key删除掉,保证它是不存在的
(integer) 1
127.0.0.1:6379> GET color
(nil)
127.0.0.1:6379> MGET name email color #然后一次性获取name、email、color这三个key的value值
1) "crystal"
2) "[email protected]"
3) (nil) #这里的nil是因为color这个key不存在,所以返回为空
127.0.0.1:6379>
11)incr:对key的值做加加操作(递增),并返回新的值
例如:对age这个key值进行递增:
127.0.0.1:6379> GET age #下面的例子可以看出,每执行一次incr age,age的值就会自动加1.如果要指定递增的值,就要用到incrby了
"20"
127.0.0.1:6379> INCR age
(integer) 21
127.0.0.1:6379> GET age
"21"
127.0.0.1:6379> INCR age
(integer) 22
127.0.0.1:6379> GET age
"22"
127.0.0.1:6379> INCR age
(integer) 23
127.0.0.1:6379> GET age
"23"
127.0.0.1:6379>
12)incrby:同incr类似,加指定值,key不存在的时候会设置key,并认为原来的value是0
例如:还是对age这个key进行指定值的递增:
127.0.0.1:6379> GET age
"23"
127.0.0.1:6379> INCRBY age 5 #指定给age的value值加上5
(integer) 28
127.0.0.1:6379> GET age
"28"
127.0.0.1:6379> INCRBY age 3
(integer) 31
127.0.0.1:6379> GET age
"31"
127.0.0.1:6379> INCRBY age -6 #如果变成负值,就变成了减
(integer) 25
127.0.0.1:6379> GET age
"25"
127.0.0.1:6379>
13)decr:对key的value值做递减操作
例如:对age的value值做递减操作:
127.0.0.1:6379> GET age
"25"
127.0.0.1:6379> DECR age
(integer) 24
127.0.0.1:6379> GET age
"24"
127.0.0.1:6379> DECR age
(integer) 23
127.0.0.1:6379> GET age
"23"
127.0.0.1:6379>
14)decrby:跟incry有点类似,不过这里是减指定的值
例如:对age这个key做减法操作
127.0.0.1:6379> GET age
"23"
127.0.0.1:6379> DECRBY age 3
(integer) 20
127.0.0.1:6379> GET age
"20"
127.0.0.1:6379> DECRBY age 1
(integer) 19
127.0.0.1:6379> GET age
"19"
127.0.0.1:6379> DECRBY age -3 #把值变成了负值,减去一个负值,就等于加了一个正值。
(integer) 22
127.0.0.1:6379> GET age
"22"
127.0.0.1:6379>
15)append:给指定key的字符串追加value,返回新字符串值的长度
例如:给name这个key追加一个.new的字符串
127.0.0.1:6379> GET name
"crystal"
127.0.0.1:6379> APPEND name .new
(integer) 11 #这里的11是追加之后的新的字符串的长度
127.0.0.1:6379> GET name
"crystal.new"
127.0.0.1:6379>
16)strlen:取指定key的value值的字符串的长度
例如:获取name这个key对应的value值的长度
127.0.0.1:6379> SET name crystal.crystal
OK
127.0.0.1:6379> GET name
"crystal.crystal"
127.0.0.1:6379> STRLEN name
(integer) 15
127.0.0.1:6379>
以上是关于系统学习redis之三——redis数据类型之string类型及操作的主要内容,如果未能解决你的问题,请参考以下文章
Redis进阶实践之三如何在Windows系统上安装安装Redis