Redis笔记

redis数据类型

字符串(String):

存储单个值。
用例:存储文本、数字、计数器等。
SET username "john_doe"
GET username
列表(List):

list 结构是一种线性结构,遍历效率低
有序集合,允许重复元素。
用例:消息队列、新闻推送、日志记录等。
LPUSH tasks "task1"
LPUSH tasks "task2"
LRANGE tasks 0 -1

LREM:LREM 命令用于从列表中删除指定数量的元素,根据元素的值来匹配删除

删除列表元素
LREM key count value
key: 列表的名称。
count: 指定删除元素的数量,可以是正数、负数或零。
    如果 count 为正数,它将删除列表中与 value 相等的元素,最多删除 count 个。
    如果 count 为负数,它将删除列表中与 value 相等的元素,最多删除 count 个,但是会从列表尾部开始删除。
    如果 count 为零,它将删除列表中所有与 value 相等的元素。
value: 要删除的元素的值。
LREM mylist 2 "A"

LPOP mylist
LPOP 和 RPOP:这两个命令用于分别从列表的左侧和右侧删除元素。
    LPOP key 从列表左侧删除一个元素并返回该元素的值。
    RPOP key 从列表右侧删除一个元素并返回该元素的值。
集合(Set):

无序集合,不允许重复元素。
用例:标签、好友列表、唯一值存储等。
SADD tags "tag1"
SADD tags "tag2"
SMEMBERS tags
SMOVE 命令用于将一个元素从一个集合移动到另一个集合。语法如下:
有序集合(Sorted Set):

sorted sets 底层实现上使用了一种叫跳表(skiplist)的结构,这种结构为了快速的检索和排序数据,牺牲了部分内存空间进行折中;因此,当数量大时,会消耗较大内存;另外,不支持客户端的阻塞操作,原因是 sorted sets 是一个按 score 的有序结构,当新插入元素时会根据 score 改变元素顺序

有序集合,每个成员都关联一个分数(score)。
用例:排行榜、优先级队列、范围查询等。
ZADD leaderboard 100 "player1"
ZADD leaderboard 200 "player2"
ZRANGE leaderboard 0 -1 WITHSCORES
哈希(Hash):

存储字段-值对的集合。
用例:存储对象属性、配置数据、用户信息等。
HSET user:1 name "John"
HSET user:1 age 30
HGET user:1 name
位图(Bitmap):
存储二进制位的数据类型。
用例:统计、在线状态、布隆过滤器等。
SETBIT online_status 1000 1
GETBIT online_status 1000

发布订阅

Pub/Sub 是一种发布/订阅模式,redis 对此的实现较为简单,在服务端仅记录订阅关系;当有消息发布时,根据订阅关系推送到客户端;可以看到这是一种及时转发推送的模式,不会记录处理过的消息,也就是说不会持久化,因此高可用性就得不到保证

PUBLISH:用于将消息发布到指定主题 Channel
PUBLISH channel_name message

SUBSCRIBE:用于订阅一个或多个主题,订阅者将接收发布到这些主题的消息。
SUBSCRIBE channel_name

UNSUBSCRIBE:用于取消订阅一个或多个主题,订阅者将不再接收来自这些主题的消息。
UNSUBSCRIBE channel_name

PSUBSCRIBE:用于通过通配符订阅多个主题,例如使用 "*" 匹配所有主题。
PSUBSCRIBE channel_pattern

PUNSUBSCRIBE:用于取消通配符订阅。
PUNSUBSCRIBE channel_pattern

设置过期时间

EXPIRE 命令:

使用 EXPIRE 命令可以为指定的键(key)设置过期时间(以秒为单位)
EXPIRE key seconds

TTL 命令:
使用 TTL 命令可以查看键的剩余过期时间(以秒为单位)
TTL key

PERSIST 命令:
使用 PERSIST 命令可以移除键的过期时间,使其永不过期
PERSIST key

redis锁的原理

