Ex命令

本文介绍了Vim编辑器中的Ex命令集,包括如何保存、退出文件,以及复制、移动行等操作。Ex命令源自Vim的历史根源,提供强大的文本编辑功能。

初时,先有ed,ed为ex之父,ex为vi之父,而vi为Vim之父。 – The Old Testament of Unix

Vim的命令分为两种,一种是Vim自己的,另一种则是Ex的,Ex命令都需要先输入冒号,最后回车才能执行,相比于Vim命令,Ex命令作用范围更广,也更强大,下面列举一些常用的Ex命令

命令作用
:w保存文件
:q退出
:x保存并退出,相当与:wq
:e编辑文件
:e!撤销更改,恢复刚打开文件时的原始内容
:0表示第0行
:.表示当前行
:$表示最后一行
%表示当前文件名
:@重复上一次执行的Ex命令
:shell进入shell
:normal在指定范围内执行普通模式命令
:m(:move)剪切命令
:t(:copy)复制命令
:6t.把第6行复制到当前行下方
:t6把当前行复制到第6行下方
:t.为当前行创建一个副本,相当于yyp,但不会使用寄存器,因此不会覆盖寄存器中当前内容
:t$把当前行复制到文件末尾
:’<,>’t0把高亮选中的行复制到文件开头
<think>嗯,用户现在想了解Redis中SET NX EX命令的具体用法和示例。之前我已经回答过关于SETNX命令的作用,现在需要结合用户提供的引用内容来详细说明SET NX EX。首先,我需要确认用户是否清楚SETNX和SET NX EX的区别,可能用户已经知道SETNX,现在想了解更高效的原子操作。 根据用户提供的引用,特别是引用[1]和[2],SET NX EX实际上是SET命令的参数组合,用于在设置键时同时添加不存在条件和过期时间。这比分开使用SETNX和EXPIRE更原子化,避免了死锁风险。用户可能是在实现分布式锁时遇到了问题,或者想优化现有的锁机制。 用户可能需要具体的语法和示例,比如如何在命令行或代码中使用这个命令。例如,在Redis-cli中,命令是`SET key value NX EX seconds`。引用[2]中的Lua脚本示例展示了如何安全释放锁,用户可能也需要这方面的信息,比如如何结合Lua确保原子性操作。 另外,用户的问题可能涉及到分布式锁的最佳实践,比如设置过期时间的重要性,以及如何防止误删其他进程的锁。引用中提到需要验证锁的值(如UUID),所以在示例中应该包含这部分内容,确保释放锁时的安全性。 还需要注意用户可能的应用场景,比如幂等性控制、限流等,这时候SET NX EX如何应用。例如,在防止重复提交时,使用该命令设置一个带有过期时间的键,确保同一请求在一段时间内无法重复执行。 最后,用户可能对旧版Redis的兼容性有疑问,SET NX EX需要Redis 2.6.12及以上版本,所以需要提醒用户检查版本,或者提供替代方案,比如使用Lua脚本组合SETNX和EXPIRE。 总结下来,回答需要涵盖命令语法、参数解释、典型场景、代码示例(如Python、Java)、注意事项(如原子性、版本要求)、以及常见问题解答(如如何避免误删锁)。同时,结合之前的回答和引用内容,确保信息准确且实用,帮助用户解决实际问题。</think>### Redis中`SET NX EX`命令详解 `SET NX EX`是Redis中用于**原子性设置键值对并附加条件与过期时间**的命令组合,是`SETNX`的优化版本(需Redis 2.6.12+)。以下从语法、场景、示例到注意事项全面解析其用法。 --- #### 一、命令语法与参数 ```bash SET key value NX EX seconds ``` - **`NX`**:仅在键不存在时设置值(避免覆盖已有数据)。 - **`EX`**:设置键的过期时间(秒),过期后自动删除。 - **返回值**: - 成功设置:返回`OK`。 - 键已存在:返回`nil`(表示未执行操作)[^1]。 --- #### 二、典型使用场景与示例 ##### 1. **分布式锁(推荐方案)** - **需求**:多个进程/服务竞争共享资源时实现互斥访问。 - **实现步骤**: 1. 使用`SET NX EX`原子性创建锁并设置超时。 2. 执行业务逻辑后,通过Lua脚本验证并删除锁(避免误删)。 - **代码示例(Python + redis-py)**: ```python import redis import uuid r = redis.Redis(host='localhost', port=6379) lock_key = "resource_lock" client_id = str(uuid.uuid4()) # 尝试获取锁(设置10秒超时) result = r.set(lock_key, client_id, nx=True, ex=10) if result: try: # 执行业务逻辑(如修改数据库) print("Lock acquired, processing...") finally: # 通过Lua脚本安全释放锁 script = """ if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end """ r.eval(script, 1, lock_key, client_id) else: print("Failed to acquire lock") ``` **关键点**: - 使用唯一标识(如UUID)作为锁的值,确保只有持有者能释放锁[^2]。 - Lua脚本保证`GET`和`DEL`的原子性,防止并发冲突。 --- ##### 2. **幂等性控制(防重复提交)** - **场景**:防止用户重复提交订单、支付请求等。 - **实现示例**: ```python order_id = "order_123456" # 设置订单ID为键,5秒内不允许重复提交 if r.set(order_id, "processing", nx=True, ex=5): process_order() # 处理订单逻辑 else: raise Exception("请勿重复提交订单") ``` --- ##### 3. **限流与并发控制** - **场景**:限制用户API调用频率(如每秒1次)。 - **示例**: ```python user_id = "user_1001" rate_limit_key = f"rate_limit:{user_id}" if r.set(rate_limit_key, "1", nx=True, ex=1): handle_request() # 处理请求 else: reject_request() # 返回“请求过于频繁” ``` --- #### 三、注意事项与常见问题 1. **原子性优势** `SET NX EX`将“设置值”和“设置过期时间”合并为原子操作,彻底解决`SETNX + EXPIRE`分步执行时可能导致的死锁问题[^1][^2]。 2. **超时时间设置** - **过短**:业务未完成时锁提前释放,导致数据不一致。 - **过长**:系统故障时资源长时间不可用。 - **建议**:根据业务逻辑预估耗时,并设置合理的冗余时间(如1.5倍预期耗时)。 3. **Redis版本兼容性** `SET NX EX`需Redis 2.6.12+,旧版本需改用`SETNX`+`EXPIRE`(需Lua脚本保证原子性)。 4. **锁续期问题** - 若业务执行时间超过锁的过期时间,需通过**看门狗机制**(如Redisson库)自动续期锁。 - 手动实现示例: ```python def renew_lock(): while business_not_finished: r.expire(lock_key, 10) # 每10秒续期一次 time.sleep(5) ``` --- #### 四、与旧命令对比(`SETNX` vs `SET NX EX`) | **特性** | `SETNX` | `SET NX EX` | |----------------|---------------------------|---------------------------------| | 原子性 | 需搭配`EXPIRE`(非原子) | 原子性设置值与过期时间 | | 代码复杂度 | 高(需处理两步操作) | 低(单命令) | | 适用版本 | 所有Redis版本 | Redis 2.6.12+ | | 典型用途 | 简单互斥场景 | 分布式锁、高可靠性场景 | --- #### 五、相关问题 1. Redis中如何实现锁的可重入性? 2. `SET NX EX`与Redisson分布式锁有何区别? 3. 如何通过Redis实现滑动窗口限流? --- ### 引用说明 - `SET NX EX`的原子性优势及语法参考Redis官方文档实现[^1]。 - Lua脚本解锁方案来自分布式锁最佳实践[^2]。 - 版本兼容性说明基于Redis版本更新历史[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值