redis01 - redis基础

embedded/2025/2/9 5:06:01/

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将键存储的值 +1incr keyName
decr将键存储的值 -1decr 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"

在这里插入图片描述

此时在另一个客户端的订阅者就可以接收到了,并返回

在这里插入图片描述

⚠️执行上面命令客户端会进入订阅状态,处于此状态下客户端不能使用除subscribeunsubscribepsubscribepunsubscribe这四个属于"发布/订阅"之外的命令,否则会报错

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

将当前数据库中的 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


http://www.ppmy.cn/embedded/160717.html

相关文章

GO、GSEA富集分析一网打进

富集分析是生物信息分析中快速了解目标基因或目标区域功能倾向性的最重要方法之一。其中代表性的计算方式有两种: 一是基于筛选的差异基因,采用超几何检验判断上调或下调基因在哪些GO或KEGG或其它定义的通路富集。假设背景基因数目为m,背景基…

WPS计算机二级•幻灯片的音视频表格与图形

听说这是目录哦 PPT表格的基本操作🧵选择合适的PPT数据图表🪀在PPT中插入图表并编辑图表数据📦插入视频和音频🎬插入剪辑视频和更改视频封面🔭PPT背景音乐设置🎻PPT如何使用图标📸妙用图片让PPT…

Deno vs Node.js:性能对比深度解析

1. 引言 Deno 和 Node.js 都是基于 V8 引擎的 JavaScript 运行时环境,然而它们在架构、模块管理、安全性和性能方面存在显著差异。Deno 由 Node.js 的原始作者 Ryan Dahl 开发,旨在解决 Node.js 设计上的一些问题,比如包管理、安全模型和 Ty…

PyTorch Geometric(PyG)机器学习实战

PyTorch Geometric(PyG)机器学习实战 在图神经网络(GNN)的研究和应用中,PyTorch Geometric(PyG)作为一个基于PyTorch的库,提供了高效的图数据处理和模型构建功能。 本文将通过一个节…

【R语言】写入数据

一、写入R语言系统格式的数据 R语言自带.RData和.rds两种数据格式。 通过使用save()函数和saveRDS()函数将R语言数据处理结果保存为此类数据。 # 将iris数据集保存为RData文件 save(listc("iris"), file"iris.RData") # 将iris数据集保存为rds文件 save…

python-leetcode-被围绕的区域

130. 被围绕的区域 - 力扣(LeetCode) class Solution:def solve(self, board: List[List[str]]) -> None:"""Do not return anything, modify board in-place instead."""if not board or not board[0]:returnrows, co…

【自学笔记】Python的基础知识点总览-持续更新

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Python基础知识总览1. Python简介2. 安装与环境配置3. 基本语法3.1 变量与数据类型3.2 控制结构3.3 函数与模块3.4 文件操作 4. 面向对象编程(OOP&#…

力扣 无重复字符的最长子串

滑动窗口,双指针移动找集合类的元素。 题目 无重复,可想到hashset集,然后由题找最长子串,说明要处理左右边界,可以用双指针,右指针一直遍历,左指针看到重复就加一,这像是一个滑动窗…