Redis基础
文章目录
- Redis基础
- 一:Redis简介
- 二:Redis七原则
- 三:redis基本类型
- 1:字符串类型
- 1.1 概述
- 1.2 三个常用命令
- 1.3 其他常用命令
- 1.4 应用
- 2:hash类
- 2.1 简介
- 2.2 命令
- 2.3 应用
- 3:list类型
- 3.1 概述
- 3.2 四个基本命令
- 3.3 两个常用命令
- 3.4 应用
- 4:set类型
- 4.1 概述
- 4.2 命令
- 4.3 应用
- 5:zset类型
- 5.1 概述
- 5.2 命令
- 5.3 应用
- 6: pub/sub
- 6.1 概述
- 6.2 基于频道的发布订阅
- 6.3 基于模式的发布订阅
- 6.4 Spring Boot 实现
- 7:stream(难点)
- 7:stream(难点)
- 7.1 为什么设计stream
- 7.2 Stream的结构
- 7.3 消息队列相关命令
- 7.4 独立消费xread
- 7.5 消费组消费xgroup
- 7.6 信息监控xinfo
- 五:Redis常用命令
- 1:基本命令
- 2:服务器命令
一:Redis简介
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
-
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。(RDB, AOF)
-
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
-
Redis支持数据的备份,即master-slave模式的数据备份。
-
主从同步性:Redis 支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。
和其他的KEY-VALUE的不同之处
- Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。
- Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
- Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
二:Redis七原则
redis_22">三:redis基本类型
类型指的是value的类型
1:字符串类型
1.1 概述
一个key对应一个value,并且String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。
1.2 三个常用命令
命令 | 概述 | 语法 |
---|---|---|
get | 获取存储在给定键中的值 | get keyName |
set | 设置键值对 | set keyName value |
del | 删除存储在给定键中的值 | del keyName |
1.3 其他常用命令
命令 | 概述 | 语法 |
---|---|---|
incr | 将键存储的值 +1 | incr keyName |
decr | 将键存储的值 -1 | decr keyName |
incrby | 将键存储的值加上整数 | incrby keyName amount |
decrby | 将键存储的值减少整数 | decrby keyName amount |
# = 下面为实例(三大基本命令)
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)# = 下面为实例(其他常用命令)
127.0.0.1:6379> get counter
"2"
127.0.0.1:6379> incr counter
(integer) 3
127.0.0.1:6379> get counter
"3"
127.0.0.1:6379> incrby counter 100
(integer) 103
127.0.0.1:6379> get counter
"103"
127.0.0.1:6379> decr counter
(integer) 102
127.0.0.1:6379> get counter
"102"
127.0.0.1:6379> decrby counter 100
(integer) 2
127.0.0.1:6379> get counter
"2"
1.4 应用
2:hash类
2.1 简介
是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象
2.2 命令
命令 | 概述 | 语法 |
---|---|---|
hset | 添加键值对 | hset hash-key sub-key1 value1 |
hget | 获取指定散列键的值 | hget hash_key sub_key |
hgetall | 获取散列中包含的所有键值对 | hgetall hash_key |
hdel | 如果给定键存在于散列中,那么就移除这个键 | hdel hash_key sub_key |
127.0.0.1:6379> hset user name1 hao
(integer) 1
127.0.0.1:6379> hset user email1 hao@163.com
(integer) 1
127.0.0.1:6379> hgetall user
1) "name1"
2) "hao"
3) "email1"
4) "hao@163.com"127.0.0.1:6379> hget user user # user对象中没有user字符
(nil)
127.0.0.1:6379> hget user name1
"hao"
127.0.0.1:6379> hset user name2 xiaohao
(integer) 1
127.0.0.1:6379> hset user email2 xiaohao@163.com
(integer) 1
127.0.0.1:6379> hgetall user
1) "name1"
2) "hao"
3) "email1"
4) "hao@163.com"
5) "name2"
6) "xiaohao"
7) "email2"
8) "xiaohao@163.com"
2.3 应用
3:list类型
3.1 概述
使用List结构,我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)。
List的另一个应用就是消息队列,可以利用List的 PUSH 操作,将任务存放在List中,然后工作线程再用 POP 操作将任务取出进行执行
list中的value可以重复
3.2 四个基本命令
命令 | 概述 | 语法 |
---|---|---|
rpush | 将给定值推入到列表右端 | rpush keyName value |
lpush | 将给定值推入到列表左端 | lpush keyName value |
rpop | 从列表的右端弹出一个值,并返回被弹出的值 | rpop keyName |
lpop | 从列表的左端弹出一个值,并返回被弹出的值 | lpop keyName |
3.3 两个常用命令
命令 | 概述 | 语法 |
---|---|---|
lrange | 获取列表在给定范围上的所有值 | lrange keyName 0 -1 |
lindex | 通过索引获取列表中的元素 | lindex keyName index |
⚠️ -> lindex中的index可以为负数,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素
- lpush + lpop = Stack(栈,先进后出)
- lpush + rpop = Queue(队列,先进先出)
- lpush + ltrim = Capped Collection(有限集合)
- lpush + brpop = Message Queue(消息队列)
3.4 应用
4:set类型
4.1 概述
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
set是String类型的无序集合,集合中不能出现重复的数据
4.2 命令
命令 | 概述 | 语法 |
---|---|---|
sadd | 向集合添加一个或多个成员 | sadd keyName value |
scard | 获取集合的成员数 | scard keyName |
smember | 返回集合中的所有成员 | smember keyName member |
sismember | 判断 member 元素是否是集合 key 的成员 | sismember keyName member |
127.0.0.1:6379> sadd myset hao hao1 xiaohao hao
(integer) 3 # 返回成功加入myset中的个数127.0.0.1:6379> smember myset
1) "xiaohao"
2) "hao1"
3) "hao"127.0.0.1:6379> sismember myset hao
(integer) 1 # 1 -> 存在, 0 -> 不存在
4.3 应用
5:zset类型
5.1 概述
和Set不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
5.2 命令
命令 | 概述 | 语法 |
---|---|---|
zadd | 将一个带有给定分值的成员添加到哦有序集合里面 | zadd zkey score_1 value_1 |
zrange | 根据元素在有序集合中所处的位置,从有序集合中获取多个元素 | zrange zkey start end [withscores] |
zrem | 如果给定元素成员存在于有序集合中,那么就移除这个元素 | zrem zkey mem_1 |
zscore | 获取指定值的分数 | zscore zkey value_1 |
127.0.0.1:6379> zadd myscoreset 100 hao 90 xiaohao
(integer) 2127.0.0.1:6379> ZRANGE myscoreset 0 -1
1) "xiaohao"
2) "hao"127.0.0.1:6379> ZSCORE myscoreset hao
"100"
5.3 应用
6: pub/sub
6.1 概述
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息
Redis 的 subscribe 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。
当有新消息通过 publish 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端
6.2 基于频道的发布订阅
发布者可以向指定的频道(channel)发送消息;
订阅者可以订阅一个或者多个频道(channel),所有订阅此频道的订阅者都会收到此消息
开启两个客户端进行测试:先开启订阅者,下面这个表示这个订阅者订阅了 channel:1
127.0.0.1:6379> subscribe channel:1
Reading messages... (press Ctrl-C to quit)
然后在另一个客户端进行向channel:1发送消息
⚠️ -> 发出去的消息不会被持久化,也就是有客户端订阅channel:1后只能接收到后续发布到该频道的消息,之前的就接收不到了
127.0.0.1:6379> publish channel:1 "hi"
此时在另一个客户端的订阅者就可以接收到了,并返回
⚠️执行上面命令客户端会进入订阅状态,处于此状态下客户端不能使用除subscribe
、unsubscribe
、psubscribe
和punsubscribe
这四个属于"发布/订阅"之外的命令,否则会报错
6.3 基于模式的发布订阅
如果有某个/某些模式和这个频道匹配的话,那么所有订阅这个/这些频道的客户端也同样会收到信息
下图展示了一个带有频道和模式的例子, 其中 tweet.shop.
模式匹配了 tweet.shop.kindle
频道和 tweet.shop.ipad
频道, 并且有不同的客户端分别订阅它们三个:
- 当有信息发送到
tweet.shop.kindle
频道时, 信息除了发送给 clientX 和 clientY 之外, 还会发送给订阅tweet.shop.
模式的 client123 和 client256
- 同理:
6.4 Spring Boot 实现
// 发布
redisTemplate.convertAndSend("my_topic_name", "message_content");// 配置订阅
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(xxxMessageListenerAdapter, "my_topic_name");
7:stream(难点)
7:stream(难点)
7.1 为什么设计stream
从字面上看是流类型,但其实从功能上看,应该是Redis对消息队列(Message Queue)的完善实现
以往的redis消息队列的实现方式无外乎下面两种:
-
订阅/发布方式 -> 无法持久化的,如果出现网络断开、Redis 宕机等,消息就会被丢弃
-
list方式中通过lpush和brpop的方式进行实现 -> 不支持多播,分组消费等
一个良好的消息队列的设计需要什么?
我们可能最开始想到的是下面的几点:
- 消息的生产
- 消息的消费(单播 & 多播,阻塞 & 非阻塞读取)
- 消息的有序性
- 消息的持久化
7.2 Stream的结构
每个 Stream 都有唯一的名称,它就是 Redis 的 key,在我们首次使用 xadd 指令追加消息时自动创建
consumer group
使用xgroup create命令创建,一个消费组有多个消费者(Consumer), 这些消费者之间是竞争关系
last_delivered_id
游标,每个消费组会有个游标 last_delivered_id
任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动
pending_ids
消费者的状态变量,作用是维护消费者的未确认的 id。 pending_ids 记录了当前已经被客户端读取的消息,但是还没有 ack
如果客户端没有ack,这个变量里面的消息ID会越来越多,一旦某个消息被ack,它就开始减少。
这个pending_ids变量在Redis官方被称之为PEL,也就是Pending Entries List(待定的实体列表),这是一个很核心的数据结构,它用来==确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理
消息id
消息ID的形式是timestampInMillis-sequence
例如1527846880572-5,它表示当前的消息在毫米时间戳1527846880572时产生,并且是该毫秒内产生的第5条消息。
消息ID可以由服务器自动生成,也可以由客户端自己指定
形式必须是整数-整数 & 必须是后面加入的消息的ID要大于前面的消息ID
7.3 消息队列相关命令
命令 | 概述 |
---|---|
xadd | 添加消息到末尾 |
xtrim | 对流进行剪枝,限制长度 |
xdel | 删除消息 |
xlen | 获取流包含的元素数量,即消息长度 |
xrange | 获取消息列表,会自动过滤已经删除的消息 |
xrevrange | 反向获取消息列表,ID 从大到小 |
xread | 以阻塞或非阻塞方式获取消息列表 |
# 号表示服务器自动生成ID,后面顺序跟着一堆key/value
127.0.0.1:6379> xadd codehole name laoqian age 30 # 名字叫laoqian,年龄30岁
1527849609889-0 # 生成的消息ID
127.0.0.1:6379> xadd codehole name xiaoyu age 29
1527849629172-0
127.0.0.1:6379> xadd codehole name xiaoqian age 1
1527849637634-0127.0.0.1:6379> xlen codehole
(integer) 3# 对于范围:-表示最小值, +表示最大值
127.0.0.1:6379> xrange codehole - +
1) 1) 1527849609889-01) 1) "name"1) "laoqian"2) "age"3) "30"
2) 1) 1527849629172-01) 1) "name"1) "xiaoyu"2) "age"3) "29"
3) 1) 1527849637634-01) 1) "name"1) "xiaoqian"2) "age"3) "1"# 指定最小消息ID的列表从1527849629172-0到最大消息id
127.0.0.1:6379> xrange codehole 1527849629172-0 +
1) 1) 1527849629172-02) 1) "name"2) "xiaoyu"3) "age"4) "29"
2) 1) 1527849637634-02) 1) "name"2) "xiaoqian"3) "age"4) "1"# 指定最大消息ID的列表从最小到1527849629172-0
127.0.0.1:6379> xrange codehole - 1527849629172-0
1) 1) 1527849609889-02) 1) "name"2) "laoqian"3) "age"4) "30"
2) 1) 1527849629172-02) 1) "name"2) "xiaoyu"3) "age"4) "29"127.0.0.1:6379> xdel codehole 1527849609889-0
(integer) 1
127.0.0.1:6379> xlen codehole # 长度不受影响
(integer) 3
127.0.0.1:6379> xrange codehole - + # 被删除的消息没了
1) 1) 1527849629172-02) 1) "name"2) "xiaoyu"3) "age"4) "29"
2) 1) 1527849637634-02) 1) "name"2) "xiaoqian"3) "age"4) "1"127.0.0.1:6379> del codehole # 删除整个Stream
(integer) 1
7.4 独立消费xread
我们可以在不定义消费组的情况下进行Stream消息的独立消费
当Stream没有新消息时,甚至可以阻塞等待。
Redis设计了一个单独的消费指令xread,可以将Stream当成普通的消息队列(list)来使用。
使用xread时,我们可以完全忽略消费组(Consumer Group)的存在,就好比Stream就是一个普通的列表(list)
# 从Stream头部读取两条消息
127.0.0.1:6379> xread count 2 streams codehole 0-0
1) 1) "codehole"2) 1) 1) 1527851486781-02) 1) "name"2) "laoqian"3) "age"4) "30"2) 1) 1527851493405-02) 1) "name"2) "yurui"3) "age"4) "29"# 从Stream尾部读取一条消息,毫无疑问,这里不会返回任何消息
127.0.0.1:6379> xread count 1 streams codehole $
(nil)# 从尾部阻塞等待新消息到来,下面的指令会堵住,直到新消息到来
127.0.0.1:6379> xread block 0 count 1 streams codehole $
# 我们从新打开一个窗口,在这个窗口往Stream里塞消息
127.0.0.1:6379> xadd codehole name youming age 60
1527852774092-0
# 再切换到前面的窗口,我们可以看到阻塞解除了,返回了新的消息内容
# 而且还显示了一个等待时间,这里我们等待了93s
127.0.0.1:6379> xread block 0 count 1 streams codehole $
1) 1) "codehole"2) 1) 1) 1527852774092-02) 1) "name"2) "youming"3) "age"4) "60"
(93.11s)
客户端如果想要使用xread进行顺序消费,一定要记住当前消费到哪里了,也就是返回的消息ID。下次继续调用xread时,将上次返回的最后一个消息ID作为参数传递进去,就可以继续消费后续的消息。
-
block 0表示永远阻塞,直到消息到来
-
block 1000表示阻塞1s,如果1s内没有任何消息到来,就返回nil
127.0.0.1:6379> xread block 1000 count 1 streams codehole $
(nil)
(1.07s)
7.5 消费组消费xgroup
相关命令
命令 | 概述 |
---|---|
xgroup create | 创建消费者组 |
xreadgroup group | 读取消费者组中的消息 |
xack | 将消息标记为已经处理 |
xgroup setId | 为消费者组设置新的最后递送消息ID |
xgroup delconsumer | 删除消费者 |
xgroup delstory | 删除消费者组 |
xpending | 显示待处理消息的相关信息 |
xclaim | 转移消息的归属权 |
xinfo | 查看流和消费者组的相关信息 |
xinfo groups | 打印消费者组的相关信息 |
xinfo stream | 打印流的相关信息 |
创建消费者组
Stream通过xgroup create指令创建消费组(Consumer Group)
需要传递起始消息ID参数用来初始化last_delivered_id游标变量
127.0.0.1:6379> xgroup create codehole cg1 0-0 # 表示从头开始消费
OK# $表示从尾部开始消费,只接受新消息,当前Stream消息会全部忽略
127.0.0.1:6379> xgroup create codehole cg2 $
OK127.0.0.1:6379> xinfo stream codehole # 获取Stream信息1) length2) (integer) 3 # 共3个消息3) radix-tree-keys4) (integer) 15) radix-tree-nodes6) (integer) 27) groups8) (integer) 2 # 两个消费组9) first-entry # 第一个消息
10) 1) 1527851486781-02) 1) "name"2) "laoqian"3) "age"4) "30"
11) last-entry # 最后一个消息
12) 1) 1527851498956-02) 1) "name"2) "xiaoqian"3) "age"4) "1"127.0.0.1:6379> xinfo groups codehole # 获取Stream的消费组信息
1) 1) name2) "cg1"3) consumers4) (integer) 0 # 该消费组还没有消费者5) pending6) (integer) 0 # 该消费组没有正在处理的消息
2) 1) name2) "cg2"3) consumers # 该消费组还没有消费者4) (integer) 05) pending6) (integer) 0 # 该消费组没有正在处理的消息
消费
Stream提供了xreadgroup指令可以进行消费组的组内消费,需要提供消费组名称、消费者名称和起始消息ID。
它同xread一样,也可以阻塞等待新消息。
读到新消息后,对应的消息ID就会进入消费者的PEL(正在处理的消息)结构里,客户端处理完毕后使用xack指令通知服务器,本条消息已经处理完毕,该消息ID就会从PEL中移除。
# >号表示从当前消费组的last_delivered_id后面开始读
# 每当消费者读取一条消息,last_delivered_id变量就会前进
127.0.0.1:6379> xreadgroup GROUP cg1 c1 count 1 streams codehole >
1) 1) "codehole"2) 1) 1) 1527851486781-02) 1) "name"2) "laoqian"3) "age"4) "30"
# 游标前进,读下一个消息
127.0.0.1:6379> xreadgroup GROUP cg1 c1 count 1 streams codehole >
1) 1) "codehole"2) 1) 1) 1527851493405-02) 1) "name"2) "yurui"3) "age"4) "29"
# 游标前进,读两个
127.0.0.1:6379> xreadgroup GROUP cg1 c1 count 2 streams codehole >
1) 1) "codehole"2) 1) 1) 1527851498956-02) 1) "name"2) "xiaoqian"3) "age"4) "1"2) 1) 1527852774092-02) 1) "name"2) "youming"3) "age"4) "60"# 再继续读取,就没有新消息了
127.0.0.1:6379> xreadgroup GROUP cg1 c1 count 1 streams codehole >
(nil)# 那就阻塞等待吧
127.0.0.1:6379> xreadgroup GROUP cg1 c1 block 0 count 1 streams codehole ># 开启另一个窗口,往里塞消息
127.0.0.1:6379> xadd codehole name lanying age 61
1527854062442-0# 回到前一个窗口,发现阻塞解除,收到新消息了
127.0.0.1:6379> xreadgroup GROUP cg1 c1 block 0 count 1 streams codehole >
1) 1) "codehole"2) 1) 1) 1527854062442-02) 1) "name"2) "lanying"3) "age"4) "61"
(36.54s)127.0.0.1:6379> xinfo groups codehole # 观察消费组信息
1) 1) name2) "cg1"3) consumers4) (integer) 1 # 一个消费者5) pending6) (integer) 5 # 共5条正在处理的信息还有没有ack
2) 1) name2) "cg2"3) consumers4) (integer) 0 # 消费组cg2没有任何变化,因为前面我们一直在操纵cg15) pending6) (integer) 0# 如果同一个消费组有多个消费者,我们可以通过xinfo consumers指令观察每个消费者的状态
127.0.0.1:6379> xinfo consumers codehole cg1 # 目前还有1个消费者
1) 1) name2) "c1"3) pending4) (integer) 5 # 共5条待处理消息5) idle6) (integer) 418715 # 空闲了多长时间ms没有读取消息了# 接下来我们ack一条消息
127.0.0.1:6379> xack codehole cg1 1527851486781-0
(integer) 1127.0.0.1:6379> xinfo consumers codehole cg1
1) 1) name2) "c1"3) pending4) (integer) 4 # 变成了5条5) idle6) (integer) 668504# 下面ack所有消息
127.0.0.1:6379> xack codehole cg1 1527851493405-0 1527851498956-0 1527852774092-0 1527854062442-0
(integer) 4127.0.0.1:6379> xinfo consumers codehole cg1
1) 1) name2) "c1"3) pending4) (integer) 0 # pel空了5) idle6) (integer) 745505
7.6 信息监控xinfo
查看队列的消息
xinfo stream mq
127.0.0.1:6379> Xinfo stream mq1) "length"2) (integer) 73) "radix-tree-keys"4) (integer) 15) "radix-tree-nodes"6) (integer) 27) "groups"8) (integer) 19) "last-generated-id"
10) "1553585533795-9"
11) "first-entry"
12) 1) "1553585533795-3"2) 1) "msg"2) "4"
13) "last-entry"
14) 1) "1553585533795-9"2) 1) "msg"2) "10"
查看消费组消息
xinfo groups mq
127.0.0.1:6379> Xinfo groups mq
1) 1) "name"2) "mqGroup"3) "consumers"4) (integer) 35) "pending"6) (integer) 37) "last-delivered-id"8) "1553585533795-4"
查看消费组成员消息
xinfo consumers mq mqgroup
127.0.0.1:6379> XINFO CONSUMERS mq mqGroup
1) 1) "name"2) "consumerA"3) "pending"4) (integer) 15) "idle"6) (integer) 18949894
2) 1) "name"2) "consumerB"3) "pending"4) (integer) 15) "idle"6) (integer) 3092719
3) 1) "name"2) "consumerC"3) "pending"4) (integer) 15) "idle"6) (integer) 23683256
五:Redis常用命令
1:基本命令
keys:返回满足给定 pattern 的所有 key
redis 127.0.0.1:6379> keys * # 如果pattern = * 表示返回所有的key
1) "myzset2"
2) "myzset3"
3) "mylist"
4) "myset2"
5) "myset3"
6) "myset4"
7) "k_zs_1"
8) "myset5"
9) "myset6"
10) "myset7"
11) "myhash"
12) "myzset"
13) "age"
14) "myset"
15) "mylist5"
16) "mylist6"redis 127.0.0.1:6379> keys mylist* # 取出所有以 mylist 开头的 key
1) "mylist"
2) "mylist5"
3) "mylist6"
exists:确认一个key是不是存在
redis 127.0.0.1:6379> exists HongWan
(integer) 0
redis 127.0.0.1:6379> exists age
(integer) 1
redis 127.0.0.1:6379>
del:删除一个key
redis 127.0.0.1:6379> del age
(integer) 1
redis 127.0.0.1:6379> exists age
(integer) 0
redis 127.0.0.1:6379>
expire/persist:过期时间
- expire:设置一个 key 的过期时间(单位:秒)
redis 127.0.0.1:6379> expire addr 10 # 设置addr的过期时间为10秒
(integer) 1
redis 127.0.0.1:6379> ttl addr # 查询剩余时间
(integer) 8
redis 127.0.0.1:6379> ttl addr
(integer) 1
redis 127.0.0.1:6379> ttl addr # 返回-1表示已经过期
(integer) -1
redis 127.0.0.1:6379>
- persist:移除一个key的过期时间
redis 127.0.0.1:6379[1]> expire age 300
(integer) 1
redis 127.0.0.1:6379[1]> ttl age
(integer) 294
redis 127.0.0.1:6379[1]> persist age # 移除剩余的过期时间, 直接使其过期
(integer) 1
redis 127.0.0.1:6379[1]> ttl age
(integer) -1
redis 127.0.0.1:6379[1]>
move:移动key
redis 127.0.0.1:6379> select 0 # 选择数据库0
OK
redis 127.0.0.1:6379> set age 30
OK
redis 127.0.0.1:6379> get age
"30"
redis 127.0.0.1:6379> move age 1 # 将age移动到数据库1中
(integer) 1
redis 127.0.0.1:6379> get age
(nil)
redis 127.0.0.1:6379> select 1
OK
redis 127.0.0.1:6379[1]> get age
"30"
redis 127.0.0.1:6379[1]>
randomkey:随机返回 key 空间的一个 key
redis 127.0.0.1:6379> randomkey
"mylist7"
redis 127.0.0.1:6379> randomkey
"mylist5"
rename:重命名 key
redis 127.0.0.1:6379[1]> keys *
1) "age"
redis 127.0.0.1:6379[1]> rename age age_new
OK
redis 127.0.0.1:6379[1]> keys *
1) "age_new"
redis 127.0.0.1:6379[1]>
type:返回值的类型
redis 127.0.0.1:6379> type addr
string
redis 127.0.0.1:6379> type myzset2
zset
redis 127.0.0.1:6379> type mylist
list
2:服务器命令
ping:测试连接是否存活
redis 127.0.0.1:6379> ping
PONG # 返回这个说明是ping通的# 执行下面命令之前,我们停止 redis 服务器
redis 127.0.0.1:6379> ping
Could not connect to Redis at 127.0.0.1:6379: Connection refused# 执行下面命令之前,我们启动 redis 服务器
not connected> ping
PONG
select:选择数据库。
Redis 数据库编号从 0~15,我们可以选择任意一个数据库来进行数据的存取。
redis 127.0.0.1:6379> select 1
OK
redis 127.0.0.1:6379[1]> select 16
(error) ERR invalid DB index
redis 127.0.0.1:6379[16]>
quit:退出连接
redis 127.0.0.1:6379> quit
[root@localhost redis-2.2.12]
dbsize:当前db的key的个数
redis 127.0.0.1:6379> dbsize
(integer) 18 # 此库中有 18 个 key
monitor:命令打印
实时打印出 Redis
服务器接收到的命令,调试用
config get:获取服务器配置信息
redis 127.0.0.1:6379> config get dir
1) "dir"
2) "/root/4setup/redis-2.2.12"
redis 127.0.0.1:6379>
- 如果想获取全部参数据的配置值也很简单,只需执行”
config get *
”即可将全部的值都显示出来。
flushdb:删除当前db的key
删除当前选择数据库中的所有 key。
# 默认是0号数据库
redis 127.0.0.1:6379> dbsize
(integer) 18
redis 127.0.0.1:6379> flushdb
OK
redis 127.0.0.1:6379> dbsize
(integer) 0
flushall:删除所有的key
删除所有数据库中的所有 key