当前位置:首页 > 问答 > 正文

Redis里用put方法存数据到底咋操作,感觉有点迷糊想理清楚

你想用什么数据结构,存什么样的数据?

下面我就根据 Redis 主要的数据结构,来给你一一说明对应的“put”操作是怎么做的。

最常用的情况:存简单的键值对(就像Java里的Map)

这是最常见、最直接的用法,你想把一个值(比如一个字符串、一个数字)关联到一个键上,在Redis里,这个操作对应的命令主要是 SET

  • 基本操作:SET key value

    • 这行命令的意思就是:把 value 这个值,放到 key 这个键下面存起来。
    • 举例:你想把用户名 “张三” 存到键 “user:1001:name” 下面。
      • 命令就是:SET user:1001:name "张三"
    • 这就完成了最基础的“存数据”,也就是你理解的“put”。
  • 一些有用的“增强型put”选项: Redis的 SET 命令非常强大,它允许你附带一些条件,让这个“存”的操作更智能。

    • SETNX (SET if Not eXists):只有当这个键不存在的时候,才执行存入操作,如果键已经存在,就不存了,这常用于实现分布式锁,防止重复提交。
      • 举例:SETNX lock:order123 "1" —— 只有之前没有 lock:order123 这个锁的时候,我才能成功设置它。
    • SETEX (SET with EXpire):在存数据的同时,给这个数据设置一个过期时间(单位是秒),时间一到,Redis会自动删除这个键值对,这非常适合存验证码、临时会话等。
      • 举例:SETEX sms:13800138000 300 "888999" —— 把验证码 “888999” 存起来,并且300秒(5分钟)后自动失效。
    • PSETEX:和 SETEX 一样,只是过期时间的单位是毫秒

当你只是想简单地存一个键值对时,你脑子里想的“put”命令,大概率就是 SET 以及它的变种 SETNXSETEX

Redis里用put方法存数据到底咋操作,感觉有点迷糊想理清楚

存多个键值对(批量操作)

如果你想一次性存入多个键值对,而不是一个个地 SET,Redis也提供了批量操作命令 MSET (Multiple SET)。

  • 操作:MSET key1 value1 key2 value2 ...
    • 举例:你要初始化一个用户的基本信息。
      • 命令:MSET user:1001:name "张三" user:1001:age "30" user:1001:city "北京"
    • 这个操作是原子性的,意味着要么所有的键值对都设置成功,要么一个都不设置,这能保证数据的一致性。

当值不是字符串时:其他数据结构的“put”

Redis的强大之处在于它的值不仅仅是字符串,还可以是列表、哈希、集合等复杂结构,这时,“put”的操作就完全不同了。

  1. 哈希(Hash) - 适合存对象 如果一个用户有多个字段(姓名、年龄、城市),用多个独立的 SET 命令会创建很多键,管理起来麻烦,用哈希结构,可以把这些字段都存到一个键下面。

    Redis里用put方法存数据到底咋操作,感觉有点迷糊想理清楚

    • “Put”一个字段:HSET key field value
      • 举例HSET user:1001 name "张三" age 30 city "北京"
      • 这个命令的意思是在名为 user:1001 的哈希结构中,设置 name 字段为 “张三”,age 字段为 30,等等,你可以把它想象成往一个Java的 Map 里面 put 多个键值对,但整个 Map 在Redis里只占一个键。
    • 对应的也有 HMSET(批量设置多个字段,但新版本中 HSET 已经可以替代它了)和 HSETNX(字段不存在时才设置)。
  2. 列表(List) - 类似一个链表 列表的特点是元素有序,且可以重复,常用的“put”操作是从左边或右边插入元素,更像是“push”而不是“put”。

    • 从左边插入(头部):LPUSH key value1 value2 ...
    • 从右边插入(尾部):RPUSH key value1 value2 ...
    • 举例:用一个列表记录用户的最近浏览记录。LPUSH recent:1001 product:333 product:222 product:111,这样,最新的商品ID总是在列表最前面。
  3. 集合(Set) - 无序且元素唯一 集合保证里面的元素不重复,常用于存标签、好友列表等。

    • “Put”操作:SADD key member1 member2 ...
      • 举例:给一篇文章添加标签。SADD article:123:tags "科技" "编程" "Redis",即使你重复添加 “科技”,集合里也只会有一个。
  4. 有序集合(Sorted Set / ZSet) 这是最复杂但也非常强大的结构,它像Set一样保证成员唯一,但每个成员都有一个分数(score)用于排序,适合排行榜、带权重的队列等。

    • “Put”操作:ZADD key score1 member1 score2 member2 ...
      • 举例:记录玩家分数排行榜。ZADD leaderboard 2500 "玩家A" 1800 "玩家B" 3000 "玩家A",注意,玩家A”已存在,这个操作会更新他的分数为3000。

让你不再迷糊:

你问的“put方法”,在Redis里并没有一个叫 PUT 的命令,你需要根据你的业务场景,选择合适的数据结构和对应的命令:

  • 简单字符串数字?用 SET
  • 批量存简单键值对?用 MSET
  • 存一个对象(有多个字段)?用哈希(Hash)和 HSET
  • 存一个有序且可重复的序列(如消息队列、时间线)?用列表(List)和 LPUSH/RPUSH
  • 存一个唯一、无序的集合(如标签)?用集合(Set)和 SADD
  • 存一个带排序的排行榜?用有序集合(Sorted Set)和 ZADD

下次当你想要“put”数据到Redis时,先停下来问自己一句:“我到底要存的是什么类型的数据?我希望它有什么特性?” 想清楚了这个问题,就能准确地找到对应的命令,操作起来就不会迷糊了。