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

[经验分享] redis数据类型-strings

[复制链接]

尚未签到

发表于 2018-11-6 11:37:40 | 显示全部楼层 |阅读模式
  redis提供五种数据类型:string,hash,list,set及zset(sortedset)。
1.      String(字符串)
  string是最简单的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。但它的功能更丰富。
  redis采用结构sdshdr和sds封装了字符串,字符串相关的操作实现在源文件sds.h/sds.c中。在Redis中字符串类型的Value最多可以容纳的数据长度是512M
  在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等
  数据结构定义如下:
  typedefchar*sds;
  structsdshdr{
  longlen;
  longfree;
  charbuf[];
  };
  1.1.  SET
  Set key value [EX seconds] [PXmilliseconds] [NX|XX]
  将字符串值value关联到key。如果key已经持有其他值,SET 就覆写旧值,无视类型。对于某个原本带有生存时间(TTL)的键来说,当 SET 命令成功在这个键上执行时, 这个键原有的 TTL 将被清除。
  可选参数
  从 Redis 2.6.12 版本开始,SET 命令的行为可以通过一系列参数来修改:

  •   EXsecond:设置键的过期时间为 second秒。 SET key value EX second效果等同于SETEXkey second value。
  •   PXmillisecond:设置键的过期时间为 millisecond毫秒。 SET key value PX millisecond效果等同于PSETEXkey millisecond value。
  •   NX:只在键不存在时,才对键进行设置操作。SETkey value NX效果等同于 SETNX key value。
  •   XX:只在键已经存在时,才对键进行设置操作。
  #赋值与取值
  127.0.0.1:6379> set dbredis
  OK
  127.0.0.1:6379> get db
  "redis"
  #使用ex选项
  127.0.0.1:6379> set dbredis ex 20
  OK
  127.0.0.1:6379> ttl db
  (integer) 16
  127.0.0.1:6379> get db
  "redis"
  127.0.0.1:6379> ttl db
  (integer) 5
  127.0.0.1:6379> get db
  "redis"
  127.0.0.1:6379> get db
  "redis"
  127.0.0.1:6379> get db
  (nil)
  # 使用 PX 选项
  127.0.0.1:6379>set db redis px 20000
  OK
  127.0.0.1:6379>PTTL db
  (integer)15674
  127.0.0.1:6379>PTTL db
  (integer)8974
  127.0.0.1:6379>PTTL db
  (integer)8045
  127.0.0.1:6379>get db
  "redis"
  127.0.0.1:6379>PTTL db
  (integer)2482
  127.0.0.1:6379>get db
  "redis"
  127.0.0.1:6379>get db
  (nil)
  # 使用 NX 选项
  127.0.0.1:6379>set db oracle NX
  OK
  127.0.0.1:6379>get db
  "oracle"
  127.0.0.1:6379>set db redis NX  ---键存在,失败
  (nil)
  127.0.0.1:6379>get db
  "oracle"
  # 使用 XX 选项
  127.0.0.1:6379>exists name
  (integer)0
  127.0.0.1:6379>get name
  (nil)
  127.0.0.1:6379>set name hunt1574 XX  ---键不存在,失败
  (nil)
  127.0.0.1:6379>set name redis
  OK
  127.0.0.1:6379>set name hunt1574 XX
  OK
  127.0.0.1:6379>get name
  "hunt1574"
1.2.  SETEX
  Setex key seconds value
  将值 value 关联到 key ,并将key 的生存时间设为 seconds (以秒为单位)。
  如果 key 已经存在, SETEX 命令将覆写旧值。
  这个命令类似于以下两个命令:
  SETkey value
  EXPIREkey seconds  # 设置生存时间
  不同之处是, SETEX 是一个原子性(atomic)操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。
  #key不存在赋值
  127.0.0.1:6379>EXISTS user
  (integer)0
  127.0.0.1:6379>setex user 30 root
  OK
  127.0.0.1:6379>get user
  "root"
  127.0.0.1:6379>ttl user
  (integer)15
  127.0.0.1:6379>get user
  (nil)
  #key存在赋值
  127.0.0.1:6379>setex user 20 admin
  OK
  127.0.0.1:6379>get user
  "admin"
  127.0.0.1:6379>ttl user
  (integer)14
  127.0.0.1:6379>get user
  (nil)
