1、键管理

之前通过对五种数据类型的操作命令的学习发现,Redis在对每种数据进行处理之前,都要先指定该数据的key,然后再指定对该数据进行何种操作。

Redis中的key有点类似于Java中的变量名。对某个数据的处理都是以key作为切入点。所以Redis把key作为单独的处理对象抽象出了一套操作命令。key可以想象成一个指向实际数据的指针,对key的操作会直接影响它所指向的数据的状态。

127.0.0.1:6379> SET name tom
OK
127.0.0.1:6379> GET name
"tom"
127.0.0.1:6379> DEL name
(integer) 1
127.0.0.1:6379> GET name
(nil)

想要查看某个数据的类型:

127.0.0.1:6379> SADD direction east west south north
(integer) 4
127.0.0.1:6379> TYPE direction
set
想要更改某个数据的key的名字:
127.0.0.1:6379> RENAME direction direct
OK
127.0.0.1:6379> SMEMBERS direct
1) "north"
2) "west"
3) "south"
4) "east"
1.1 key(键)命令

命令示例

DEL key [key …]

删除给定的一个或多个 key 。不存在的 key 会被忽略。

返回值:被删除key的数量。

示例

//删除单个 key
redis> SET name huangz 
 OKredis> DEL name 
 (integer) 1//删除一个不存在的 key
redis> EXISTS phone 
 (integer) 0redis> DEL phone # 失败,没有 key 被删除 
 (integer) 0//同时删除多个 key
redis> SET name “redis” 
 OKredis> SET type “key-value store” 
 OKredis> SET website “redis.com” 
 OKredis> DEL name type website 
 (integer) 3
1.2 String(字符串)命令

命令示例

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

将字符串值 value 关联到 key 。如果 key 已经持有其他值, SET 就覆写旧值,无视类型。

对于某个原本带有生存时间(TTL)的键来说, 当 SET 命令成功在这个键上执行时, 这个键原有的 TTL 将被清除。

可选参数:

从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改:

EX second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。

PX millisecond :设置键的过期时间为 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。

NX :只在键不存在时,才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value 。

XX :只在键已经存在时,才对键进行设置操作。

因为 SET 命令可以通过参数来实现和 SETNX 、 SETEX 和 PSETEX 三个命令的效果,所以将来的 Redis 版本可能会废弃并最终移除 SETNX 、 SETEX 和 PSETEX 这三个命令。

返回值:在 Redis 2.6.12 版本以前, SET 命令总是返回 OK 。

从 Redis 2.6.12 版本开始, SET 在设置操作成功完成时,才返回 OK 。
如果设置了 NX 或者 XX ,但因为条件没达到而造成设置操作未执行,那么命令返回空批量回复(NULL Bulk Reply)。

//对不存在的键进行设置
示例: 
 redis 127.0.0.1:6379> SET key “value” 
 OKredis 127.0.0.1:6379> GET key 
 “value”// 对已存在的键进行设置
redis 127.0.0.1:6379> SET key “new-value” 
 OKredis 127.0.0.1:6379> GET key 
 “new-value”//使用 EX 选项
redis 127.0.0.1:6379> SET key-with-expire-time “hello” EX 10086 
 OKredis 127.0.0.1:6379> GET key-with-expire-time 
 “hello”redis 127.0.0.1:6379> TTL key-with-expire-time 
 (integer) 10069//使用 PX 选项
redis 127.0.0.1:6379> SET key-with-pexpire-time “moto” PX 123321 
 OKredis 127.0.0.1:6379> GET key-with-pexpire-time 
 “moto”redis 127.0.0.1:6379> PTTL key-with-pexpire-time 
 (integer) 111939//使用 NX 选项
