candy 发表于 2018-11-2 07:51:43

系统学习redis之三——redis数据类型之string类型及操作

redis数据类型介绍
  redis数据类型有string类型、hash类型、list类型、set类型、zset类型等。

string数据类型介绍
  string是最简单的类型,一个key对应一个value,string是二进制安全的。redis的string可以包含任何数据,比如jpg图片或者序列化的对象。

string数据类型方法


[*]Set:设置key对应的值为string类型的value
[*]Setnx:设置key对应的值为string类型的value,如果key已经存在,返回0,并且不会覆盖原来的设置。如果不存在,就设置一个新值。nx就是not exist的意思
[*]Setex:设置key对应的值为string类型的value,并指定此键值对应的有效期。
[*]Setrange:设置指定key的value值的子字符串
[*]mset:一次设置多个key的值,即批量设置。成功就会返回OK,就表示所有的值都设置了。失败了就会返回0,表示没有任何值被设置
[*]msetnx:一次设置多个key的值,mset和msetnx的关系类似于set和setnx的关系。msetnx成功则表示所有的值都设置了,失败就返回0,表示没有任何值被设置,但是不会覆盖已经存在的key。
[*]get:获取key对应的string值,如果key不存在,就返回nil,表示空
[*]getset:获取key的旧值,并设置key的新值,并且在设置的时候返回key的旧值
[*]getrange:过去key的value值的子字符串
[*]mget:一次获取多个key的值,如果对应的key不存在,则对应返回nil
[*]incr:对key的值做加加操作(递增),并返回新的值
[*]incrby:同incr类似,加指定值,key不存在的时候会设置key,并认为原来的value是0
[*]decr:对key的value值做递减操作
[*]decrby:跟incry有点类似,不过这里是减指定的值
[*]append:给指定key的字符串追加value,返回新字符串值的长度
[*]strlen:取指定key的value值的字符串的长度
方法及操作
  1)Set:设置key对应的值为string类型的value
  例如:设置一个name=xiaoming的键值对:
  

# src/redis-cli  
#备注,后面的例子都在同一台机器操作的,因为后面的代码如果不加上“   # src/redis-cli ”这一句。代码高亮也会格式有问题,所以后面所有的例子中都加上了“# 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#会把上一个值xiaoming”覆盖掉,说明在redis里面,一个key只能对应一个值
  
OK
  
127.0.0.1:6379> GET name
  
"crystal"
  
127.0.0.1:6379>
  

  备注,后面的例子也都在同一台机器一次性操作完毕的,因为后面的代码如果不加上“    # src/redis-cli ”这一句。代码高亮也会格式有问题,所以后面所有的例子中都加上了“# src/redis-cli ”,只是为了格式问题。
  补充:删除一个key,用DEL:
  例如:删除名字为“name这个”key
  

# src/redis-cli  
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的键值对
  

# src/redis-cli  
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秒
  

# src/redis-cli  
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邮箱
  

# src/redis-cli  
127.0.0.1:6379> SET mail crystal@126.com   #先设置一个mail值
  
OK
  
127.0.0.1:6379> GET mail
  
"crystal@126.com"
  
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
  
"crystal@gmail.com"
  
127.0.0.1:6379>
  
#但是setrange有个问题:假如要替换的新字符串没有原来的字符串长,那么就只会从开始替换,之后没有替换完的部分,不会覆盖。
  

  例如:将上面的gmail.com再替换成126.com,就替换不完全了:
  

# src/redis-cli  
127.0.0.1:6379> GET mail
  
"crystal@gmail.com"
  
127.0.0.1:6379> SETRANGE mail 8 126.com
  
(integer) 17
  
127.0.0.1:6379> GET mail
  
"crystal@126.comom"         #可以看到,想要的值应该是crystal.com,但是最后多了om两个字母,就是因126.com只有7个字符,gmail.com有9个字符,还整下2个字符,是覆盖不了的。
  
127.0.0.1:6379>
  

  5)mset:一次设置多个key的值,即批量设置。成功就会返回OK,就表示所有的值都设置了。失败了就会返回0,表示没有任何值被设置
  例如:一次性设置name=crystal,age=20这两个值:
  

# src/redis-cli  
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>
  #上面两个值都get到了,说明设置成功了
  

  6)msetnx:一次设置多个key的值,mset和msetnx的关系类似于set和setnx的关系。msetnx成功则表示所有的值都设置了,失败就返回0,表示没有任何值被设置,但是不会覆盖已经存在的key。
  例如:上个例子中已经设置了name=crystal,age=20,这次先设置两三次值:
  A:color=red,email=crystal@gmai.com(先把前面已经设置的这两个键值对先清空,保证它们不存在)
  

# src/redis-cli  
127.0.0.1:6379> MSETNX color red email crystal@gmail.com
  
(integer) 1               #因为color=red,email=crystal@gmai.com这两个键值对都不存在,所以设置成功
  
127.0.0.1:6379> GET color
  
"red"
  
127.0.0.1:6379> GET email
  
"crystal@gmail.com"
  
127.0.0.1:6379>
  

  B:设置color=yellow,hair=black
  

# src/redis-cli  
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=crystal@126.com
  

# src/redis-cli  
127.0.0.1:6379> MSETNX color yellow email crystal@126.com
  
(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
  
"crystal@gmail.com"
  
127.0.0.1:6379>
  

  7)get:获取key对应的string值,如果key不存在,就返回nil,表示空
  例如:获取name这个key的值:
  

# src/redis-cli  
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
  

# src/redis-cli  
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值的子字符串
  

# src/redis-cli  
127.0.0.1:6379> GET email
  
"crystal@gmail.com"
  
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的字符
  
"crystal@"
  
127.0.0.1:6379>
  

  10)mget:一次获取多个key的值,如果对应的key不存在,则对应返回nil
  例如:一次性获取name、email和name、email和color(color这个key不存在)几个key的结果对比
  

# src/redis-cli  
127.0.0.1:6379> MGET name email   #一次性获取name和email两个key的值,因为两个key都存在,所以返回了正确的value值
  
1) "crystal"
  
2) "crystal@gmail.com"
  
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) "crystal@gmail.com"
  
3) (nil)               #这里的nil是因为color这个key不存在,所以返回为空
  
127.0.0.1:6379>
  

  11)incr:对key的值做加加操作(递增),并返回新的值
  例如:对age这个key值进行递增:
  

# src/redis-cli  
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进行指定值的递增:
  

# src/redis-cli  
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值做递减操作:
  

# src/redis-cli  
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做减法操作
  

# src/redis-cli  
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的字符串
  

# src/redis-cli  
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值的长度
  

# src/redis-cli  
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>


页: [1]
查看完整版本: 系统学习redis之三——redis数据类型之string类型及操作