1.3.  SETNX
  SETNX key value
  将 key 的值设为 value ,当且仅当 key 不存在。
  若给定的 key 已经存在,则 SETNX 不做任何动作。
  SETNX是『SET if Not eXists』(如果不存在,则 SET)的简写。
  #赋值与取值
  127.0.0.1:6379>EXISTS www
  (integer)0
  127.0.0.1:6379>setnx www code.google.com
  (integer)1
  127.0.0.1:6379>setnx www redis.io
  (integer)0
  127.0.0.1:6379>get www
  "code.google.com"
  127.0.0.1:6379>
1.4.  SETRANGE
  SETRANGE key offset value
  用 value 参数覆写(overwrite)给定offset的 key 所储存的字符串值
  127.0.0.1:6379>set www code.google.com
  OK
  127.0.0.1:6379>get www
  "code.google.com"
  127.0.0.1:6379>SETRANGE www 0 mail
  (integer)15
  127.0.0.1:6379>get www
  "mail.google.com"
  127.0.0.1:6379>SETRANGE www 0 gmail
  (integer)15
  127.0.0.1:6379>get www
  "gmailgoogle.com"
1.5.  MSET
  MSET key value [key value ...]
  同时设置一个或多个 key-value 对。
  如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。
  MSET是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。
  #赋值与取值
  127.0.0.1:6379>mset os "linux" db "redis" date "2015-03-17"
  OK
  127.0.0.1:6379>mget os db date
  1)"linux"
  2)"redis"
  3)"2015-03-17"
  #值覆盖
  127.0.0.1:6379>mset os "linux" db "oracle" date "2015-03-17"
  OK
  127.0.0.1:6379>mget os db date
  1)"linux"
  2)"oracle"
  3)"2015-03-17"
  127.0.0.1:6379>
1.6.  MSETNX
  MSETNX key value [key value ...]
  同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
  即使只有一个给定 key 已存在,MSETNX 也会拒绝执行所有给定 key 的设置操作。MSETNX是原子性的,因此它可以用作设置多个不同 key 表示不同字段(field)的唯一性逻辑对象(unique logic object),所有字段要么全被设置,要么全不被设置。
  #赋值与取值
  127.0.0.1:6379>mget os db date
  1)"linux"
  2)"redis"
  3) "2015-03-17"
  127.0.0.1:6379>msetnx os "linux" db "oracle" date "2015-03-17"
  (integer)0
  127.0.0.1:6379>mget os db date
  1)"linux"
  2)"redis"
  3)"2015-03-17"
  127.0.0.1:6379>
1.7.  GET
  GET key
  返回 key 所关联的字符串值。
  如果 key 不存在那么返回特殊值nil 。
  假如 key 储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值。
  127.0.0.1:6379>set dbname redis
  OK
  127.0.0.1:6379>get dbname
  "redis"
  127.0.0.1:6379>get dbversion
  (nil)
  127.0.0.1:6379>lpush db redis mysql mongodb
  (integer)3
  127.0.0.1:6379>get db
  (error)WRONGTYPE Operation against a key holding the wrong kind of value
1.8.  MGET
  MGET key [key ...]
  返回所有(一个或多个)给定 key 的值。
  如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。
  #赋值与取值
  127.0.0.1:6379>set date 2015-03-17
  OK
  127.0.0.1:6379>set time 10:00
  OK
  127.0.0.1:6379>mget date time
  1)"2015-03-17"
  2)"10:00"
  127.0.0.1:6379>mget date time week  ---week不存在,返回nil
  1)"2015-03-17"
  2)"10:00"
  3)(nil)
1.9.  GETRANGE
  GETRANGE key startend
  返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括start 和 end 在内)。负数偏移量表示从字符串最后开始计数, -1 表示最后一个字符, -2 表示倒数第二个,以此类推。范围超过字符串最大下标值以最大下标值为准。
  #赋值与取值
  127.0.0.1:6379>set www redis.io
  OK
  127.0.0.1:6379>GETRANGE www 0 4
  "redis"
  127.0.0.1:6379>GETRANGE www -2 -1
  "io"
  127.0.0.1:6379>GETRANGE www -100 -1
  "redis.io"
1.10.      GETSET
  GETSET key value
  将给定 key 的值设为 value ,并返回key 的旧值(old value)。
  当 key 存在但不是字符串类型时,返回一个错误。
  127.0.0.1:6379>getset dbname mysql
  (nil)
  127.0.0.1:6379>get dbname
  "mysql"
  127.0.0.1:6379>getset dbname redis
  "mysql"
  127.0.0.1:6379>get dbname
  "redis"
