前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis命令详解:Strings

Redis命令详解:Strings

作者头像
Jackeyzhe
发布2020-03-11 09:36:32
5000
发布2020-03-11 09:36:32
举报
文章被收录于专栏:代码洁癖患者代码洁癖患者

String类型是Redis中比较常用的类型,因此,和String相关的命令也比较多

APPEND

最早可用版本2.0.0

当指定的key存在,并且value是字符串时,APPEND命令会在字符串末尾追加指定的字符串,如果指定的key不存在,则会创建一个空的字符串,并且追加上指定的value,效果类似于SET命令。

该命令的返回值是执行后字符串的长度。

代码语言:javascript
复制
1127.0.0.1:6379> EXISTS mykey
2(integer) 0
3127.0.0.1:6379> APPEND mykey Jackeyzhe
4(integer) 9
5127.0.0.1:6379> APPEND mykey 2018
6(integer) 13
7127.0.0.1:6379> GET mykey
8"Jackeyzhe2018"

APPEND常被用作为定长的数据提供紧凑的存储。可以通过GETRANGE命令来获取指定长度范围的字符串,这里推荐使用Unix的时间戳作为key,既不会因为单个key过大而影响效率,又节省了大量命名空间。

BITCOUNT

最早可用版本2.6.0

该命令的时间复杂度是O(N),用来统计字符串中被设置为1的比特数。默认检查整个字符串,当然也可以指定起始和结束位置。起始和结束位置可以是负数,例如-1表示最后一个字节,-2表示倒数第二字节,以此类推。

代码语言:javascript
复制
1127.0.0.1:6379> SETBIT bitkey 0 1   #0001
2(integer) 0
3127.0.0.1:6379> BITCOUNT bitkey
4(integer) 1
5127.0.0.1:6379> SETBIT bitkey 2 1   #0101
6(integer) 0
7127.0.0.1:6379> BITCOUNT bitkey
8(integer) 2

这个命令可以用来统计实时的数据。例如,统计用户上线历史,我们可以使用用户名作为key,如果第n天上线,将对应的第n位置为1。这样,即使统计10年的数据,每个用户所使用的内存空间仅仅是456字节。对于这样的数据量来讲,BITCOUNT处理的速度和其他时间复杂度为O(1)的命令是一个数量级的。

BITFIELD

最早可用版本3.2.0

用法:

代码语言:javascript
复制
1BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]

这个命令把Redis的字符串看作是一个bit数组。可以把指定偏移位置的bit当做指定的类型处理。例如,以下命令是对偏移量100的8位有符号整数增1,获取偏移量为0的4位无符号整数。

代码语言:javascript
复制
1> BITFIELD mykey INCRBY i8 100 1 GET u4 0
21) (integer) 1
32) (integer) 0

该命令支持的子命令有:

  • GET
  • SET
  • INCRBY

另外还有一个OVERFLOW命令用来进行INCRBY后的益处控制。下面是OVERFLOW的三种控制方法,默认为WRAP算法。

  • WRAP:回环算法,适用于有符号和无符号两种类型。对于无符号整型,回环计数将对整型最大值进行取模操作;对有符号整数,上溢从最小负数开始,下溢从最大正数开始。例如,i8最大为127,加1后变成-128。
  • SAT:饱和算法,上溢后保持最大整数,下溢后保持最小整数。
  • FAIL:失败算法,这种模式下发生上溢或者下溢,不会做任何操作,返回值为NULL。

该命令的偏移量有两种指定方式,如果是不带前缀的数字,则以字符串位计算,如果数字前有#前缀,则计算偏移量时应该指定数字乘以整型宽度。

BITOP

最早可用版本:2.6.0

时间复杂度:O(N)

用法:

代码语言:javascript
复制
1BITOP operation destkey key [key ...]

对一个或者字符串进行位操作,支持与(AND)、或(OR)、非(NOT)、异或(XOR)操作。除了非操作,其他的都支持多个key作为输入。对于长度不同的字符串,较短的字符串缺少的部分会以0补齐,空key也会被看作全部为0的字符串序列。

该命令返回保存到destkey的字符串长度,也就是输入字符串的最大长度。

代码语言:javascript
复制
1127.0.0.1:6379> set key1 "abcde"
2OK
3127.0.0.1:6379> set key2 "abcd"
4OK
5127.0.0.1:6379> BITOP and dest key1 key2
6(integer) 5
7127.0.0.1:6379> get dest
8"abcd\x00"
BITPOS

最早可用版本:2.8.7

时间复杂度:O(N)

用法:

代码语言:javascript
复制
1BITPOS key bit [start] [end]

该命令用于返回第一个被设置为0或1的位置。可以使用start和end参数指定查询范围,需要注意的是,这个范围指的是字节范围而不是位范围,也就是说start=0,end=2表示在前三个字节中查找。start和end都可以为负值,-1表示最后一位,-2表示倒数第二位,以此类推。

我们通过一些例子来看一下某些特殊情况下的返回值。

代码语言:javascript
复制
 1127.0.0.1:6379> set mykey ""
 2OK
 3127.0.0.1:6379> get mykey
 4""
 5127.0.0.1:6379> bitpos mykey 0
 6(integer) -1
 7127.0.0.1:6379> bitpos mykey 1
 8(integer) -1
 9127.0.0.1:6379> set key1 "\xff"
10OK
11127.0.0.1:6379> bitpos key1 1
12(integer) 0
13127.0.0.1:6379> bitpos key1 0
14(integer) 8

如果是空字符串,那么查找0和1都会返回-1。如果是类似"\xff"这样的字符串,它的0-7位都是1,如果查询0时,会返回再往右数一位也就是第8位。

DECR

最早可用版本:1.0.0

时间复杂度:O(1)

