[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"primary-menu":6,"cat-redis":85,"catposts-redis":99,"post-detail-post-redis-distributed-lock-b83520e6":208},{"config":4,"socialLinks":5},null,[],{"metadata":7,"spec":10,"menuItems":20},{"name":8,"creationTimestamp":9},"primary","2026-09-12T06:13:55.024154Z",{"displayName":11,"menuItems":12},"主菜单",[13,14,15,16,17,18,19],"88c3f10b-321c-4092-86a8-70db00251b74","menu-item-izrtmxer","c4c814d1-0c2c-456b-8c96-4864965fee94","menu-item-column","menu-item-tools","menu-item-zsxq","menu-item-ocrxlczu",[21,30,40,49,58,67,76],{"displayName":22,"metadata":23,"spec":25,"status":28,"children":29},"首页",{"name":13,"creationTimestamp":24},"2026-09-12T06:13:54.422830Z",{"displayName":22,"href":26,"priority":27,"menuName":8},"\u002F",0,{"displayName":22,"href":26},[],{"displayName":31,"metadata":32,"spec":34,"status":38,"children":39},"Java面试八股",{"name":14,"creationTimestamp":33},"2026-09-13T09:42:02.854891Z",{"displayName":31,"href":35,"target":36,"priority":37,"menuName":8},"\u002Fjava-interview","_self",1,{"displayName":31,"href":35},[],{"displayName":41,"metadata":42,"spec":44,"status":47,"children":48},"文章",{"name":15,"creationTimestamp":43},"2026-09-12T06:13:54.457307Z",{"displayName":41,"href":45,"priority":46,"menuName":8},"\u002Farchives",2,{"displayName":41,"href":45},[],{"displayName":50,"metadata":51,"spec":53,"status":56,"children":57},"项目实战",{"name":16,"creationTimestamp":52},"2026-09-14T00:35:08.138170Z",{"displayName":50,"href":54,"target":36,"priority":55,"menuName":8},"\u002Fcolumn",3,{"displayName":50,"href":54},[],{"displayName":59,"metadata":60,"spec":62,"status":65,"children":66},"在线工具",{"name":17,"creationTimestamp":61},"2026-09-14T00:35:08.171474Z",{"displayName":59,"href":63,"target":36,"priority":64,"menuName":8},"\u002Ftools",4,{"displayName":59,"href":63},[],{"displayName":68,"metadata":69,"spec":71,"status":74,"children":75},"知识星球",{"name":18,"creationTimestamp":70},"2026-09-14T00:35:08.199145Z",{"displayName":68,"href":72,"target":36,"priority":73,"menuName":8},"\u002Fzsxq",5,{"displayName":68,"href":72},[],{"displayName":77,"metadata":78,"spec":80,"status":83,"children":84},"特价云服务器",{"name":19,"creationTimestamp":79},"2026-09-25T15:30:59.201614Z",{"displayName":77,"href":81,"target":36,"priority":82,"menuName":8},"\u002Fserver",6,{"displayName":77,"href":81},[],{"metadata":86,"spec":91,"status":97,"postCount":73},{"name":87,"creationTimestamp":88,"labels":89},"redis","2026-09-13T09:13:25.567674Z",{"haloweb.section":90},"interview",{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},"Redis 面试题","","Redis 面试题：数据结构与底层实现、持久化、主从集群、缓存设计与分布式锁。",12,false,{"permalink":98,"postCount":73,"visiblePostCount":73},"\u002Fcategories\u002Fredis",[100,124,145,166,187],{"metadata":101,"spec":104,"status":113,"categories":118},{"name":102,"creationTimestamp":103},"post-redis-single-thread-d67c91bd","2026-09-13T10:00:57.608185Z",{"title":105,"slug":106,"cover":93,"excerpt":107,"publishTime":109,"categories":110,"tags":111,"priority":27,"pinned":96,"deleted":96,"visible":112,"allowComment":108},"Redis 为什么单线程还这么快？","redis-single-thread",{"raw":93,"autoGenerate":108},true,"2026-09-13T10:00:57.655030Z",[87],[],"PUBLIC",{"permalink":114,"excerpt":115,"lastModifyTime":116,"phase":117},"\u002Farchives\u002Fredis-single-thread","一、核心原因 纯内存操作：数据在内存中，访问速度极快。 I\u002FO 多路复用：用 epoll 处理大量并发连接，单线程也能处理高并发。 避免上下文切换：单线程没有线程切换开销，也没有锁竞争。 二、Redis 6.0 多线程 Redis 6.0 引入多线程，但只用于网络 I\u002FO 的读写，命令执行仍是单线程","2026-09-16T09:13:51.386377Z","PUBLISHED",[119],{"metadata":120,"spec":122,"status":123,"postCount":73},{"name":87,"creationTimestamp":88,"labels":121},{"haloweb.section":90},{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},{"permalink":98,"postCount":73,"visiblePostCount":73},{"metadata":125,"spec":128,"status":135,"categories":139},{"name":126,"creationTimestamp":127},"post-redis-distributed-lock-b83520e6","2026-09-13T10:00:57.413537Z",{"title":129,"slug":130,"cover":93,"excerpt":131,"publishTime":132,"categories":133,"tags":134,"priority":27,"pinned":96,"deleted":96,"visible":112,"allowComment":108},"Redis 如何实现分布式锁？","redis-distributed-lock",{"raw":93,"autoGenerate":108},"2026-09-13T10:00:57.460603Z",[87],[],{"permalink":136,"excerpt":137,"lastModifyTime":138,"phase":117},"\u002Farchives\u002Fredis-distributed-lock","一、基本实现 SET lock_key unique_value NX EX 30\n NX：key 不存在才设置。 EX：过期时间，防止死锁。 unique_value：释放锁时校验，防止误删别人的锁。 二、释放锁（Lua 脚本保证原子） if redis.call(\"get\", KEYS[1]) ","2026-09-16T09:13:40.536096Z",[140],{"metadata":141,"spec":143,"status":144,"postCount":73},{"name":87,"creationTimestamp":88,"labels":142},{"haloweb.section":90},{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},{"permalink":98,"postCount":73,"visiblePostCount":73},{"metadata":146,"spec":149,"status":156,"categories":160},{"name":147,"creationTimestamp":148},"post-redis-cache-penetration-83ba9eca","2026-09-13T10:00:57.240970Z",{"title":150,"slug":151,"cover":93,"excerpt":152,"publishTime":153,"categories":154,"tags":155,"priority":27,"pinned":96,"deleted":96,"visible":112,"allowComment":108},"缓存穿透、击穿、雪崩及解决方案？","redis-cache-penetration",{"raw":93,"autoGenerate":108},"2026-09-13T10:00:57.284484Z",[87],[],{"permalink":157,"excerpt":158,"lastModifyTime":159,"phase":117},"\u002Farchives\u002Fredis-cache-penetration","一、缓存穿透 查询不存在的数据，缓存和数据库都没有，请求全打到数据库。 解决方案： - 缓存空值（设置较短过期时间）。 - 布隆过滤器，不存在的 key 直接拦截。 二、缓存击穿 热点 key 过期瞬间，大量并发请求打到数据库。 解决方案： - 互斥锁（setnx），只有一个请求查库并回填缓存。 -","2026-09-16T09:13:38.128100Z",[161],{"metadata":162,"spec":164,"status":165,"postCount":73},{"name":87,"creationTimestamp":88,"labels":163},{"haloweb.section":90},{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},{"permalink":98,"postCount":73,"visiblePostCount":73},{"metadata":167,"spec":170,"status":177,"categories":181},{"name":168,"creationTimestamp":169},"post-redis-persistence-c40c1a6e","2026-09-13T10:00:57.060111Z",{"title":171,"slug":172,"cover":93,"excerpt":173,"publishTime":174,"categories":175,"tags":176,"priority":27,"pinned":96,"deleted":96,"visible":112,"allowComment":108},"Redis 的持久化方式有哪些？","redis-persistence",{"raw":93,"autoGenerate":108},"2026-09-13T10:00:57.107399Z",[87],[],{"permalink":178,"excerpt":179,"lastModifyTime":180,"phase":117},"\u002Farchives\u002Fredis-persistence","一、RDB（快照） 原理：在某个时间点把内存数据序列化写入 dump.rdb。 触发：save（阻塞）、bgsave（fork 子进程）、自动配置（save 900 1）。 优点：文件紧凑、恢复快。 缺点：可能丢失最后一次快照后的数据。 二、AOF（追加日志） 原理：把写命令追加到 appendon","2026-09-16T09:12:30.734646Z",[182],{"metadata":183,"spec":185,"status":186,"postCount":73},{"name":87,"creationTimestamp":88,"labels":184},{"haloweb.section":90},{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},{"permalink":98,"postCount":73,"visiblePostCount":73},{"metadata":188,"spec":191,"status":198,"categories":202},{"name":189,"creationTimestamp":190},"post-redis-data-structures-ce205a8f","2026-09-13T10:00:56.752073Z",{"title":192,"slug":193,"cover":93,"excerpt":194,"publishTime":195,"categories":196,"tags":197,"priority":27,"pinned":96,"deleted":96,"visible":112,"allowComment":108},"Redis 常见数据结构及使用场景？","redis-data-structures",{"raw":93,"autoGenerate":108},"2026-09-13T10:00:56.927778Z",[87],[],{"permalink":199,"excerpt":200,"lastModifyTime":201,"phase":117},"\u002Farchives\u002Fredis-data-structures","一、String 最基础，存字符串\u002F整数\u002F二进制。场景：缓存、计数器（incr）、分布式锁（setnx）、限流。 二、List 双向链表。场景：消息队列（lpush\u002Fbrpop）、最新列表。 三、Hash 键值对集合。场景：对象存储（用户信息）、购物车。 四、Set 无序去重集合。场景：标签、共同好","2026-09-16T09:13:50.934425Z",[203],{"metadata":204,"spec":206,"status":207,"postCount":73},{"name":87,"creationTimestamp":88,"labels":205},{"haloweb.section":90},{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},{"permalink":98,"postCount":73,"visiblePostCount":73},{"metadata":209,"spec":210,"status":214,"categories":215,"content":221},{"name":126,"creationTimestamp":127},{"title":129,"slug":130,"cover":93,"excerpt":211,"publishTime":132,"categories":212,"tags":213,"priority":27,"pinned":96,"deleted":96,"visible":112,"allowComment":108},{"raw":93,"autoGenerate":108},[87],[],{"permalink":136,"excerpt":137,"lastModifyTime":138,"phase":117},[216],{"metadata":217,"spec":219,"status":220,"postCount":73},{"name":87,"creationTimestamp":88,"labels":218},{"haloweb.section":90},{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},{"permalink":98,"postCount":73,"visiblePostCount":73},{"content":222,"raw":222},"\u003Ch2>一、基本实现\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>SET lock_key unique_value NX EX 30\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cul>\n\u003Cli>NX：key 不存在才设置。\u003C\u002Fli>\n\u003Cli>EX：过期时间，防止死锁。\u003C\u002Fli>\n\u003Cli>unique_value：释放锁时校验，防止误删别人的锁。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>二、释放锁（Lua 脚本保证原子）\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-lua\">if redis.call(&quot;get&quot;, KEYS[1]) == ARGV[1] then\n    return redis.call(&quot;del&quot;, KEYS[1])\nend\nreturn 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>三、Redisson 实现\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>可重入锁：维护计数器。\u003C\u002Fli>\n\u003Cli>看门狗：业务未执行完自动续期（默认 30s，每 10s 检查）。\u003C\u002Fli>\n\u003Cli>支持公平锁、读写锁、红锁。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>四、注意事项\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>必须设置过期时间，防止持锁节点宕机导致死锁。\u003C\u002Fli>\n\u003Cli>释放锁必须校验 value，避免误删。\u003C\u002Fli>\n\u003C\u002Ful>"]