系统学习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安装及基本数据类型命令使用

初识Redis系列之三:Redis支持的数据类型及使用

Redis进阶实践之三如何在Windows系统上安装安装Redis

Redis学习笔记之三:redis配置

系统学习redis之五——redis数据类型之list类型及操作

系统学习redis之四——redis数据类型之hash类型及操作