1.11.      INCR
  INCR key
  将 key 中储存的数字值增一。
  如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
  本操作的值限制在 64 位(bit)有符号数字表示之内。
  127.0.0.1:6379>EXISTS pages
  (integer)0
  127.0.0.1:6379>incr pages
  (integer)1
  127.0.0.1:6379>get pages
  "1"
  127.0.0.1:6379>set rows 0
  OK
  127.0.0.1:6379>incr rows
  (integer)1
  127.0.0.1:6379>incr rows
  (integer)2
  127.0.0.1:6379>incr rows
  (integer)3
  127.0.0.1:6379>get rows
  "3"
  127.0.0.1:6379>
1.12.      INCRBY
  INCRBY keyincrement
  将 key 所储存的值加上增量 increment 。
  如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。
  如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
  本操作的值限制在 64 位(bit)有符号数字表示之内
  #键存在
  127.0.0.1:6379>get rows
  "3"
  127.0.0.1:6379>INCRBY rows 3
  (integer)6
  127.0.0.1:6379>INCRBY rows 3
  (integer)9
  127.0.0.1:6379>INCRBY rows 3
  (integer)12
  #键不存在
  127.0.0.1:6379>get num
  (nil)
  127.0.0.1:6379>INCRBY num -2
  (integer)-2
  127.0.0.1:6379>INCRBY num -2
  (integer)-4
  127.0.0.1:6379>INCRBY num -2
  (integer)-6
1.13.      INCRBYFLOAT
  INCRBYFLOAT keyincrement
  为 key 中所储存的值加上浮点数增量 increment 。
  如果 key 不存在,那么 INCRBYFLOAT 会先将 key 的值设为 0 ,再执行加法操作。
  如果命令执行成功,那么 key 的值会被更新为(执行加法之后的)新值,并且新值会以字符串的形式返回给调用者。
  无论是 key 的值,还是增量 increment ,都可以使用像 2.0e7 、 3e5 、 90e-2 那样的指数符号(exponential notation)来表示,但是,执行 INCRBYFLOAT 命令之后的值总是以同样的形式储存,也即是,它们总是由一个数字,一个(可选的)小数点和一个任意位的小数部分组成(比如 3.14 、 69.768 ,诸如此类),小数部分尾随的 0 会被移除,如果有需要的话,还会将浮点数改为整数(比如 3.0 会被保存成 3 )。
  127.0.0.1:6379>set price 45.99
  OK
  127.0.0.1:6379>INCRBYFLOAT price 4.5
  "50.49"
  127.0.0.1:6379>INCRBYFLOAT price 4.5
  "54.99"
  127.0.0.1:6379>get num
  (nil)
  127.0.0.1:6379>INCRBYFLOAT num 5.3
  "5.3"
  127.0.0.1:6379>INCRBYFLOAT num 5.3
  "10.6"
1.14.      DECR
  DECR key
  将 key 中储存的数字值减一。
  如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
  如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
  127.0.0.1:6379>set price 398.99
  OK
  127.0.0.1:6379>decr price
  (error)ERR value is not an integer or out of range
  127.0.0.1:6379>set pages 98
  OK
  127.0.0.1:6379>decr pages
  (integer)97
  127.0.0.1:6379>decr pages
  (integer)96
1.15.      DECRBY
  DECRBY keydecrement
  将 key 所储存的值减去减量 decrement 。
  如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY 操作。
  如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
  127.0.0.1:6379>get pages
  "96"
  127.0.0.1:6379>decrby pages 5
  (integer)91
  127.0.0.1:6379>decrby pages 5
  (integer)86
  127.0.0.1:6379>decrby pages -5
  (integer)91
  127.0.0.1:6379>decrby pages -5
  (integer)96
  127.0.0.1:6379>
1.16.      APPEND
  APPEND key value
  如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
  如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
  127.0.0.1:6379> get db
  (nil)
  127.0.0.1:6379> APPENDdb redis
  (integer) 5
  127.0.0.1:6379> APPENDdb .io
  (integer) 8
  127.0.0.1:6379> get db
  "redis.io"
  127.0.0.1:6379>
1.17.      STRLEN
  STRLEN key
  返回 key 所储存的字符串值的长度。
  当 key 储存的不是字符串值时,返回一个错误。
  127.0.0.1:6379> getpages
  "96"
  127.0.0.1:6379> STRLENpages
  (integer) 2
  127.0.0.1:6379> get db
  "redis.io"
  127.0.0.1:6379> STRLENdb
  (integer) 8
  127.0.0.1:6379>
  参考自:
  http://redis.io/
  http://redis.readthedocs.org


运维网声明 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-631512-1-1.html 上篇帖子: 配置redis自启动脚本 下篇帖子: Redis一键编译安装脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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