设为首页 收藏本站
查看: 1052|回复: 0

[经验分享] 系统学习redis之三——redis数据类型之string类型及操作

[复制链接]

尚未签到

发表于 2018-11-2 07:51:43 | 显示全部楼层 |阅读模式
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的键值对:
  

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

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

[root@test101 redis-4.0.1]# 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的键值对
  

[root@test101 redis-4.0.1]# 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秒
  

[root@test101 redis-4.0.1]# 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邮箱
  

[root@test101 redis-4.0.1]# 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,就替换不完全了:
  

[root@test101 redis-4.0.1]# 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这两个值:
  

[root@test101 redis-4.0.1]# 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(先把前面已经设置的这两个键值对先清空,保证它们不存在)
  

[root@test101 redis-4.0.1]# 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
  

[root@test101 redis-4.0.1]# 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
  

[root@test101 redis-4.0.1]# 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的值:
  

[root@test101 redis-4.0.1]# 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
  

[root@test101 redis-4.0.1]# 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值的子字符串
  

[root@test101 redis-4.0.1]# 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的结果对比
  

[root@test101 redis-4.0.1]# 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值进行递增:
  

[root@test101 redis-4.0.1]# 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进行指定值的递增:
  

[root@test101 redis-4.0.1]# 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值做递减操作:
  

[root@test101 redis-4.0.1]# 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做减法操作
  

[root@test101 redis-4.0.1]# 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的字符串
  

[root@test101 redis-4.0.1]# 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值的长度
  

[root@test101 redis-4.0.1]# 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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629579-1-1.html 上篇帖子: 系统学习redis之二——redis集群搭建 下篇帖子: 分布式锁实现:Redis-Java邵先生的博客
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表