redis 127.0.0.1:6379> SET not-exists-key “value” NX 
 OK # 键不存在,设置成功redis 127.0.0.1:6379> GET not-exists-key 
 “value”redis 127.0.0.1:6379> SET not-exists-key “new-value” NX 
 (nil) # 键已经存在,设置失败redis 127.0.0.1:6379> GEt not-exists-key 
 “value” # 维持原值不变// 使用 XX 选项
redis 127.0.0.1:6379> EXISTS exists-key 
 (integer) 0redis 127.0.0.1:6379> SET exists-key “value” XX 
 (nil) # 因为键不存在,设置失败redis 127.0.0.1:6379> SET exists-key “value” 
 OK # 先给键设置一个值redis 127.0.0.1:6379> SET exists-key “new-value” XX 
 OK # 设置新值成功redis 127.0.0.1:6379> GET exists-key 
 “new-value”// NX 或 XX 可以和 EX 或者 PX 组合使用
redis 127.0.0.1:6379> SET key-with-expire-and-NX “hello” EX 10086 NX 
 OKredis 127.0.0.1:6379> GET key-with-expire-and-NX 
 “hello”redis 127.0.0.1:6379> TTL key-with-expire-and-NX 
 (integer) 10063redis 127.0.0.1:6379> SET key-with-pexpire-and-XX “old value” 
 OKredis 127.0.0.1:6379> SET key-with-pexpire-and-XX “new value” PX 123321 
 OKredis 127.0.0.1:6379> GET key-with-pexpire-and-XX 
 “new value”redis 127.0.0.1:6379> PTTL key-with-pexpire-and-XX 
 (integer) 112999// EX 和 PX 可以同时出现,但后面给出的选项会覆盖前面给出的选项
redis 127.0.0.1:6379> SET key “value” EX 1000 PX 5000000 
 OKredis 127.0.0.1:6379> TTL key 
 (integer) 4993 # 这是 PX 参数设置的值redis 127.0.0.1:6379> SET another-key “value” PX 5000000 EX 1000 
 OKredis 127.0.0.1:6379> TTL another-key 
 (integer) 997 # 这是 EX 参数设置的值
1.3 hash(哈希表)

命令示例

HSET key field value

将哈希表 key 中的域 field 的值设为 value 。如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。如果域 field 已经存在于哈希表中,旧值将被覆盖。

返回值:如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。

redis> HSET website google “www.g.cn” # 设置一个新域 
 (integer) 1redis> HSET website google “www.google.com” # 覆盖一个旧域 
 (integer) 0
1.4 List(列表)

命令示例

LSET key index value

将列表 key 下标为 index 的元素的值设置为 value 。当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。

关于列表下标的更多信息,请参考 LINDEX 命令。

返回值:操作成功返回 ok ,否则返回错误信息。

//对空列表(key 不存在)进行 LSET
redis> EXISTS list 
 (integer) 0redis> LSET list 0 item 
 (error) ERR no such key//对非空列表进行 LSET
redis> LPUSH job “cook food” 
 (integer) 1redis> LRANGE job 0 0 
 1) “cook food”redis> LSET job 0 “play game” 
 OKredis> LRANGE job 0 0 
 1) “play game”// index 超出范围
redis> LLEN list # 列表长度为 1 
 (integer) 1redis> LSET list 3 ‘out of range’ 
 (error) ERR index out of range
1.5 Set(集合)

命令示例

SADD key member [member …]

将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。假如 key 不存在,则创建一个只包含 member 元素作成员的集合。当 key 不是集合类型时,返回一个错误。

在Redis2.4版本以前, SADD 只接受单个 member 值。

返回值:被添加到集合中的新元素的数量,不包括被忽略的元素。

// 添加单个元素
redis> SADD bbs “discuz.net” 
 (integer) 1// 添加重复元素
redis> SADD bbs “discuz.net” 
 (integer) 0// 添加多个元素
redis> SADD bbs “tianya.cn” “groups.google.com” 
 (integer) 2redis> SMEMBERS bbs 
 1) “discuz.net” 
 2) “groups.google.com” 
 3) “tianya.cn”
