主题
面试速答(先看这里)
**一句话结论:**在使用场景上,setnx常用于分布式锁的实现,或者幂等处理上面。
60秒标准回答:
这个其实只要知道了他们是什么东西的缩写就容易回答了
SETNX ,SET if Not eXists , 只有键不存在时才设置值
SETEX , SET with EXpiration, 设置值并指定过期时间
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **SETNX 示例::**如果 holliskey 不存在,就设置为 "hello" , 返回 1
- **SETEX 示例::**无论 holliskey 是否存在,都会设置为 "hello"
- **只在键不存在时设置,并设置过期时间:**前面提到了, SETNX是不能设置超时时间的 ,那么想要实现“只在键不存在时设置,并设置过期时间 ”需要通过EXPIRE命令来配合才行,即:
**记忆锚点:**holliskey → SETNX → SET → setnx → setex → SETEX
易错提醒:
- 这个其实只要知道了他们是什么东西的缩写就容易回答了。
- 只在键不存在时设置,并设置过期时间 前面提到了, SETNX是不能设置超时时间的 ,那么想要实现“只在键不存在时设置,并设置过期时间 ”需要通过EXPIRE命令来配合才行,即: 但是这样做就不是原子命令了,需要配合事务或者lua脚本才行。
加分表达:
- SETNX ,SET if Not eXists , 只有键不存在时才设置值 不能设置过期时间 SETEX , SET with EXpiration, 设置值并指定过期时间 无条件进行设置,并带有过期时间 SETNX 示例: 如果 holliskey 不存在,就设置为 "hello" , 返回 1 如果 holliskey 已存在,不做修改, 返回 0 S…
追问准备:
- 围绕「holliskey」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「SETNX」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「SET」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
这个其实只要知道了他们是什么东西的缩写就容易回答了。
SETNX ,SET if Not eXists , 只有键不存在时才设置值
- 不能设置过期时间
SETEX , SET with EXpiration, 设置值并指定过期时间
- 无条件进行设置,并带有过期时间
SETNX 示例:
plain
SETNX holliskey "hello"- 如果
holliskey不存在,就设置为"hello",返回**1** - 如果
holliskey已存在,不做修改,返回**0**
SETEX 示例:
plain
SETEX holliskey 60 "hello"- 无论
**holliskey**是否存在,都会设置为**"hello"** - 并设置过期时间为 60 秒(TTL)
在使用场景上,setnx常用于分布式锁的实现,或者幂等处理上面。而setex常用于缓存的过期控制上面。
扩展知识
只在键不存在时设置,并设置过期时间
前面提到了,SETNX是不能设置超时时间的,那么想要实现“只在键不存在时设置,并设置过期时间 ”需要通过EXPIRE命令来配合才行,即:
plain
SETNX hollis_key "666"
EXPIRE hollis_key 10但是这样做就不是原子命令了,需要配合事务或者lua脚本才行。
或者直接使用SET命令也能实现:
plain
SET hollis_key "666" NX EX 10