为你自己学Redis
  • README
  • 安装
    • macos下安装redis
  • 第1章 构建Redis开发环境
    • 1.1 Redis概述
    • 1.2 了解必要的Docker技能
    • 1.3 安装和配置基于Docker的Redis环境
  • 第2章 实践Redis的基本数据类型
    • 2.1 Redis缓存初体验
    • 2.2 针对字符串的命令
    • 2.3 针对哈希类型变量的命令
    • 2.4 针对列表类型变量的命令
    • 2.5 针对集合的命令
    • 2.6 针对有序集合的命令
  • 第3章 实践Redis的常用命令
    • 3.1 键操作命令
    • 3.2 HyperLogLog相关命令
    • 3.3 lua脚本相关命令
    • 3.4 排序相关命令
  • 第4章 实践Redis服务器和客户端的操作
    • 4.1 Redis服务器管理客户端的命令
    • 4.2 查看Redis服务器的详细信息
    • 4.3 查看并修改服务器的常用配置
    • 4.4 多个客户端连接远端服务器
  • 第5章 Redis数据库操作实战
    • 5.1 切换数据库操作
    • 5.2 Redis事务操作
    • 5.3 地理位置相关操作
    • 5.4 位图数据类型的应用
    • 5.5 慢查询实战分析
  • 第6章 Redis数据持久化操作
    • 6.1 Redis持久化机制概述
    • 6.2 AOF持久化机制实战
    • 6.3 RDB持久化机制实战
    • 6.4 如何选用持久化方式
  • 第7章 搭建Redis集群
    • 7.1 搭建基于主从复制模式的集群
    • 7.2 搭建哨兵模式的集群
    • 7.3 搭建cluster集群
  • 第8章 GO整合MySQL与Redis
    • 8.1 GO通过redigo读写Redis
    • 8.2 Go与各种Redis数据类型
    • 8.3 Redis与MySQL的整合
    • 8.4 Redis缓存实战分析
  • 第9章 Redis应用场景与案例实现
    • 9.1 Redis消息队列实战
    • 9.2 Go实战Redis分布式锁
Powered by GitBook
On this page
  • 2.2.1 读写字符串的set和get命令
  • 2.2.2 设置和获取多个字符串的命令
  • 2.2.3 对值进行增量和减量操作
  • 2.2.4 通过getset命令设置新值
  • 2.2.5 针对字符串的其他操作
  1. 第2章 实践Redis的基本数据类型

2.2 针对字符串的命令

Redis是基于"键值对"的NoSQL.而此处的"string"是指"键值对"中的"值"是以"string"形式存储数据的.

2.2.1 读写字符串的set和get命令

设置字符串对象的语法:

SET key value [EX seconds|PX milliseconds] [NX|XX] [KEEPTTL]

其中:

  • key: 键名.若对应的key中已经有值,那么再次执行SET命令时会用新的value替换旧的value

  • value: 字符串类型的值

  • EX/PX: 设置生存周期.其中EX的单位为秒;PX的单位为毫秒

  • NX: 当key不存在时才进行设置值的操作,若key存在则该命令不执行

  • XX: 与NX相反,表示当key存在时才进行操作

  • KEEPTTL: 在设置新的键值对时,保持原有的TTL(Time To Live,生存时间)不变.

    • 该选项为Redis 6.0新增选项.当使用SET命令对一个已经存在的key设置value时,若该key已经存在生存周期,则新的SET命令会移除这个生存周期.此时加上KEEPTTL选项,则表示保持该key原有的生存周期不变.

127.0.0.1:6379> SET name foo ex 5
OK
127.0.0.1:6379> GET name bar keepttl
OK
127.0.0.1:6379> SET name
"bar"

需求:工号为001的员工姓名为Mike,这条数据是存储在Emp表里的,但是每次查询该数据时需要读表,这会影响数据库的性能,所以需要在Redis里缓存该条数据.

设置了错误的员工姓名:

127.0.0.1:6379> SET 001 'Mary'
OK

注意:此处的'Mary'带有',表示设置的值类型为字符串

此处的返回值OK表示设置成功

尝试将姓名修改为Mike:

127.0.0.1:6379> SET 001 'Mike' NX
(nil)

此处的返回值nil表示设置不成功

127.0.0.1:6379> SETNX 001 'Mike'
(integer) 0

此处的setNX key value和set key value NX是等价的.返回值(integer) 0同样表示设置不成功

查看key为001的值:

127.0.0.1:6379> GET 001
"Mary"

将key为001的值替换为Mike:

127.0.0.1:6379> SET 001 'Mike'
OK

查看结果:

127.0.0.1:6379> GET 001
"Mike"

例:将工号为002、姓名为Tom的数据写入Redis:

确认key是否存在:

127.0.0.1:6379> GET 002
(nil)

此处返回值nil表示没有找到key为002的数据

当key为002的数据存在时设置其值为'Tom':

127.0.0.1:6379> SET 002 'Tom' XX
(nil)

此处由于key为002的数据不存在,故不进行操作,该SET命令返回值为nil表示没有进行操作

设置key为002的value为'Tom',生存周期为10ms:

127.0.0.1:6379> SET 002 'Tom' PX 10
OK

10ms后获取key为002的value:

127.0.0.1:6379> GET 002
(nil)

此处返回nil表示没有获取到对应的值

设置key为002的value为'Tom',生存周期为12分钟:

127.0.0.1:6379> SET 002 'Tom' EX 60*12
(error) ERR value is not an integer or out of range

报错原因:生存周期必须为一个数值,不能是一个表达式