1.6 SortedSet(有序集合)

命令示例

ZADD key score member [[score member] [score member] …]

将一个或多个 member 元素及其 score 值加入到有序集 key 当中。如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。score 值可以是整数值或双精度浮点数。如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。当 key 存在但不是有序集类型时,返回一个错误。

对有序集的更多介绍请参见 sorted set 。

在 Redis 2.4 版本以前, ZADD 每次只能添加一个元素。

返回值:被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。

// 添加单个元素
redis> ZADD page_rank 10 google.com 
 (integer) 1// 添加多个元素
redis> ZADD page_rank 9 baidu.com 8 bing.com 
 (integer) 2redis> ZRANGE page_rank 0 -1 WITHSCORES 
 1) “bing.com” 
 2) “8” 
 3) “baidu.com” 
 4) “9” 
 5) “google.com” 
 6) “10”// 添加已存在元素,且 score 值不变
redis> ZADD page_rank 10 google.com 
 (integer) 0redis> ZRANGE page_rank 0 -1 WITHSCORES # 没有改变 
 1) “bing.com” 
 2) “8” 
 3) “baidu.com” 
 4) “9” 
 5) “google.com” 
 6) “10”// 添加已存在元素,但是改变 score 值
redis> ZADD page_rank 6 bing.com 
 (integer) 0redis> ZRANGE page_rank 0 -1 WITHSCORES # bing.com 元素的 score 值被改变 
 1) “bing.com” 
 2) “6” 
 3) “baidu.com” 
 4) “9” 
 5) “google.com” 
 6) “10”

2、Pub/Sub发布订阅管理

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。

Redis作为一个server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向Redis server订阅自己感兴趣的消息类型,Redis将消息类型称为通道(channel)。当发布者通过publish命令向Redis server发送特定类型的消息时。订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个 channel,也可以向多个channel发送消息。

例如,一个客户端订阅了“CCTV-5”频道的消息:

127.0.0.1:6379> SUBSCRIBE CCTV-5
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "CCTV-5"
3) (integer) 1

另一个客户端在“CCTV-5”发布了两条消息:

127.0.0.1:6379> PUBLISH CCTV-5 "Kobe will say good bye to NBA in 2016.4.4"
(integer) 1
127.0.0.1:6379>PUBLISH CCTV-5 "Cavaliers Cleveland won the championship"
(integer) 1

第一个客户端就会收到这两条消息:

127.0.0.1:6379> SUBSCRIBE CCTV-5
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "CCTV-5"
3) (integer) 1
1)"message"
2)"CCTV-5"
3)"Kobe will say good bye to NBA in 2016.4.4"
1)"message"
2)"CCTV-5"
3) "CavaliersCleveland won the championship"

命令示例

PSUBSCRIBE pattern [pattern …]

订阅一个或多个符合给定模式的频道。每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。

返回值:接收到的信息(请参见下面的代码说明)。

// 订阅 news.* 和 tweet.* 两个模式
// 第 1 - 6 行是执行 psubscribe 之后的反馈信息 
 // 第 7 - 10 才是接收到的第一条信息 
 // 第 11 - 14 是第二条 
 // 以此类推。。。redis> psubscribe news.* tweet.* 
 Reading messages… (press Ctrl-C to quit) 
 1) “psubscribe” # 返回值的类型:显示订阅成功 
 2) “news.*” # 订阅的模式 
 3) (integer) 1 # 目前已订阅的模式的数量1) “psubscribe” 
 2) “tweet.*” 
 3) (integer) 21) “pmessage” # 返回值的类型:信息 
 2) “news.*” # 信息匹配的模式 
 3) “news.it” # 信息本身的目标频道 
 4) “Google buy Motorola” # 信息的内容1) “pmessage” 
 2) “tweet.*” 
 3) “tweet.huangz” 
 4) “hello”1) “pmessage” 
 2) “tweet.*” 
 3) “tweet.joe” 
 4) “@huangz morning”1) “pmessage” 
 2) “news.*” 
 3) “news.life” 
 4) “An apple a day, keep doctors away”

