Redis笔记

发布时间 2023-10-08 20:21:57作者: 紫系流月

redis数据类型

字符串(String):

存储单个值。
用例:存储文本、数字、计数器等。
SET username "john_doe"
GET username
列表(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):

有序集合,每个成员都关联一个分数(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

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并添加消息:
     ```shell
     XADD mystream * name Alice age 30
     ```
   - 读取消息:
     ```shell
     XRANGE mystream - +
     ```
   - 创建消费者组和消费者:
    ```shell
    XGROUP CREATE key groupname id [MKSTREAM]
    key:流的名称。
    groupname:要创建的消费者群组的名称。
    id:要指定的起始 ID。可以使用特殊的 ID 值 ">" 表示从最新的消息开始读取,也可以使用 "0" 表示从最旧的消息开始读取。
    MKSTREAM(可选):如果指定了该选项,则在流不存在时会创建流。

     XGROUP CREATE mystream mygroup $ RESET
     XREADGROUP GROUP mygroup consumer1 BLOCK 0 STREAMS mystream >
    ```
   - 确认消息已处理:
     ```shell
     XACK mystream mygroup 1-0
     ```

Redis Stream提供了一个强大的工具来处理实时事件数据,并允许多个消费者以有序和协同的方式处理消息。它是Redis的一个重要特性,适用于许多实时数据处理和分析的场景。

https://zhuanlan.zhihu.com/p/572350546

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),单位为毫秒。