Incr
SET mykey 10  # 设置键 "mykey" 的值为 10
INCR mykey   # 对键 "mykey" 中的值递增 1
用于对存储在 Redis 数据库中的整数进行递增操作。具体来说,INCR 命令将存储在指定键(key)中的整数值递增 1,并返回递增后的新值。

SETNX (Set if Not eXists): 不支持过期时间
SETNX mykey "myvalue"
用于设置一个键值对,但仅在指定的键不存在时才设置。
如果键不存在,则 SETNX 命令会将键设置为指定的值,并返回 1(表示成功)。
如果键已经存在,SETNX 不会对键进行任何更改,返回 0(表示键已存在)。

SETEX 
SETEX key seconds value
用于设置一个键值对,并为该键设置一个过期时间(TTL - Time To Live)。
命令需要提供键、过期时间(以秒为单位)和值。
键会在指定的时间后自动过期并被删除。
如果成功设置了键的值并为其设置了过期时间,则 SETEX 命令返回 "OK"。
如果指定的键已经存在,SETEX 命令将替换现有键的值并重置过期时间,然后返回 "OK"。
如果命令执行失败,可能返回错误消息,指示失败的原因。

PSETEX
PSETEX 是 Redis 中的一个命令,与 SETEX 类似,但它使用的时间单位是毫秒而不是秒。具体来说,PSETEX 用于设置键的值并为键设置过期时间(TTL - Time To Live),单位为毫秒。

Redis Stream

