暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

《Redis门派风云》—— String小师弟 vs Hash大师兄,谁是最强数据结构?

导语
Redis江湖暗流涌动!
String小师弟身法灵活,号称“一Key走天下”;
Hash大师兄内功深厚,善用“字段化骨绵掌”。
一个轻如鸿毛却无所不能,一个重若泰山却招招致命,
究竟是String的“简单暴刀”更胜一筹,还是Hash的“结构美学”独步武林?
且看今日《Redis论剑》——“数据结构の奥义,存乎一存!”



第一幕:身世揭秘

String小师弟

  • 出身:Redis开山基础弟子,江湖人称“万金油”。

  • 绝学

    • 七十二变:存数字、字符串、JSON、甚至二进制(比如表情包),样样精通。

    • 独孤九增INCR
      秒变计数器,APPEND
      拼接如流水。

  • 口头禅:“没有我String存不了的数据,如果有,就再开一个Key!”


Hash大师兄

  • 师承:Redis结构化首徒,以“字段为王”闻名江湖。

  • 绝技

    • 化整为零:单Key存储对象,HSET user:1 name "张三" age 18
      ,如庖丁解牛。

    • 精准打击HGET
      单字段读取,避免String的“全盘拖出”(GET整个JSON)。

  • 口头禅:“字段,才是一个对象的灵魂!”



第二幕:巅峰对决

招式一:存储用户信息

String小师弟

    SET user:1 '{"name":"张三","age":18}'  
    GET user:1  # 返回整个JSON字符串    
    复制
    • 优势:简单粗暴,JSON一把梭!

    • 翻车现场:修改年龄需反序列化→改值→重新SET,并发修改直接打架


    Hash大师兄

      HSET user:1 name "张三" age 18  
      HGET user:1 age  # 直接取18,如探囊取物  
      HINCRBY user:1 age 1  # 年龄+1,原子操作稳如狗 
      复制
      • 奥义:字段级操作,专治选择困难症



      招式二:商品库存管理

      String小师弟

        SET product:1001_stock 100  
        DECR product:1001_stock  # 减库存,行云流水  
        复制
        • 高光时刻:单值计数器场景,String就是神!


        Hash大师兄

          HSET product:1001 stock 100 price 599  
          HINCRBY product:1001 stock -1  # 减库存,顺带查价格只需HGETALL  
          复制
          • 反击:“我能存库存+价格+销量,你String得开三个Key!”



          招式三:缓存文章内容

          String小师弟

            SET article:1234 "<html>...万字长文...</html>"  
            复制
            • 必杀:大文本存储,String说第二,没人敢说第一!


            Hash大师兄

              HSET article:1234 title "Redis风云" content "<html>..." author "码农金庸" 
              复制
              • 嘲讽:“标题、作者、内容分字段存,检索时才知什么叫优雅!”



              第三幕:隐藏BOSS现身

              Zset掌门(有序集合):

              • 必杀技ZADD ranking 100 "用户A"
                ,排行榜场景直接封神。

              • 挑衅:“二位贤弟,论复杂场景,还得看老夫的分数权重!”


              Stream长老(流数据结构):

              • 奥义XADD chat:messages * user "张三" msg "你好"
                ,消息队列瞬间搞定。

              • 暴言:“什么String、Hash,都是单机玩具,我Stream才是分布式真神!”



              终局:谁是最强?

              1️⃣ String小师弟

              • 核心优势:简单灵活,二进制安全,适合单值、计数器、大文本。

              • 致命缺陷:存储对象时像“把大象塞冰箱”——能塞,但难改!


              2️⃣ Hash大师兄

              • 核心优势:字段级操作,内存更高效(ziplist加持),适合对象、聚合数据。

              • 翻车警告:字段太多时,HGETALL
                可能拖垮网络(慎用!)。


              3️⃣ 隐藏BOSS团

              • Zset:排行榜、延迟队列。

              • Stream:消息流、事件溯源。

              • List:队列、栈。

              • Set:标签、抽奖去重。



              江湖生存指南

              • 选String若

                • 数据简单(单值、计数器)。

                • 需要存序列化对象(但记得加锁防并发)。

                • 大文本缓存(比如HTML、PDF Base64)。


              • 选Hash若

                • 对象字段经常单独读写(如用户信息)。

                • 需要原子操作多个字段(如商品库存+销量)。

                • 内存优化强迫症(ziplist压缩存储)。


              • 禁忌

                • 用String存JSON还频繁修改——等着被同事祭天吧!

                • 用Hash存大字段(如文章内容)——大师兄的腰会断(内存碎片)!



              互动话题
              你是“String无脑党”还是“Hash结构控”?
              在项目中用哪种数据结构踩过坑?
              留言区Battle,点赞送《Redis数据结构避坑真经》!

              关注我,学最骚的Redis,吃最甜的瓜! 🍉
              (下期预告:《分布式锁江湖恩仇录》—— Redis锁 vs Zookeeper锁,谁是真命天子?)


              文章转载自让天下没有难学的编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论