ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Redis命令不用背:五大核心类型+事务Lua+运维实战

Redis命令不用背:五大核心类型+事务Lua+运维实战 在Redis这个圈子里待久了你会发现一个特别有意思的现象很多人面试前都在背命令背完没多久就忘可真正天天用Redis的人其实很少死记硬背因为他们掌握了Redis命令的底层规律。我见过不少开发同学连redis-cli自带的help都很少用遇到不会的命令就打开浏览器搜一搜就是半天效率非常低。这篇文章我想一次性把你日常会用到的Redis命令按场景拆开来讲一遍结合我这些年线上实战踩过的坑聊聊每条命令在什么情况下用、在什么情况下千万别用。内容覆盖字符串、哈希、列表、集合、有序集合五大核心数据类型再加上事务、Lua、发布订阅以及连接管理、性能排查等运维命令。适合刚学Redis的新手速读也适合写了两三年Redis但一直靠搜索引擎撑场面的老同学查漏补缺。1. 先搞懂Redis命令的整体“地图”命名规律与命令行入口1.1 命令的命名规律记住前缀就记住一半Redis命令最友善的地方在于它的命名规则非常像一个动词短语操作类型 数据结构类型。比如SET、GET是字符串类型的读写HSET、HGET是哈希类型的读写LPUSH、LRANGE是列表类型的左推入和范围读取。你会发现S开头的多半是字符串或集合H开头的多半是哈希L开头的多半是列表Z开头的基本是有序集合Z就是Sorted Set的缩写这也算是一个小小的历史遗产。这个规律不是巧合而是Redis希望用户在命令行里能快速联想到“这个数据结构支持哪些操作”。当你看到一个陌生命令时先看前缀推断类型再用help验证基本就不会用错。我自己带团队时经常跟新人说命令不用背记三件事就够了——数据类型的英文名、动词前缀的对应关系、以及每种数据类型最核心的三五个操作。其余的用到再查查两三次自然就记住了。1.2 三种进入命令行的姿势redis-cli交互模式、单条命令与管道批量执行绝大多数人接触Redis命令都是从redis-cli开始的。这里有个很容易被忽略的点你以为redis-cli只能用交互模式其实它有三种用法。第一种是交互模式直接输入redis-cli回车进入到127.0.0.1:6379这个提示符下面适合平时手动检查数据、调试命令。第二种是单条命令模式比如redis-cli GET name适合写脚本时临时执行一条命令。第三种是管道模式比如redis-cli --pipe它可以批量导入数据速度比一条一条执行快非常多。我在做缓存预热的时候经常把几百个Key的写入操作拼成一个文本文件然后用--pipe一次性导入几秒钟就能搞定几万条数据。这里有个小坑想提醒一下如果Redis设置了密码你用redis-cli GET name这种单条命令方式需要在命令里加上-a 密码参数或者先redis-cli -a 密码进入交互模式再操作。注意-a后面直接跟密码可能会出现在shell的历史记录里所以生产环境我更推荐用环境变量REDISCLI_AUTH来传递密码避免泄露。1.3 help、Tab补全与COMMAND INFO不必死记硬背Redis的命令行工具内置了非常完整的帮助系统这一点很多人真的浪费了。在交互模式下输入help加一个空格再按Tab键会列出所有的命令组比如help string就会把字符串类型的命令全部列出来每条命令后面还附带用法说明。如果你连命令名都记不全输入help再按Tab也能看到候选列表相当于命令行版的“命令字典”。另外一个命令是COMMAND INFO它返回的是命令的元数据。比如你输入COMMAND INFO SET能看到SET命令的参数个数、标志位、首次引入的版本号。这个命令平时用得不多但是在做命令审计或者兼容性检查时非常有用。比如你想确认当前使用的Redis版本是否支持某个新命令就可以通过COMMAND INFO的返回结果来判断。我建议所有Redis使用者养成一个习惯拿到一个陌生命令先help再实测而不是直接搜博客因为博客里的版本可能已经过时了。2. 字符串与哈希缓存场景里出场率最高的两类命令2.1 字符串命令的原子操作不只是set/get还要会用incr和setnx字符串类型是Redis最基础、也是业务里用得最多的数据类型。SET和GET本身没什么好讲的但我发现很多开发同学对几个“进阶字符串命令”的认知是模糊的尤其是INCR、DECR、SETNX和GETSET。INCR key可以对一个整数类型的字符串做自增操作。它的价值在于原子性——在高并发场景下多个客户端同时执行INCR不会产生并发覆盖问题。我自己处理过一个点赞计数的需求刚开始用“先GET再SET”的方式结果并发一高计数就少算。换成INCR之后一行命令解决问题。如果你需要增加一个指定的步长用INCRBY key increment。SETNX key value的全称是SET if Not eXists即只有Key不存在时才设置成功。它返回1表示设置成功返回0表示Key已存在。这个命令曾经是实现分布式锁的核心后来官方推荐用SET key value NX PX 过期时间来一步完成“加锁设置过期时间”的原子操作因为单独的SETNX加EXPIRE不是原子的万一中间断电锁就永远不释放了。这块我留在第5章Lua那里细说但从命令层面你要知道SETNX和SET NX的区别就差一个“设置过期时间”的严谨性。2.2 哈希命令与对象存储为什么别把整个对象序列化塞成一个string哈希类型Hash是Redis里最适合存“对象”的结构。一个哈希Key内部可以包含多个字段field每个字段对应一个值类似Python里的字典或者Java里的Map。常用命令是HSET key field value、HGET key field、HMSET key field1 value1 field2 value2、HMGET key field1 field2、HGETALL key、HDEL key field1。举个例子你要缓存一个用户信息用户名、年龄、性别。如果直接把整个对象序列化成JSON塞进一个字符串Key里读起来确实方便但问题是——你更新任何一个字段都得把整个对象反序列化出来、改完再序列化回去写一遍。一旦并发更新不同字段还可能互相覆盖这就是典型的缓存脏数据场景。用哈希就优雅得多每个字段独立读写更新用户名就HSET user:1001 name 老王完全不影响其他字段。而且哈希Key的内存开销在字段数量较少时比字符串序列化更低这一点在Redis的官方内存优化说明里专门提到过。不过哈希也不是万能药。如果字段特别多HGETALL会一次性把全部字段拉出来网络开销和内存占用都会飙升。我见过一个业务把商品的几千个属性全部塞进一个哈希Key每次HGETALL都是几MB的数据直接把带宽打满。这种情况建议按业务维度拆分字段读写尽量只取需要的字段用HMGET而不是HGETALL。2.3 实战登录态存储的两种写法和各自代价我拿登录态存储来对比一下字符串和哈希的实际差异这个例子我在多个项目里都用过。假设你要存用户登录的Token包含用户ID、登录时间、设备类型、过期时间。方案A是把这些信息序列化成JSON字符串执行SET login:token:{token} {uid:123,login_time:2025-01-01,device:ios} EX 86400。优点是写入简单、读取简单一条命令全拿到适合你每次登录校验时都需要完整信息的场景。缺点也很明显你想单独改个设备类型就得重新序列化整个字符串如果登录状态里有个“最近活跃时间”这种高频更新的字段每次更新都是重写整个对象性能很差。方案B是用哈希HSET login:token:{token} uid 123 login_time 2025-01-01 device ios再单独执行EXPIRE login:token:{token} 86400。你更新最近活跃时间时只需要HSET login:token:{token} last_active 2025-01-02 10:00:00代价小很多。缺点是如果想清空全部字段你需要DEL整个Key而不是像字符串那样一个DEL完事。整体上我推荐字段内存在“独立更新”诉求或字段数量不多但更新频繁的场景使用哈希如果对象整体读取、整体写入、很少局部更新字符串序列化其实更省事。3. 列表、集合与有序集合数据结构特性决定命令选择3.1 列表命令从消息队列到最新列表列表List在Redis里是一个双向链表结构所以它的核心命令围绕“左和右”展开LPUSH从左边推入RPUSH从右边推入LPOP从左边弹出RPOP从右边弹出LRANGE key start stop取一段范围内的元素。列表最常见的两个业务场景一个是消息队列的朴素实现一个是“最新列表”。消息队列场景下生产者LPUSH消息消费者RPOP拉取天然就是先进先出FIFO的顺序。不过这里必须给你提个醒Redis列表当消息队列有一个致命短板——没有消费确认机制。消费者RPOP之后万一处理失败消息就丢了。如果你需要至少一次或者精确一次的消息投递还是老老实实用专业消息队列比如Kafka或者RabbitMQ。列表适合的是那种“丢了也无所谓”的轻量场景比如实时日志、简单的异步通知。做“最新列表”时LRANGE的用法很讲究。比如你要展示一个用户最新的5条动态每次新动态产生就LPUSH user:1001:feed 动态ID然后LRANGE user:1001:feed 0 4取前5条。为了防止列表无限增长通常还要配合LTRIM user:1001:feed 0 99保留前100条就行。LTRIM这个命令很多人不用但它其实特别适用于控制列表长度避免Key越积越大。3.2 集合命令去重、抽奖与好友推荐集合Set的特点是元素唯一、无序。常用命令也很直接SADD添加元素、SREM移除元素、SMEMBERS获取全部元素、SISMEMBER判断元素是否存在、SCARD获取元素数量。集合在业务里最常见的是“去重”和“关系计算”。比如你需要记录某篇文章的点赞用户ID每次用户点赞就SADD article:1001:likes 12345想看某个人是否点赞过就是SISMEMBER article:1001:likes 12345想要点赞总数就是SCARD article:1001:likes。整个过程保证了同一个用户ID不会被重复添加连代码里的判断都省了。集合的另一个核心能力是集合间的运算SINTER交集、SUNION并集、SDIFF差集。做社交场景的“你可能认识的人”就是典型用法拿用户A的好友集合和用户B的好友集合做交集重合度最高的几个人就可以作为推荐候选。我做过一个类似的实现SINTERSTORE可以把交集结果直接存到一个新的Key里方便后续分页处理不会因为结果集太大而撑爆一次网络请求。3.3 有序集合命令排行榜背后的score用法和坑有序集合ZSet是Redis里我个人认为最强大的一种数据类型。它和普通集合一样保证成员唯一但每个成员关联了一个分数score并且集合会按照分数从小到大自动排序。核心命令是ZADD key score member、ZRANGE key start stop、ZREVRANGE key start stop、ZSCORE key member、ZINCRBY key increment member。排行榜是ZSet最经典的场景。比如积分排行榜用户每次获得积分就执行ZINCRBY ranking:2025 10 user_123查询Top10就是ZREVRANGE ranking:2025 0 9 WITHSCORES。WITHSCORES参数会让你连同分数一起返回这个在展示榜单一分钱都不能少。这里有个我踩过的坑ZREVRANGE是从大到小排序ZRANGE是从小到大很多同学第一次用会把Top榜写成ZRANGE结果榜单顺序完全反了。口诀就是想拿第一用REVreverse反转一下就到前面了。ZSet还经常被用在延时任务里——把任务执行时间戳作为score成员是任务ID然后用ZRANGEBYSCORE key -inf 当前时间戳 LIMIT 0 10拉取到期的任务。这个方案不少人用过但要注意ZRANGEBYSCORE的区间参数默认是闭区间如果需要半开半闭要用左括号表示开区间比如(100表示不包含100。这一小点如果不仔细看文档很容易在线上出问题。4. 通用命令与键生命周期从过期时间到大Key清理4.1 keys和scan线上环境为什么坚决不用keysKEYS pattern这个命令可以说是一把双刃剑。平时在本地开发环境用KEYS user:*看看有哪些Key非常方便。但到了线上我强烈建议你永远不要在生产环境执行KEYS。原因很简单KEYS会遍历Redis中所有的Key而且这个过程是单线程阻塞的。如果你的Redis里有几百万个Key执行一次KEYS后面的所有请求都得排队等它遍历完延迟直接飙到几秒甚至十几秒极有可能引发雪崩。线上替代方案是SCAN命令。SCAN也是遍历Key但它是基于游标分批进行的每次返回一小批结果不会长时间阻塞Redis。基本用法是SCAN 0 MATCH user:* COUNT 1000第一次调用游标传0返回结果里会带下一个游标你拿这个游标继续迭代直到游标变成0说明遍历结束。需要注意SCAN在遍历期间如果有Key新增或删除不保证一定能被扫描到所以它适用于“大概看看有哪些Key”的场景而不是精确的集合快照。4.2 del与unlink一个阻塞一个异步删除大Key的学问在Redis里删除Key大家第一反应是DEL key。但如果你要删除的是一个包含几百万个元素的大Key比如一个巨大的列表或者哈希DEL在执行时可是要花时间去释放内存的这个过程同样是阻塞的。我见过有同事在线上直接DEL一个几GB的ZSet结果Redis直接卡了好几秒线上服务告警铺天盖地。Redis 4.0以后提供了UNLINK key它和DEL功能一样都是删除Key但它是异步删除——先在主线程里把Key从字典表中摘除然后后台线程慢慢回收内存所以主线程几乎不会卡顿。我的习惯是小Key用DEL无所谓大Key一律用UNLINK。判断“大”的标准不一定要很精确如果这个Key内部元素超过几万或者体积超过几十MB我就会直接UNLINK。这属于线上运维的基本素养。4.3 expire/ttl/type/object体检一个Key的基本姿势EXPIRE key seconds给Key设置过期时间TTL key查看剩余过期秒数PERSIST取消过期时间。这一组命令是缓存治理的基础。我在这里要强调一个细节EXPIRE的单位是秒PEXPIRE的单位是毫秒。如果你在秒级循环里调EXPIRE key 1看起来还行但Redis底层对过期时间有一个精度问题极端情况下可能提前失效所以对失效时间精度要求高的场景我会用PEXPIRE加毫秒。另外一个容易被忽略的命令是TYPE key它返回Key的类型比如string、list、hash、set、zset。这个命令在排查问题时特别有用——你遇到一个Key行为诡异先看看它的数据类型是不是和你预期的一致。我处理过一个线上事故某服务把同一个Key既当字符串写入又当哈希写入结果后写入的那次直接报类型错误业务崩溃。一查TYPE问题立刻定位。OBJECT ENCODING key也是体检利器它可以看到Key内部使用了什么编码方式比如int、embstr、raw、ziplist、skiplist等。知道内部编码有助于判断内存优化的方向比如小哈希使用ziplist编码会节省不少内存当字段数超过阈值后会转为hashtable内存占用会变大这时候你就知道为什么要控制单个哈希的字段数量了。4.4 过期清理机制惰性删除、定期删除和内存淘汰的区别聊命令不能不聊背后的过期策略因为很多命令行为都和过期策略密切相关。Redis清理过期Key分两种惰性删除和定期删除。惰性删除是指当你访问一个Key时发现它已经过期顺手删除。定期删除是Redis每隔一段时间随机抽取一部分设置了过期时间的Key检查是否过期定期清理。这两种机制各有代价惰性删除可能导致过期Key长期占内存定期删除是概率性的不一定每次都能扫到。所以除了过期机制Redis还提供了内存淘汰策略通过maxmemory-policy配置常见的有noeviction内存满了不淘汰直接报错、allkeys-lru对所有Key按LRU淘汰、volatile-lru只对设置了过期时间的Key按LRU淘汰。我在实际项目里如果Redis只做缓存推荐allkeys-lru因为即使缓存Key没设置过期时间内存满了也会淘汰不常用的如果Redis里混着不可丢失的数据那就得小心了noeviction至少能让写失败而不是默默丢数据。这个选择不只是命令层面的问题而是架构层面的决策但你对INFO memory里这些指标有概念之后才能做出正确判断。5. 事务、Lua与发布订阅把多条命令组装成完整业务的三种方式5.1 MULTI/EXEC事务注意它不做回滚也不保证真的“原子”Redis的事务用MULTI开启然后连续输入多条命令最后EXEC一起执行。在MULTI和EXEC之间的命令不会立即执行而是进入一个队列等EXEC一起发出去。这一点和关系型数据库完全不同很多人第一次用都觉得别扭。这里有个特别容易误解的知识点Redis事务不保证“原子性”的语义和MySQL不一样。MySQL的事务如果中途出错会整体回滚但Redis的MULTI/EXEC在遇到运行时错误时不会回滚已经执行的命令。比如你在一个事务里先SET a 1再执行一个非法的命令比如LPUSH a 1a是字符串不是列表结果是SET a 1已经生效了LPUSH报错但前面的写入不会撤销。官方文档对这种行为的态度是Redis的设计哲学是“命令出错就让它出错没必要为了支持回滚把事情搞复杂”。所以在用MULTI/EXEC时你要自己确保事务里的每条命令都是正确执行的。如果想让事务内的命令“要么都不执行要么都执行”实际在Redis里还有个DISCARD命令可以在EXEC之前取消事务清空队列相当于“反悔”的机会。5.2 WATCH乐观锁先检查后写分布式锁之外的另一种思路WATCH key是Redis事务的一个重要补充。它的作用是监视一个或多个Key如果在事务执行之前这些Key被其他客户端修改了那么当前事务执行EXEC时会直接失败返回nil你可以选择重试或者放弃。这是一种典型的乐观锁机制类似CASCompare And Swap。我举一个实际例子你要实现“库存扣减不超卖”。伪代码如下WATCH stock:item:1001 GET stock:item:1001 MULTI DECR stock:item:1001 EXEC如果多个客户端同时读到库存是1其中一个执行DECR把库存改成0另一个在EXEC时发现stock:item:1001已经被修改过这个事务就不会执行从而避免了超卖。当然这个方案在高并发下失败率会比较高因为只要有人改了Key其他人都得重试。所以真实场景里我更推荐直接用DECR配合判断返回值或者用Lua脚本实现原子操作。但WATCH的价值在于让你理解Redis事务的“条件执行”思想它给了一个不用分布式锁就能保证一致性的轻量手段。5.3 EVAL与Lua脚本真正原子化的复合操作比如分布式锁的解锁如果你需要多条命令合并执行并且保证整体原子性MULTI/EXEC其实并不够因为中间穿插的读取结果无法在同一个事务里传给后续命令做逻辑判断。Redis官方给的方案是Lua脚本通过EVAL命令执行一段Lua代码。Lua脚本在Redis里是原子执行的整个脚本执行期间不会插入其他命令所以它天然解决了“查了再写”的并发问题。分布式锁的解锁就是最典型的例子。正确的解锁不能只DEL key你得先确认当前调用方持有锁才能删除。伪代码思路EVAL if redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end 1 lock:order:1001 owner_token这里redis.call是Lua脚本里调用Redis命令的入口。脚本先判断锁的持有者是否是自己是才删除。整个过程原子执行不存在“刚判断完别人立刻删除了锁”的窗口期。如果你用非原子的“先GET再DEL”的老写法在高并发下一定概率会把别人刚续期的锁删掉导致临界区失控。这个坑我见过不止一次而且每次出事都是在活动大促期间非常刺激。5.4 发布订阅PUBLISH/SUBSCRIBE的适用边界Redis的发布订阅用PUBLISH channel message发布消息SUBSCRIBE channel订阅消息UNSUBSCRIBE退订。它和前面讲的事务、Lua是不同维度的能力但既然聊到“多条命令组装业务”我觉得值得说两句。Redis发布订阅的优点是轻量延迟极低特别适合实时性要求高、但允许丢消息的消息推送场景比如在线聊天室的实时通知、配置变更的即时广播。我在公司内部用PUBLISH推送过“某些节点的本地缓存失效”通知效果很好所有服务实时收到订阅后清掉本地缓存。但它有明显边界消息不会持久化。如果某个订阅者正在离线它错过的那条消息就永远错过了因为Redis没有队列帮你缓存。另外发布订阅的消息是即发即弃消费者收到后处理失败也没有重试机制。如果你的业务接受不了丢消息就不要用它做可靠事件分发这种场景老老实实用Redis Stream或者专门的消息中间件。Redis Stream是Redis 5.0引入的支持消费者组和消息确认功能更接近专业消息队列但它命令更复杂我一般只在“不想引入额外中间件但希望消息可回放”的项目里用。6. 连接、安全与运维命令生产环境里真正救命的那些6.1 AUTH、SELECT、PING和CLIENT连接层的保命手段先聊连接层的命令。PING是健康检查的入门命令返回PONG代表实例活着。AUTH password在配置了密码的实例上必须首先执行否则其他命令都会被拒绝。SELECT index用于切换数据库编号Redis默认有16个库但我要提醒一句不要在业务里依赖多库尤其是Redis Cluster集群模式不支持跨库操作默认就用SELECT 0即可把库当隔离手段的思路是早期单机Redis留下的习惯很容易给自己挖坑。再来说CLIENT系列命令。CLIENT LIST可以查看所有连接到Redis的客户端信息包括来源IP、连接时长、最近执行的命令等。当线上出现“连接数打满”的告警时第一个排查动作就是用CLIENT LIST看看连接是从哪来的、谁占着不释放。CLIENT SETNAME可以给每个连接设置名字比如用服务名带IP作为连接名之后排查问题时一眼就能看出来是哪个服务连进来的这个习惯强烈建议大家养成。6.2 INFO、SLOWLOG、MONITOR性能诊断三板斧运维Redis最常用的命令我首推INFO。INFO会返回一大串统计信息你可以分段查看INFO server看版本和运行时间INFO clients看连接数INFO memory看内存使用情况INFO stats看总命令数、命中率等关键指标。其中used_memory、total_commands_processed、keyspace_hits和keyspace_misses这几个是我每次定位问题必看的字段。命中率通过keyspace_hits / (keyspace_hits keyspace_misses)计算如果命中率长期低于80%缓存可能形同虚设大量请求打到了后端存储上。SLOWLOG是慢查询日志。SLOWLOG GET 10取最近10条慢日志SLOWLOG LEN看总条数。我在实际诊断时经常发现线上“莫名其妙的超时”很多不是因为命令本身慢而是某个大Key操作在慢日志里留下了痕迹比如一次HGETALL执行了几十毫秒。通过SLOWLOG GET能看到这条命令的执行时间和参数顺藤摸瓜找到具体的Key然后再用TYPE、OBJECT ENCODING确认问题。MONITOR命令可以实时打印Redis收到的每一条命令这对调试“哪个客户端发了什么命令”非常有用。但注意MONITOR会降低Redis性能因为它把所有命令都实时输出到客户端生产环境开MONITOR只能开很短的时间比如想抓一个瞬时出现的错误命令开几秒钟就够了千万别长时间挂着。6.3 CONFIG GET/SET与Redis Desktop Manager怎么安全地调整配置CONFIG GET 参数名可以查看当前配置比如CONFIG GET maxmemory查看最大内存限制CONFIG GET maxmemory-policy查看淘汰策略。CONFIG SET可以动态修改一些配置不需要重启Redis。比如临时改maxmemory或者slowlog-log-slower-than用CONFIG SET非常方便。但有两个注意点第一CONFIG SET也不是所有参数都能动态改像appendonly这种涉及到持久化文件布局的改了也不生效需要重启第二动态修改的配置在Redis重启后会恢复成配置文件里的值所以临时调优可以用CONFIG SET但想永久生效必须改redis.conf。至于可视化工具很多同学会用到Redis Desktop Manager现在叫Another Redis Desktop Manager。说实话这类工具适合看Key长什么样、新手熟悉命令不适合在线上做批量操作。工具里的“命令行”本质是redis-cli所以本文讲的命令在工具里照样能用但我建议生产环境操作还是用原生的redis-cli因为可视化工具的批量执行和大Key预览往往会卡顿甚至把整个实例拖慢。6.4 集群相关命令CLUSTER INFO到集群故障转移的一瞥如果你用的是Redis Cluster那么还需要掌握几个集群管理命令。CLUSTER INFO查看集群状态CLUSTER NODES查看所有节点的ID、IP和角色主节点还是从节点。当一个节点挂掉后CLUSTER NODES里会看到它的状态变成fail同时它的从节点会尝试晋升为主节点。我排查集群问题时第一件事永远是CLUSTER INFO看cluster_state是不是ok如果是fail状态多半是某个包含槽位的节点不可用了。整个集群里最核心的概念是哈希槽hash slot。Redis Cluster把全部Key空间分成16384个槽每个Key通过CRC16算法计算后映射到某个槽然后由负责该槽的节点处理读写。理解这个概念后你再去看CLUSTER KEYSLOT key这个命令就能明白它为什么可以用来定位某个Key到底落在哪个槽上——排查“集群数据倾斜”时你可以批量计算Key的槽位统计哪些槽的Key特别多从而判断是不是哈希标签策略有问题。最后再分享一个我个人的使用习惯我会把所有Redis命令分成“业务命令”和“治理命令”两套清单。业务命令只允许写进代码里治理命令只允许在跳板机上人工操作并且操作前先在redis-cli交互模式下用help确认参数。这个习惯帮我避免了好几次手误比如把DEL的Key名写错导致误删。Redis命令本身不难难的是在紧急时刻仍然保持冷静、按规范操作。希望这篇文章能帮你建立起自己的命令体系以后遇到问题不再靠搜索而是直接反应出“这个场景该用哪条命令、为什么”。
返回列表