Redis 通过 scan 找出不过期的 key
# SCAN 命令是一个基于游标的迭代器(cursor based iterator):SCAN 命令每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数,以此来延续之前的迭代过程。
# 注意:当 SCAN 命令的游标参数被设置为 0 时,服务器将开始一次新的迭代,而当服务器向用户返回值为 0 的游标时,表示迭代已结束!
# vim redis_no_ttl_key.sh
#!/bin/bash # Redis 通过 scan 找出不过期的 key # SCAN 命令是一个基于游标的迭代器(cursor based iterator):SCAN 命令每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数,以此来延续之前的迭代过程。 # 注意:当 SCAN 命令的游标参数被设置为 0 时,服务器将开始一次新的迭代,而当服务器向用户返回值为 0 的游标时,表示迭代已结束! db_ip=10.100.41.148 # redis 连接IP db_port=6379 # redis 端口 password='IootCdgN05srE' # redis 密码 cursor=0 # 第一次游标 cnt=100 # 每次迭代的数量 new_cursor=0 # 下一次游标 redis-cli -c -h $db_ip -p $db_port -a $password scan $cursor count $cnt > scan_tmp_result new_cursor=`sed -n '1p' scan_tmp_result` # 获取下一次游标 sed -n '2,$p' scan_tmp_result > scan_result # 获取 key cat scan_result |while read line # 循环遍历所有 key do ttl_result=`redis-cli -c -h $db_ip -p $db_port -a $password ttl $line` # 获取key过期时间 if [[ $ttl_result == -1 ]];then #if [ $ttl_result -eq -1 ];then # 判断过期时间,-1 是不过期 echo $line >> no_ttl.log # 追加到指定日志 fi done while [ $cursor -ne $new_cursor ] # 若游标不为0,则证明没有迭代完所有的key,继续执行,直至游标为0 do redis-cli -c -h $db_ip -p $db_port -a $password scan $new_cursor count $cnt > scan_tmp_result new_cursor=`sed -n '1p' scan_tmp_result` sed -n '2,$p' scan_tmp_result > scan_result cat scan_result |while read line do ttl_result=`redis-cli -c -h $db_ip -p $db_port -a $password ttl $line` if [[ $ttl_result == -1 ]];then #if [ $ttl_result -eq -1 ];then echo $line >> no_ttl.log fi done done rm -rf scan_tmp_result rm -rf scan_result
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」