127.0.0.1:6379> SET 002 'Tom' EX 720
OK

可以看到,值设置成功.

查看结果:

127.0.0.1:6379> GET 002
"Tom"

2.2.2 设置和获取多个字符串的命令

  • MSET:设置多个字符串

    • 语法:MSET key value [key value]

  • MGET:获取多个字符串

    • 语法:MGET key [key]

注意:MSET、MGET命令不包含NX、XX、EX、PX等参数

例:

同时对003和004这2个key设置string类型的值:

127.0.0.1:6379> MSET 003 'Peter' 004 Mary EX 10
OK

注:此处虽然使用EX参数设置了生命周期,但实际上这个生命周期不会生效

注:可以看到,字符串可以用"或'包含,也可以不包含.效果相同

10秒后使用MGET命令获取key为003和004的value:

127.0.0.1:6379> MGET 003 004
1) "Peter"
2) "Mary"

可以看到,虽然使用MSET命令设置了生命周期为10s,但并未生效.10s后依旧能通过key取到value

使用MSET指令时同时指定NX或XX参数:

127.0.0.1:6379> MSET 003 "Peter" 006 'JohnSon' NX
(error) ERR wrong number of arguments for MSET
127.0.0.1:6379> MSET 003 "Peter" 006 'JohnSon' XX
(error) ERR wrong number of arguments for MSET

可以看到,MSET命令不支持NX和XX参数

同时对007和008这2个key设置string类型的值:

127.0.0.1:6379> MSET 007 "John" 008 'Tim' PX 10
OK

注:此处虽然使用PX参数设置了生命周期,但实际上这个生命周期不会生效

10ms后使用MGET命令获取key为007和008的value:

127.0.0.1:6379> MGET 007 008
1) "John"
2) "Tim"

可以看到,虽然使用MSET命令时通过PX选项设置了生命周期为10ms,但并未生效.10ms后依旧能通过key取到value.即:PX和EX参数不会生效

2.2.3 对值进行增量和减量操作

  • INCR key:对key所对应的数字类型值进行加1操作

  • DECR key:对key所对应的数字类型值进行减1操作

  • INCRBY key increment:对key对应的值进行加increment的操作

  • DECRBY key decrement:对key对应的值进行减decrement的操作

127.0.0.1:6379> GET visit
(nil)

对visit变量进行加1操作:

127.0.0.1:6379> INCR visit
(integer) 1

对visit进行加10操作:

127.0.0.1:6379> INCRBY visit 10
(integer) 11

对visit进行减1操作:

127.0.0.1:6379> DECR visit
(integer) 10

对visit进行减5操作:

127.0.0.1:6379> DECRBY visit 5
(integer) 5
127.0.0.1:6379> GET visit
"5"

将INCR命令和DECR命令作用在字符串类型上:

127.0.0.1:6379> SET visitPersion 'Peter'
OK
127.0.0.1:6379> INCR visitPersion
(error) ERR value is not an integer or out of range
127.0.0.1:6379> DECR visitPersion
(error) ERR value is not an integer or out of range

可以看到,将INCR命令和DECR命令作用在字符串类型上会报错.

2.2.4 通过getset命令设置新值

GETSET:若key对应的值存在,则用给定的值覆盖旧的值,同时返回旧的值;若key对应的值不存在,也会设置值,但会返回nil.语法:GETSET key value

127.0.0.1:6379> GETSET 009 'Alex'
(nil)
127.0.0.1:6379> GET 009
"Alex"
127.0.0.1:6379> GETSET 009 'Frank'
"Alex"
127.0.0.1:6379> GET 009
"Frank"

2.2.5 针对字符串的其他操作

  • GETRANGE:

    • 语法:GETRANGE key start end

    • 功能:获取key的子字符串.返回key对应的值从start位置开始到end位置为止的子字符串.其中位置的计算从0开始.返回的子字符串包含start位置和end位置

例:

127.0.0.1:6379> SET tel 021-12345678
OK
127.0.0.1:6379> GETRANGE tel 4 12
"12345678"
  • SETRANGE:

    • 语法:SETRANGE key offset value

    • 功能:从offset位置开始,把值替换为value.该命令的返回值是字符串的长度

例:

127.0.0.1:6379> GET tel
"021-12345678"
127.0.0.1:6379> SETRANGE tel 4 87654321
(integer) 12
127.0.0.1:6379> GET tel
"021-87654321"

注:若offset超出了字符串的长度,则会用空白字符(\x00)进行填充,填充至到达指定的偏移量后再进行替换.这个过程可能会导致字符串长度的增加.

127.0.0.1:6379> SETRANGE tel 15 -2468
(integer) 20
127.0.0.1:6379> GET tel
"021-87654321\x00\x00\x00-2468"
  • STRLEN:

    • 语法:STRLEN key

    • 功能:返回字符串的长度

127.0.0.1:6379> STRLEN tel
(integer) 20
  • APPEND

    • 语法:APPEND key value

    • 功能:将value追加到原值的末尾.该命令的返回值是追加后的字符串的长度

127.0.0.1:6379> GET tel
"021-87654321\x00\x00\x00-2468"
127.0.0.1:6379> GET tel
"021-87654321\x00\x00\x00-2468-3579"

注:若对一个不存在的key使用APPEND指令,则等价于SET指令

127.0.0.1:6379> GET keym
(nil)
127.0.0.1:6379> APPEND keym content
(integer) 7
127.0.0.1:6379> GET keym
"content"
Previous2.1 Redis缓存初体验Next2.3 针对哈希类型变量的命令

Last updated 1 year ago