3、Transaction事务管理

4、Script(脚本)管理命令

命令示例

EVALSHA sha1 numkeys key [key …] arg [arg …]

根据给定的 sha1 校验码,对缓存在服务器中的脚本进行求值。将脚本缓存到服务器的操作可以通过 SCRIPT LOAD 命令进行。这个命令的其他地方,比如参数的传入方式,都和 EVAL 命令一样。

redis> SCRIPT LOAD “return ‘hello moto’” 
 “232fd51614574cf0867b83d384a5e898cfd24e5a”redis> EVALSHA “232fd51614574cf0867b83d384a5e898cfd24e5a” 0 
 “hello moto”

5、connection连接管理命令

默认情况下,Redis没有密码要求,意味着无需通过密码验证就可以连接到Redis 服务。

可以通过更改配置文件中的“requirepass”配置项,来设置密码。

winner@winnerdeMacBook-Pro:~$ Redis-cli
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "" --默认没有密码
127.0.0.1:6379> CONFIG set requirepass"chenlongfei"  --设置密码
OK
127.0.0.1:6379> QUIT  --退出重新连接
winner@winnerdeMacBook-Pro:~$ Redis-cli
127.0.0.1:6379> SET name "clf"
(error) NOAUTH Authentication required.  –提示没权限
127.0.0.1:6379> AUTH chenlongfei  --验证密码
OK
127.0.0.1:6379> SET name "clf"  --之后才能进行操作
OK
127.0.0.1:6379> GET name
"clf"

命令示例

AUTH password

通过设置配置文件中 requirepass 项的值(使用命令 CONFIG SET requirepass password ),可以使用密码来保护 Redis 服务器。

如果开启了密码保护的话,在每次连接 Redis 服务器之后,就要使用 AUTH 命令解锁,解锁之后才能使用其他 Redis 命令。

如果 AUTH 命令给定的密码 password 和配置文件中的密码相符的话,服务器会返回 OK 并开始接受命令输入。

另一方面,假如密码不匹配的话,服务器将返回一个错误,并要求客户端需重新输入密码。

因为 Redis 高性能的特点,在很短时间内尝试猜测非常多个密码是有可能的,因此请确保使用的密码足够复杂和足够长,以免遭受密码猜测攻击。

返回值:密码匹配时返回 OK ,否则返回一个错误。

// 设置密码
redis> CONFIG SET requirepass secret_password # 将密码设置为 secret_password 
 OKredis> QUIT # 退出再连接,让新密码对客户端生效
[huangz@mypad]$ redis
redis> PING # 未验证密码,操作被拒绝 
 (error) ERR operation not permittedredis> AUTH wrong_password_testing # 尝试输入错误的密码 
 (error) ERR invalid passwordredis> AUTH secret_password # 输入正确的密码 
 OKredis> PING # 密码验证成功,可以正常操作命令了 
 PONG//清空密码
redis> CONFIG SET requirepass “” # 通过将密码设为空字符来清空密码 
 OKredis> QUIT
$ redis # 重新进入客户端
redis> PING # 执行命令不再需要密码,清空密码操作成功 
 PONG

6、Server(服务器)管理命令

Redis定义了一组与服务器相关的命令,用于查询服务器信息,如当前时间、客户端连接数量,以及修改配置文件、手动触发某些操作等。

命令示例

SAVE

SAVE 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。

一般来说,在生产环境很少执行 SAVE 操作,因为它会阻塞所有客户端,保存数据库的任务通常由 BGSAVE 命令异步地执行。然而,如果负责保存数据的后台子进程不幸出现问题时, SAVE 可以作为保存数据的最后手段来使用。

返回值:保存成功时返回 OK 。

redis> SAVE
OK