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

Redis里头怎么找之前存的东西,查询数据那些事儿讲讲

在Redis里找之前存的东西,说白了就是怎么把你放进去的数据再拿出来,Redis不像我们用的MySQL那种表格数据库,它没有那种“SELECT * FROM table”这种万能查询语句,它怎么查,完全取决于你当初是怎么存的,这就像你在一个巨大的仓库里放东西,如果你乱放,到时候肯定找不到;但如果你分门别类,贴上标签,找起来就快多了,Redis也是这个道理,它的“查找”和“存储”方式是紧密挂钩的。

你得知道Redis最基本的结构是“键值对”,每一个你存进去的数据,都有一个唯一的“键”(Key),就像一把钥匙对应一把锁,最直接、最快的查找方式就是直接用这个键去拿,这是Redis的看家本领,速度极快,对应的命令就是GET命令,你之前用命令SET user:1001 "张三"存了一个用户的名字,那么现在你想找回来,就直接用GET user:1001,Redis就会立刻把“张三”还给你,这种查询方式简单粗暴,但前提是你得清楚地记得那个“键”是什么。

但问题来了,万一我忘了完整的键名怎么办?或者我想看看我都存了哪些类似的东西?这时候就需要用到模式匹配来查找键了,Redis提供了KEYS命令来做这个事,这个命令允许你使用通配符来模糊查找键名。

  • KEYS user:* 会找出所有以“user:”开头的键,这能帮你快速列出所有用户相关的数据。
  • 再比如,KEYS *1001* 会找出所有键名中包含“1001”的键。 这里有个非常重要的提醒(根据Redis官方文档和许多实践警告):KEYS命令在生产环境(就是正式上线的系统)中要极其谨慎地使用,最好不用,因为Redis是单线程的,KEYS命令会遍历整个数据库的所有键,如果键的数量非常庞大,这个操作可能会“卡住”Redis一小会儿,导致其他所有请求都被阻塞住,就像高速公路收费站只有一个窗口,突然来了一辆需要清点一万件货物的卡车,后面的车全都得等着,这只是一个用在开发测试环境、数据量很小的时候的调试工具。

在生产环境中,如果我们确实需要模糊查找键,该怎么办呢?Redis提供了一个更安全的命令叫SCANSCAN命令也是迭代遍历所有的键,但它很聪明,它不是一次性做完,而是分批进行,每次只扫描一小部分,然后返回一个游标和一部分结果,你根据返回的游标再去取下一批,这样就不会长时间阻塞服务器,虽然整体可能慢点,但不会影响其他操作,对服务更友好。

说的是基于“键”的查找,但很多时候,我们的需求更复杂,我存进去的不是一个简单的字符串,而是一个集合(比如所有点赞了某篇文章的用户ID),我想看看某个特定的用户ID在不在这个集合里,这时候,你就不能直接用GET了,因为你存的是一个“集合”(Set)。

这就引出了Redis的另一个核心思想:根据不同的数据结构,使用不同的查询命令,Redis支持好几种数据结构,每种都有自己专属的查询方法:

  1. 哈希(Hash):这就像一个小型的Map或者一个对象,比如你存了一个用户信息:HSET user:1001 name "张三" age 30 city "北京",这时候,你想查询这个用户的城市,你不能GET user:1001,因为得到的是整个对象(可能需要其他命令),你应该用哈希的查询命令:HGET user:1001 city,你也可以用HGETALL user:1001来获取这个用户的所有字段和值。

  2. 列表(List):这就像一个链表,比如存的是一个消息队列,你可以用LRANGE命令来查询列表中的一个范围,例如LRANGE message_queue 0 10,就是取出这个队列里最前面(左边)的11条消息。

  3. 集合(Set):这是一个不允许重复的无序集合,常用的查询命令是SMEMBERS,可以列出集合的所有成员,比如SMEMBERS article:2001:likers可以列出所有给文章2001点赞的用户,更常用的一个是SISMEMBER,用来检查某个元素是否在集合中,比如SISMEMBER article:2001:likers user:1001,返回1表示点过赞,0表示没有。

  4. 有序集合(Sorted Set):这是带分数的集合,可以排序,比如排行榜,最典型的查询就是ZRANGEZREVRANGE,用来按分数从低到高或从高到低取排名,比如ZREVRANGE leaderboard 0 9 WITHSCORES就是取出排行榜前十名和他们的分数。

还有一种特殊的“查询”,它不是由你发起的,而是Redis自动为你建立的“索引”,这就是过期时间查询,当你存数据时,可以通过EXPIRE命令或者SETEX命令给一个键设置一个存活时间,虽然你不能直接“查询”哪些键即将过期,但你可以用TTL命令来“查询”某个键还剩多少秒过期,这在你需要检查某个数据是否还有效时非常有用。

在Redis里找东西:

  • 最快最直接的就是用GET,但前提是你知道准确的键。
  • 找键,在开发环境可以用KEYS模式匹配,生产环境一定要用SCAN
  • 更常见的是根据数据结构查询内容,用对应的命令,比如HGET for Hash,LRANGE for List,SMEMBERS for Set等。
  • “怎么存”决定了“怎么查”,所以在设计存储方案时,一定要预先想好未来的查询需求,这样才能选择最合适的数据结构,让查询变得高效。

Redis里头怎么找之前存的东西,查询数据那些事儿讲讲