Redis SET 命令(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在现代互联网应用开发中,Redis 作为高性能的内存数据库,因其快速的读写能力和丰富的数据类型,被广泛应用于缓存、计数器、会话管理等场景。其中,SET 命令作为 Redis 中最基础且高频使用的操作之一,是开发者构建数据存储逻辑的核心工具。无论是编程新手还是中级开发者,掌握 SET 命令的用法与进阶技巧,都能显著提升对 Redis 的实战能力。本文将从零开始讲解 SET 命令的功能、参数配置、使用场景及实际案例,帮助读者逐步建立清晰的认知框架。


什么是 Redis SET 命令?

Redis 的 SET 命令用于设置指定键(Key)的值(Value),其语法简单直接:

SET key value  

可以将其想象为一个“存储盒子”的操作——开发者通过键名(类似盒子的编号)将数据(值)存入 Redis 的内存空间中。例如,执行 SET user:1001 "John Doe",就相当于在 Redis 内存中放置了一个名为 user:1001 的盒子,并将 "John Doe" 存入其中。

与传统数据库不同,Redis 的 SET 操作是原子性的,这意味着即使多个客户端同时执行 SET,也不会出现数据竞争问题。这种特性使其在高并发场景下尤为可靠。


Redis SET 命令的基本语法与参数详解

基础用法

最简单的 SET 命令仅需提供键和值:

SET my_key "Hello Redis!"  

执行后,键 my_key 的值会被设置为 "Hello Redis!"。若该键已存在,则原值会被覆盖。

参数扩展:通过选项控制行为

SET 命令支持多个可选参数,以实现更复杂的逻辑。以下是常用参数及其作用:

1. NX(Not eXists)

若键不存在时才设置值:

SET my_key "New Value" NX  

此参数类似于“先查后存”的逻辑,若键已存在则操作失败。常用于实现唯一性约束,例如防止重复注册的用户 ID。

2. XX(eXists)

仅当键已存在时才更新值:

SET my_key "Updated Value" XX  

此参数适合需要确保键存在的场景,例如更新已有用户资料。

3. EXPX:设置键的过期时间

  • EX seconds:以秒为单位设置过期时间
  • PX milliseconds:以毫秒为单位设置过期时间
    例如:
SET session_id "ABC123" EX 3600  # 1小时后过期  
SET cache_data "Data" PX 5000    # 5秒后过期  

过期时间机制是 Redis 缓存的核心功能之一,开发者可通过此参数自动清理不再需要的数据,避免内存浪费。

4. KEEPTTL

保留键的原有过期时间(仅在 GETSET 命令中使用,此处不展开)。


参数组合与优先级

多个参数可组合使用,但需注意优先级规则:

  • NXXX 不能同时使用,否则命令会报错。
  • 过期时间参数 EXPX 可与 NXXX 结合,例如:
    SET user:last_login "2023-10-01" NX EX 86400  # 仅当键不存在时设置,并设置1天过期  
    

实际案例:SET 命令的典型应用场景

案例1:用户登录状态缓存

假设需要缓存用户的登录状态,且希望令牌在24小时内失效:

SET user_token:123 "abcxyz" EX 86400  

GET user_token:123  

通过 EX 参数,Redis 会自动在24小时后删除该键,无需手动清理。

案例2:唯一性验证(如防重复提交)

使用 NX 参数实现“仅当键不存在时设置”的逻辑,例如防止用户重复提交表单:

SET form_submitted:456 "yes" NX  

开发者可据此判断是否已提交过表单。

案例3:计数器的原子更新

虽然 Redis 提供 INCR 命令专门用于计数,但 SET 结合 XX 参数也能实现类似效果:

SET visit_count "0"  

SET visit_count "1" XX  # 第一次执行会失败,需先用NX或直接SET初始化  

不过,实际场景中更推荐使用 INCR 命令,因其性能更优。


进阶技巧与注意事项

技巧1:批量操作与管道(Pipeline)

若需多次执行 SET 命令,可通过管道技术减少网络延迟:

MULTI  
SET key1 "value1"  
SET key2 "value2" EX 3600  
EXEC  

管道将多个命令打包发送,显著提升批量操作的效率。

技巧2:结合条件判断的原子操作

通过 NX 参数与 Lua 脚本结合,可实现更复杂的条件逻辑。例如,仅在键不存在时设置值,并返回结果:

EVAL "if redis.call('exists', KEYS[1]) == 0 then redis.call('SET', KEYS[1], ARGV[1]) return 1 else return 0 end" 1 my_key "value"  

此方法确保操作的原子性,避免竞态条件。

注意事项:覆盖与过期时间冲突

  • 若键已存在且设置了过期时间,再次使用 SET 会清除原过期时间,除非显式重新指定 EXPX
  • 例如:
    SET key "old" EX 60  
    SET key "new"  
    # 此时过期时间被移除,键将永久保留  
    

常见问题与解答

Q1:SET 命令与 GETSET 命令的区别?

GETSET 是“设置新值并返回旧值”的组合操作,其语法为 GETSET key value。而 SET 仅执行设置操作,无返回旧值的功能。

Q2:如何查看键的剩余过期时间?

使用 TTL keyPTTL key(毫秒级)命令,可获取键的剩余存活时间。

Q3:SET 是否支持批量设置?

直接通过 SET 命令无法批量设置,但可通过管道或 Lua 脚本实现。


结论

Redis 的 SET 命令虽看似简单,但通过灵活组合参数与场景,能够解决从基础数据存储到高阶业务逻辑的多样化需求。无论是实现缓存机制、唯一性验证,还是构建原子操作,开发者均可借助 SET 命令的丰富功能提升系统性能与可靠性。建议读者通过实际操作 Redis CLI 或客户端工具,逐步尝试文中案例,深入理解命令的行为模式。随着对 SET 命令的掌握,进一步探索 Redis 的其他数据类型(如 Hash、List)和高级特性,将为构建高效分布式系统打下坚实基础。


通过本文的系统性讲解,希望读者能够全面理解 Redis SET 命令 的核心原理与实践方法,从而在实际开发中游刃有余地运用这一强大工具。

最新发布