Redis从入门到精通——Redis数据类型——1、字符串(String)命令
Redis数据类型——1、字符串(String)命令
需要说明的是,Redis 命令名称的大小写并不影响命令表的查找结果。Redis 的命令表使用的是与大小写无关的查找算法,输入的命令名称只要是正确的,无论大小写,都能得到正确的结果,命令表就能返回相同的 redisCommand 结构。
在获取键值对中文的时候,如果值是中文的,则返回编码后的字符串。如果你希望返回值是中文的,那么在客户端连接服务器端时,可以使用命令 "redis-cli -raw" 将底层编码的字符串转换为中文。
[root@localhost.localdomain current]#pwd /usr/local/redis/current [root@localhost.localdomain current]#ll total 304 -rw-rw-r--. 1 root root 157632 Mar 27 2018 00-RELEASENOTES -rw-rw-r--. 1 root root 53 Mar 27 2018 BUGS -rw-rw-r--. 1 root root 1815 Mar 27 2018 CONTRIBUTING -rw-rw-r--. 1 root root 1487 Mar 27 2018 COPYING drwxrwxr-x. 6 root root 192 Mar 17 10:22 deps -rw-rw-r--. 1 root root 11 Mar 27 2018 INSTALL -rw-rw-r--. 1 root root 151 Mar 27 2018 Makefile -rw-rw-r--. 1 root root 4223 Mar 27 2018 MANIFESTO -rw-rw-r--. 1 root root 20543 Mar 27 2018 README.md -rw-rw-r--. 1 root root 58766 Mar 27 2018 redis.conf -rwxrwxr-x. 1 root root 271 Mar 27 2018 runtest -rwxrwxr-x. 1 root root 280 Mar 27 2018 runtest-cluster -rwxrwxr-x. 1 root root 281 Mar 27 2018 runtest-sentinel -rw-rw-r--. 1 root root 7606 Mar 27 2018 sentinel.conf drwxrwxr-x. 3 root root 8192 Mar 17 10:47 src drwxrwxr-x. 10 root root 167 Mar 27 2018 tests drwxrwxr-x. 8 root root 4096 Mar 27 2018 utils [root@localhost.localdomain current]#src/redis-cli -h 127.0.0.1 -p 6379 127.0.0.1:6379> set className 仠[EX seconds] [PX milliseconds] [NX|XX] [root@localhost.localdomain current]#set className 你们的胃叫胃,孤的叫胃PLUS^C [root@localhost.localdomain current]#src/redis-cli -h 127.0.0.1 -p 6379 127.0.0.1:6379> set className 你们的胃叫胃,孤的叫胃PLUS OK 127.0.0.1:6379> get className "\xe4\xbd\xa0\xe4\xbb\xac\xe7\x9a\x84\xe8\x83\x83\xe5\x8f\xab\xe8\x83\x83\xef\xbc\x8c\xe5\xad\xa4\xe7\x9a\x84\xe5\x8f\xab\xe8\x83\x83PLUS" 127.0.0.1:6379> [root@localhost.localdomain current]#src/redis-cli -h 127.0.0.1 -p 6379 --raw 127.0.0.1:6379> get className 你们的胃叫胃,孤的叫胃PLUS 127.0.0.1:6379>
一、Redis 数据类型之字符串(String)命令
字符串类型是 Redis 中最基本的数据类型,它是二进制安全的,任何形式的字符串都可以存储,包括二进制数据、序列化后的数据,JSON化的对象,甚至是一张经 Base64 编码后的图片。String 类型的键最大能存储 512 MB 的数据。
Redis 字符串类型的相关命令用于管理 Redis 的字符串值。下面以一张学生表为例,来讲解 String 类型的相关命令,如下表:
1.1 设置键值对
1.1.1 SET 命令:设置键值对
命令格式:
127.0.0.1:6379> set key value [EX seconds] [PX milliseconds] [NX|XX]
使用 SET 命令将字符串值 value 设置到 key 中。如果 key 中已经存在其他值,则在执行 SET 命令后,将会覆盖旧值,并且忽略类型。针对某个带有生存时间的 key 来说,当 SET 命令成功时,这个 key 上的生存时间会被清除。
SET 命令的可选参数时下:
-
- EX seconds:用于设置 key 的过期时间为多少秒(seconds)。其中,SET key value EX seconds 等价于 SETEX key seconds value。
- PX milliseconds:用于设置 key 的过期时间为多少毫秒(milliseconds)。其中,SET key value PX milliseconds 等价于 PSETEX key milliseconds value。
- NX:表示当 key 不存在时,才对 key 进行设置操作。其中,SET key value NX 等价于 SETNX key value。
- XX:表示当 key 存在时,才对 key 进行设置操作。
返回值:如果 SET 命令设置成功,则会返回 OK。如果设置了 NX 或 XX,但因为条件不足而设置失败,则会返回空批量回复(NULL Bulk Reply)。
stuName |
stuID |
age |
sex |
height |
weight |
birthday |
className |
刘河飞 |
2018001 |
22 |
男 |
171 |
75 |
1996-02-14 |
计算机科学与技术1班 |
赵雨梦 |
2018002 |
22 |
女 |
172 |
72 |
1996-03-15 |
软件工程2班 |
宋飞 |
2018003 |
23 |
男 |
175 |
73 |
1996-04-16 |
机械自动化1班 |
使用 SET 命令将一条学生信息添加到数据库中,操作如下:
[root@localhost.localdomain current]#src/redis-cli -h 127.0.0.1 -p 6379 --raw 127.0.0.1:6379> set stuName-1 '刘河飞' OK 127.0.0.1:6379> get stuName-1 刘河飞 127.0.0.1:6379> set stuID-1 2018001 OK 127.0.0.1:6379> get stuID-1 2018001 127.0.0.1:6379> set age-1 22 OK 127.0.0.1:6379> get age-1 22 127.0.0.1:6379> set sex-1 '男' OK 127.0.0.1:6379> get sex-1 男 127.0.0.1:6379> set height-1 171 OK 127.0.0.1:6379> get height-1 171 127.0.0.1:6379> set weight-1 1996-02-14 OK 127.0.0.1:6379> get weight-1 1996-02-14 127.0.0.1:6379> set className '计算机科学与技术1班' OK 127.0.0.1:6379> get className 计算机科学与技术1班 127.0.0.1:6379>
1.1.2 MSET 命令:设置多个键值对
命令格式:
127.0.0.1:6379> mset key value [key value ...]
使用 MSET 命令同时设置多个键值对。如果某个 key 已经存在,那么 MSET 命令会用新值覆盖旧值。MSET 命令是一个原子性操作,所有给定 key 都会在同一时间内被设置更新,不存在某些 key 被更新了而另一些 key 没有被更新的情况。
返回值:总是返回 OK,因为 MSET 命令不可能设置失败。
使用 SET 命令来逐个添加学生信息到数据库中比较麻烦,下面使用 MSET 命令来一次洗添加多个键值对,操作如下:
127.0.0.1:6379> MSET stuName-2 '赵雨梦' stuID-2 2018002 age-2 22 sex-1 '女' height-2 172 weight-2 72 birthday-2 1996-03-15 className-2 '软件工程2班' OK 127.0.0.1:6379> MSET stuName-3 '宋飞' stuID-3 2018003 age-3 23 sex-1 '男' height-3 175 weight-3 73 birthday-3 1996-04-16 className-3 '机械自动化1班' OK
1.1.3 SETNX 命令:设置不存在的键值对
命令格式:
127.0.0.1:6379> setnx key value
SETNX 是 set if not exists 的缩写。如果 key 不存在,则设置值,当且仅当 key 不存在时。如果 key 已经存在,则 SETNX 什么也不做。
返回值:SETNX 命令设置成功返回 1,设置失败返回 0。
设置学院名称,操作如下:
127.0.0.1:6379> SETNX collegeName '计算机学院' #设置学院名称为 "计算机学院" 1 127.0.0.1:6379> SETNX collegeName '计算机工程学院' #更名为 "计算机学院" 0 127.0.0.1:6379> get collegeName 计算机学院 127.0.0.1:6379>
1.1.4 MSETNX 命令:设置多个不存在的键值对
命令格式:
127.0.0.1:6379> MSETNX key value [key value ...]
使用 MSETNX 命令同时设置多个键值对,当且仅当所有给定 key 都不存在时设置。与 MSET 命令类似,如果有一个给定的 key 已存在,那么 MSETNX 命令也会拒绝执行给所有 key 的设置操作。MSETNX 命令是原子性的,它可以用来设置多个不同 key 表示不同字段的唯一性逻辑对象,所有字段要么全部被设置,要么全部设置失败。
为学生分配多名专业课老师,操作如下:
127.0.0.1:6379> MSETNX Chinese-teacher '郭涛' Math-teacher '杨艳' English-teacher '吴芳' 1 127.0.0.1:6379> MSETNX Chinese-teacher '郭涛' Math-teacher '杨艳' English-teacher '吴芳' 0 127.0.0.1:6379>
1.2 获取键值对
1.2.1 GET 命令:获取键值对的值
命令格式:
127.0.0.1:6379> get key
使用 GET 命令获取 key 中设置的字符串值。如果 key 中存储的值不是字符串类型的,则会返回一个错误,因为 GET 命令只能用于处理字符串的值;当 key 不存在时,返回 nil。
返回值:当 key 存在时,返回 key 所对应的值;如果 key 不存在,则返回 nil;如果 key 不是字符串类型的,则返回错误。
使用 GET 命令查看学生的基本信息,操作如下:
127.0.0.1:6379> GET stuName-1 刘河飞 127.0.0.1:6379> GET stuID-1 2018001 127.0.0.1:6379> GET stuID-10 127.0.0.1:6379>
1.2.2 MGET 命令:获取多个键值对的值
命令格式:
127.0.0.1:6379> mget key [key ...]
使用 MGET 命令同时返回多个给定的 key 的值,key 之间使用空格隔开。如果在给定的 key 中有不存在的key,那么这个 key 返回的值为 nil。
返回值:一个包含所有给定 key 的值的列表
使用 MGET 命令来获取多名学生的信息,操作如下:
127.0.0.1:6379> MGET stuName-2 stuID-2 age-2 sex-2 height-2 weight-2 birthday-2 className-2 赵雨梦 2018002 22 女 172 72 1996-03-15 软件工程2班 127.0.0.1:6379>
1.2.3 GETRANGE 命令:获取键的子字符串值
命令格式:
127.0.0.1:6379> getrange key start end
使用 GETRANGE 命令来获取 key 中字符串值从 start 开始到 end 结束的子字符串,下标从 0 开发(字符串截取)。start 和 end 参数是整数,可以取负值。当取负值时,表示从字符串最后开始计数,-1 表示最后一个字符,-2表示倒数第二个字符,以此类推。
返回值:返回截取的子字符串。
set Mojito-jay '麻烦给我的爱人来一杯Mojito,我喜欢阅读她微醺时的眼眸,而我的咖啡糖不用太多,这世界已经因为她甜得过头' 127.0.0.1:6379> GETRANGE Mojito-jay 0 35 麻烦给我的爱人来一杯Mojito 127.0.0.1:6379> GETRANGE Mojito-jay -15 -1 她甜得过头 127.0.0.1:6379> GETRANGE Mojito-jay -36 -1 这世界已经因为她甜得过头
1.3 键值对的偏移量
1.2.3 SETBIT 命令:设置键的偏移量
命令格式:
127.0.0.1:6379> setbit key offset value
使用 SETBIT 命令对 key 所存储的字符串值设置或清除指定偏移量上的位(bit)。value 参数值决定了位的设置或清除,value 值取 0 或 1。当 key 不存在时,自动生成一个新的字符串。这个字符串是动态的,它可以扩展,以确保将 value 保存到指定的偏移量上。当这个字符串扩展时,使用 0 来填充空白位置。offset 参数必须是大于或等于 0,并且小于 2^32(bit 映射被限制在 512MB 之内)的正整数。在默认情况下,bit 初始化为 0。
返回值:返回指定偏移量原来存储的位。
设置学生 1 姓名及学院名的偏移量,操作如下:
1.2.4 GETBIT 命令:获取键的偏移量值
命令格式:
127.0.0.1:6379> getbit key offset
对 key 所存储的字符串值,使用 GETBIT 命令来获取指定偏移量上的位(bit)。当 offset 的值超过了字符串的最大长度,或者 key 不存在时,返回 0。
返回值:返回字符串值指定偏移量上的位(bit)。
获取学生1姓名及学院命的偏移量值,操作如下:
127.0.0.1:6379> GETBIT stuName-1 6 1 127.0.0.1:6379> GETBIT stuName-1 1 1 127.0.0.1:6379> GETBIT stuName-1 2 1 127.0.0.1:6379> GETBIT stuName-1 3 0 127.0.0.1:6379> GETBIT stuName-1 4 0 127.0.0.1:6379> GETBIT stuName-1 5 1 127.0.0.1:6379> get stuName-1 爘河飞 127.0.0.1:6379> getbit stuName-1 6 1 127.0.0.1:6379> getbit stuName-1 7 1 127.0.0.1:6379>
1.4 设置键的生存时间
1.4.1 SETEX 命令:为键设置生存时间(秒)
命令格式:
127.0.0.1:6379> setex key seconds value
使用 SETEX 命令将 value 值设置到 key 中,并设置 key 的生存时间为多少秒(seconds)。如果 key 已经存在,则 SETEX 命令将覆写旧值。
它等价于:
set key value
expire key seconds
SETEX 命令是一个原子性命令,它设置 value 与设置生存时间是在同一个时间完成的。
返回值:设置成功返回 OK;当 seconds 参数不合法时,返回错误。
为不存在的键(学校名)设置生成时间,操作如下:
127.0.0.1:6379> setex schoolName 100 '清华大学' OK 127.0.0.1:6379> get schoolName 清华大学 127.0.0.1:6379> time 1615962490 440289 127.0.0.1:6379> get schoolName 清华大学 127.0.0.1:6379> time 1615962522 252610 127.0.0.1:6379> get schoolName 127.0.0.1:6379> time 1615962590 824465 127.0.0.1:6379>
1.4.2 PSETEX 命令:为键设置生存时间(毫秒)
命令格式:
127.0.0.1:6379> psetex key milliseconds value
使用 PSETEX 命令设置 key 的生存时间,以毫秒为单位。设置成功时返回 OK。
以毫秒的形式,设置键(学校地址)的生存时间,操作如下:
127.0.0.1:6379> psetex school-address 3000 '北京 ' OK 127.0.0.1:6379> GET school-address 北京 127.0.0.1:6379> GET school-address 北京 127.0.0.1:6379> GET school-address 127.0.0.1:6379>
1.5 键值对的值操作
1.5.1 SETRANGE 命令:替换键的值
命令格式:
127.0.0.1:6379> setrange key offset value
使用 SETRANGE 命令从指定的位置(offset)开始将 key 的值替换为新的字符串。比如旧值为 hello world,执行命令 SETRANGE 5 Redis,表示从第5个下标位置开始替换我新的字符串 Redis,其结果为 helloredis。如果有不存在的 key,就当做空白字符串处理。
127.0.0.1:6379> setrange hello 5 redis 11 127.0.0.1:6379> get hello helloredisd 127.0.0.1:6379>
注意:offset 的最大偏移量是 2^29-1(536870911),因为 Redis 字符串的大小被限制在 512 MB 以内。假如需要使用比这更大的空间,则可以使用多个 key 来存储。
返回值:返回执行 SETRANGE 命令之后的字符串的长度。
替换Mojito-jav的value,操作如下:
127.0.0.1:6379> get Mojito-jay 麻烦给我的爱人来一杯Mojito,我喜欢阅读她微醺时的眼眸,而我的咖啡糖不用太多,这世界已经因为她甜得过头 127.0.0.1:6379> SETRANGE Mojito-jay 6 '宝贝' 141 127.0.0.1:6379> get Mojito-jay 麻烦宝贝的爱人来一杯Mojito,我喜欢阅读她微醺时的眼眸,而我的咖啡糖不用太多,这世界已经因为她甜得过头 127.0.0.1:6379>
1.5.2 GETSET 命令:为键设置新值
命令格式:
127.0.0.1:6379> getset key value
使用 GETSET 命令将给定义 key 的值设置为 value,并返回 key 的旧值。当 key 存在但不是字符串类型时,将会返回错误。
127.0.0.1:6379> EXISTS motto-1 0 127.0.0.1:6379> GETSET motto-1 '女人只会影响我拔剑的速度' 127.0.0.1:6379> GET motto-1 女人只会影响我拔剑的速度 127.0.0.1:6379> GETSET motto-1 '女人只会影响我拔剑的速度,但富婆不会' 女人只会影响我拔剑的速度
1.5.3 APPEND命令:为键追加值
命令格式:
127.0.0.1:6379> append key value
如果 key 存在且是字符串类型的,则将 value 值追加到 key 旧值的末尾。如果 key 不存在,则将 key 设置值为 value。
返回值:返回追加 value 之后,key 中字符串的长度。
为 Mojito-jay 追加新值,操作如下:
127.0.0.1:6379> EXISTS Mojito-jay 1 127.0.0.1:6379> GET Mojito-jay 麻烦宝贝的爱人来一杯Mojito,我喜欢阅读她微醺时的眼眸,而我的咖啡糖不用太多,这世界已经因为她甜得过头 127.0.0.1:6379> APPEND Mojito-jay '就别浪费时间介绍收起来吧,拱廊的壁画 旧城的涂鸦,所有色彩都因为她说不出话,这爱不落幕 忘了心事的国度,你所在之处 孤单都被征服,铁铸的招牌 错落着就像,一封封城市 献给天空的情书' 401 127.0.0.1:6379> GET Mojito-jay 麻烦宝贝的爱人来一杯Mojito,我喜欢阅读她微醺时的眼眸,而我的咖啡糖不用太多,这世界已经因为她甜得过头就别浪费时间介绍收起来吧,拱廊的壁画 旧城的涂鸦,所有色彩都因为她说不出话,这爱不落幕 忘了心事的国度,你所在之处 孤单都被征服,铁铸的招牌 错落着就像,一封封城市 献给天空的情书 127.0.0.1:6379>
1.6 键值对的计算
1.6.1 BITCOUNT 命令:计算比特位数量
命令格式:
127.0.0.1:6379> bitcount key [start end]
使用 BITCOUNT 命令计算在给定的字符串中被设置为 1 的比特位数量。它有两个参数:start 和 end。如果不设置这两个参数,则表示它会对整个字符串进行计数;如果指定了这两个参数值,则可以让计数只在特定的位上进行。start 和 end 参数都是整数值,可以取负数,比如,-1 表示字符串的最后一个字节,-2 表示字符串的倒数第二个字节,以此类推。如果被计数的 key 不存在,就会被当成空字符串来处理,其计数结果为 0 。
计算学生3姓名的比特位数量,操作如下:
127.0.0.1:6379> get stuName 127.0.0.1:6379> get stuName-3 宋飞 127.0.0.1:6379> bitcount stuName-3 #计算学生3姓名的比位数量,为28 28 127.0.0.1:6379> bitcount stuName-3 0 4 #计算学生3姓名在 0~4 之间的比特位数量 23 127.0.0.1:6379> bitcount stuName-3 0 27 28 127.0.0.1:6379> bitcount stuName-3 0 26 28 127.0.0.1:6379> bitcount stuName-3 0 24 28 127.0.0.1:6379> bitcount stuName-3 0 23 28 127.0.0.1:6379> setbit stuName-3 100 1 #设置学生3姓名在偏移量为100 处的比特位 0 127.0.0.1:6379> bitcount stuName-3 0 23 #28+1 29 127.0.0.1:6379>
1.6.2 BITOP命令:对键进行位元运算
命令格式:
127.0.0.1:6379> bitop operation destkey key [key ...]
使用 BITOP 命令对一个或多个保存二进制位的字符串 key 进行位元运算,并将运算结果保存到 destkey 中。operation 表示位元操作符,它可以是 AND、OR、NOT、XOR 这 4 种操作种的任意一种。具体操作如下:
-
- 127.0.0.1:6379> bitop and destkey key [key ...]:表示对一个或多个 key 求逻辑并,并将结果保存到 destkey 中。
- 127.0.0.1:6379> bitop or destkey key [key ...]:表示对一个或多个 key 求逻辑或,并将结果保存到 destkey 中。
- 127.0.0.1:6379> bitop not destkey key [key ...]:表示对给定 key 求逻辑非,并将结果保存到 destkey 中。
- 127.0.0.1:6379> bitop xor destkey key [key ...]:表示对一个或多个 key 求逻辑异或,并将结果保存到 destkey 中。
除 NOT 操作之外,其余的操作都可以接收一个或多个 key 作为参数。当使用 BITOP 命令来进行不同长度的字符串的位元运算时,较短的那个字符串所缺少的部分将会被看作 0。空的 key 也被看作包含 0 的字符串序列。
返回值:返回保存到 destkey 中的字符串的长度,这个长度和输入 key 中最长的字符串的长度相等。
1.6.3 STRLEN 命令:统计键的值的字符长度
命令格式:
127.0.0.1:6379> strlen key
使用命令 STRLEN 统计 key 的值的字符长度。当 key 存储的不是字符串时,返回一个错误。当 key 不存在时,返回0。
统计 Mojito-jay 的长度,操作如下:
127.0.0.1:6379> STRLEN Mojito-jay 401 127.0.0.1:6379> get Mojito-jay 麻烦宝贝的爱人来一杯Mojito,我喜欢阅读她微醺时的眼眸,而我的咖啡糖不用太多,这世界已经因为她甜得过头就别浪费时间介绍收起来吧,拱廊的壁画 旧城的涂鸦,所有色彩都因为她说不出话,这爱不落幕 忘了心事的国度,你所在之处 孤单都被征服,铁铸的招牌 错落着就像,一封封城市 献给天空的情书 127.0.0.1:6379>
1.7 键值对的值增量
1.7.1 DECR 命令:让键的值减 1
命令格式:
127.0.0.1:6379> decr key
使用 DECR 命令将 key 中存储的数字值减 1.如果 key 不存在,则 key 的值先被初始化为 0,再执行 DECR 操作减 1。注意,这个命令只能对数字类型的数据进行操作(自减)。如果 key 对应的值包含错误类型,或者字符串类型的值不能表示为数字,则将返回一个错误。DECR 操作的值限制在 64 位(bit)有符号数字表示范围之内。
返回值:返回执行 DECR 操作之后 key 的值。
1.7.2 DECRBY 命令:键的值减去减量值
命令格式:
127.0.0.1:6379> decrby key decrement
使用 DECRBY 命令将 key 所存储的值减去减量值 decrement。如果 key 不存在,则 key 的值先被初始化为 0,再执行 DECRBY 命令。如果 DECRBY 命令操作的值包含错误的类型,或者字符串类型的值不能表示为数字,则将返回一个错误。DECRBY 操作的数值限制在 64位(bit)有符号数字表示范围之内。
返回值:返回减去减量值 decrement 的 key 的新值。