对指定的key进行减1操作,操作数最大为64位有符号整数。如果key不存在,则会先将其设置为0,如果类型不符合,则会抛出错误。

代码语言:javascript
复制
1127.0.0.1:6379> GET unexist
2(nil)
3127.0.0.1:6379> DECR unexist
4(integer) -1
5127.0.0.1:6379> SET mykey "fdsfe"
6OK
7127.0.0.1:6379> DECR mykey
8(error) ERR value is not an integer or out of range
DECRBY

最早可用版本:1.0.0

时间复杂度:O(1)

这个命令与DECR的参数要求和使用方法相同,唯一不同的是它用来减去指定的数值。

GET

最早可用版本:1.0.0

时间复杂度:O(1)

这个不做过多介绍,是最常用的命令之一。返回指定key的值,如果不是字符串,就返回错误。

GETBIT

最早可用版本:2.2.0

时间复杂度:O(1)

返回指定偏移量位的bit值,当key不存在时,返回0。

GETRANGE

最早可用版本:2.4.0

时间复杂度:O(N)

用法:

代码语言:javascript
复制
1GETRANGE key start end

这个命令在Redis2.0之前叫做SUBSTR,返回指定的key的指定范围(包含start和end)的子串。start和end同样也可以是负数,这点可以参考BITPOS命令。

GETSET

最早可用版本:1.0.0

时间复杂度:O(1)

自动把新的value保存到指定key中,并且返回旧的value。如果key存在,但是保存的数据不是字符串则会报错。

INCR

最早可用版本:1.0.0

时间复杂度:O(1)

该命令用于对指定key进行加1操作,与DECR命令正好相反。执行此操作时,字符串被解析为10进制的64位有符号整数。由于Redis内部有整数形式(integer representation)来保存整数,因此不会有整数存储为字符串的额外开销。

INCRBY

最早可用版本:1.0.0

时间复杂度:O(1)

它与INCR命令的关系就像DECR命令和DECRBY命令的关系一样,只是指定了要加的数值。

INCRBYFLOAT

最早可用版本:2.6.0

时间复杂度:O(1)

该命令会把字符串解析为浮点数,然后加上指定的浮点数。如果value不是字符串类型或者不能解析为浮点数,则会报错。返回值的精度为小数点后17位。其内部以科学计数法的形式存储。

MGET

最早可用版本:1.0.0

时间复杂度:O(N),N为取回key的个数

该命令返回多个key的值,对于不是string类型或者不存在的key,都返回nil。

MSET

最早可用版本:1.0.1

时间复杂度:O(N),N为需要设置的key的个数

设置所有的key,如果已经存在,则覆盖旧值。MSET命令是原子操作,并且不会失败。

MSETNX

最早可用版本:1.0.1

时间复杂度:O(N),N为需要设置的key的个数

设置所有的key,如果有一个key已经存在,则所有的key都会设置不成功。返回1表示所有的key都已经设置成功,返回0表示所有的key都没有设置成功。

PSETEX

最早可用版本:2.6.0

时间复杂度:O(1)

用法:

代码语言:javascript
复制
1PSETEX key milliseconds value

该命令类似于SETEX(在后面介绍),唯一不同的时,该命令设置过期时间以毫秒为单位。

SET

最早可用版本:1.0.0

时间复杂度:O(1)

用法:

代码语言:javascript
复制
1SET key value [EX seconds] [PX milliseconds] [NX|XX]

也是最常用的命令之一。在2.6.12版本,SET命令加上了一些参数:

  • EX seconds – 设置键key的过期时间,单位时秒
  • PX milliseconds – 设置键key的过期时间,单位时毫秒
  • NX – 只有键key不存在的时候才会设置key的值
  • XX – 只有键key存在的时候才会设置key的值

加上这参数之后,SET命令已经取代了SETNX、SETEX、PSETEX这三个命令,因此,Redis不再推荐使用这些命令,并且有可能在未来版本中抛弃这些命令。

SETBIT

最早可用版本:2.2.0

时间复杂度:O(1)

用法:

代码语言:javascript
复制
1SETBIT key offset value

设置指定位置的bit值。当key不存在时,会先生成一个字符串,这个字符串必须保证offset处有值。offset必须大于0,小于232(因为bitmap的大小限制为512M)。

SETEX

最早可用版本:2.0.0

时间复杂度:O(1)

为指定key设置value,并且给定超时时间(单位是秒),SETEX是原子操作。

SETNX

最早可用版本:1.0.0

时间复杂度:O(1)

SETNX是"SET if Not Exist"的缩写,也就是说,当key不存在时,才会SET成功,成功返回1,失败返回0。

SETRANGE

最早可用版本:2.2.0

时间复杂度:O(1)

这个命令用来覆盖key的一部分内容,如果offset超出value的长度,则会为string补0。offset最大值是229 -1 (536870911)。

代码语言:javascript
复制
1127.0.0.1:6379> SET follow jackey
2OK
3127.0.0.1:6379> SETRANGE follow 8 lol
4(integer) 11
5127.0.0.1:6379> GET follow
6"jackey\x00\x00lol"
STRLEN

最早可用版本:2.2.0

时间复杂度:O(1)

返回指定key存储的value的长度,如果value不是字符串,则会报错。如果key不存在,则返回0。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码洁癖患者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • APPEND
  • BITCOUNT
  • BITFIELD
  • BITOP
  • BITPOS
  • DECR
  • DECRBY
  • GET
  • GETBIT
  • GETRANGE
  • GETSET
  • INCR
  • INCRBY
  • INCRBYFLOAT
  • MGET
  • MSET
  • MSETNX
  • PSETEX
  • SET
  • SETBIT
  • SETEX
  • SETNX
  • SETRANGE
  • STRLEN
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档