Redis Stream(流)是Redis 5.0版本引入的一种数据结构,用于处理实时事件流数据。它提供了一种非常灵活的方式来记录和处理事件序列,非常适合实时消息传递、日志记录、事件溯源以及实时数据分析等应用。以下是Redis Stream的详细介绍:

  1. 基本概念

    • Stream是一个事件日志,类似于队列,但具有更丰富的功能。
    • Stream包含多个消息(message),每个消息都有一个唯一的ID,且消息按照ID的顺序存储。
    • 消息的内容是键值对,可以包含任何数据。
    • 每个Stream有一个名称作为标识符。
  2. Stream的操作

    • XADD:用于向Stream中添加一条消息。
    • XRANGE:按范围检索消息,可以按ID范围或者消息数量范围检索。
    • XREVRANGE:按反向范围检索消息。
    • XLEN:获取Stream的消息数量。
    • XREAD:从一个或多个Stream中阻塞读取消息。
    • XGROUP:创建和管理消费者组(Consumer Group),用于多个消费者共同处理Stream中的消息。
    • XACK:确认消息已被消费。
    • XPENDING:检查待处理消息的状态。
  3. 消费者组(Consumer Group)

    • 消费者组允许多个消费者协作处理Stream中的消息。
    • 每个消费者在消费Stream消息时都有一个唯一的ID。
    • 消费者组可以设置不同的消费者,以实现负载均衡和故障转移。
    • 消费者组可以使用XACK来确认已处理的消息。
  4. 消息顺序

    • Stream 中的消息按照ID的顺序存储,因此消息的顺序是有序的。
    • 消费者组可以以有序的方式处理消息,确保消息按照顺序处理。
  5. 应用场景

    • 实时消息传递:例如聊天应用程序、通知系统等。
    • 日志记录:用于实时日志记录和监控。
    • 事件溯源:跟踪系统中的事件流,支持回放和查询历史事件。
    • 实时数据处理:用于实时数据分析和计算。
  6. 示例

    • 创建Stream并添加消息:

      ## * 表示 ID 自动生成;当然你也可以指定 ID,需要满足指定的 ID 大于当前 stream 队列中的最大 ID。
      ## 自动生成的 ID 组成部分为 <millisecondsTime>-<sequenceNumber>,即毫秒数 + 当前毫秒內递增数
      XADD mystream * name Alice age 30
      
    • 读取消息:

      ## - + 表示最小 id 和 最大 id
      XRANGE mystream - + COUNT 2
      
      ## 如果你想读取即将到来的新数据,你可以这样写
      XREAD BLOCK 5000 STREAMS mystream otherstream $ $
      
      • 这里 $ 表示取当前 max_id 之后的消息,也就是等待最新消息,该操作类似于 unix 的 tail -f命令;
      • 当然,这里 $ 也可以换成具体 ID;
      • 这里监听了 mystream 和 otherstream 两个 stream, 只要有一个 stream 有新消息就立即返回,如果都有消息,就都一起返回
      ## 只读取已经存在的数据
      XREAD COUNT 2 STREAMS mystream 0
      
      • 其中 count 为可选参数,0 代表读取所有 id 大于 0-0 的记录
      • 这里 STREAMS 可以读取多个 stream, 比如 xread streams mystream otherstream 0 0
    • 创建消费者组和消费者:

      XGROUP CREATE key groupname id [MKSTREAM]
      ## key:流的名称。
      ## groupname:要创建的消费者群组的名称。
      ## id:要指定的起始 ID。可以使用特殊的 ID 值 ">" 表示从最新的消息开始读取,也可以使用 "0" 表示从最旧的消息开始读取。$ 表示将会消费从此刻开始之后的新消息
      ## MKSTREAM(可选):如果指定了该选项,则在流不存在时会创建流。
      
      XGROUP CREATE mystream mygroup $ RESET
      # 创建消费组 mygroup,创建组一般需要指明 the last message ID,这里 $ 表示 mygroup 将会消费从此刻开始之后的新消息
      # 当然,如果是 0,表示要从头开始消费,也包括 STREAM 的历史消息;同样,这里也可以指定任意 id 开始消费
      
      XREADGROUP GROUP mygroup consumer1 BLOCK 0 STREAMS mystream >
      
      ## XREADGROUP: 这是Redis的一个命令,用于从一个流中读取消息并将其传递给一个消费者组。
      ## GROUP mygroup consumer1: 这部分指定了消费者组的信息。mygroup 是消费者组的名称,consumer1 是消费者的名称。消费者组是一组消费者,它们可以并行处理消息。
      ## BLOCK 0: 这部分指定了命令的阻塞参数。在这里,BLOCK 0 表示如果没有可用的消息,命令将立即返回。如果设置了一个正整数值,比如 BLOCK 1000,命令将在等待指定毫秒数后返回。
      ## STREAMS mystream: 这部分指定了要读取消息的流的名称,即 mystream。
      ## >: 这个符号表示要从流中读取的消息的ID(消息的位置)。在这里,> 表示要读取自上次已读取消息之后的新消息。
      ## 综合起来,这个命令的作用是从名为 mystream 的流中读取自上次已读取消息之后的新消息,并将这些消息传递给名为 consumer1 的消费者组中的消费者。如果没有可用的新消息,命令将立即返回(由于 BLOCK 0 参数)。这是Redis中用于实现发布/订阅模式和消息队列的功能之一。
      
    • 确认消息已处理:

      XACK mystream mygroup 1-0
      
    • XPENDING 是 Redis 中的一个命令,用于查询有关消费者组(Consumer Group)中挂起(pending)消息的信息

       XPENDING mystream mygroup
       XPENDING <key> <groupname> [[IDLE <min-idle-time>] <start-id> <end-id> <count> [<consumer-name>]]
       ## 将返回一个包含有关挂起消息的信息的结果集,包括未处理消息的数量、最早和最新未处理消息的消息 ID,以及消息的消费者列表。
       ## XPENDING 命令对于监视和管理 Redis Streams 中的消息非常有用,特别是在多个消费者并发处理消息时,以确保消息被适当地处理和跟踪其状态。
    

链接

https://zhuanlan.zhihu.com/p/572350546
http://antirez.com/news/114

posted @ 2023-10-08 20:17  紫系流月  阅读(14)  评论(0编辑  收藏  举报