我应该使用哪个命令来让Redis中那些生命期少于5天的键过期?

我的数据库会将会话设置为哈希值:

1) "sid:lpg3um654ckqp7tj7fkr2qs2Zz"(该会话的TTL为一周)
2) "sid:lpg3um654ckqp7tj7fkr2qs2Yy"(该会话的TTL为6天)
3) "sid:g6sftph5dnun5bk6l0hqyyh6p5"(该会话的TTL为5天)
4) "sid:g6sftph5dnun5bk6l0hqyxh6x3"(该会话的TTL为4天)
5) "sid:g6sftph5dnun5bk6l0hqyxh4t1"(该会话的TTL为3.5天)

我知道你可以从命令行为单个键设置TTL,但是你如何为将在一定时间内到期的一批键设置TTL(即TTL少于5天)?运行该命令应该导致删除条目4和5。

点赞
用户1345145
用户1345145
#!/bin/bash
FIVEDAYS=432000

redis-cli KEYS  "*" |
while read LINE;
do TTL=`redis-cli ttl $LINE `;
  if [ $TTL -le $FIVEDAYS ];
      then `redis-cli expire $LINE 5`;
      echo "Deleted $LINE";
  fi;
done;
#!/bin/bash
FIVEDAYS=432000

# 获取所有 Redis 的 Key
redis-cli KEYS "*" |
while read LINE;
do 
  # 获取 Key 的 TTL(剩余生存时间)
  TTL=`redis-cli ttl $LINE `;
  
  # 如果 Key 的 TTL 小于五天,则设置 Key 的过期时间为 5 秒,并打印出被删除的 Key
  if [ $TTL -le $FIVEDAYS ];
      then `redis-cli expire $LINE 5`;
      echo "Deleted $LINE";
  fi;
done;

这是一个 Bash 脚本,实现的功能是删除 Redis 中 TTL(剩余生存时间)小于五天的所有 key。

脚本首先定义了一个变量 FIVEDAYS,表示五天的时间,以秒为单位。接着,脚本使用 redis-cli 命令获取 Redis 中的所有 key,并循环遍历每个 key。

在循环中,脚本使用 redis-cli 命令获取当前 key 的 TTL,如果 TTL 小于五天,则将该 key 的过期时间设置为 5 秒,并输出被删除的 key。

该脚本可以通过 crontab 等工具定期运行,保持 Redis 中的数据不过期。

2014-02-10 22:18:55
用户3160475
用户3160475

以下是一个 Lua 脚本(必须……遵守……标签……),它使用DEL根据您的定义删除s id,尽管我在 KEYS的循环使用处有注释(因为 Lua 脚本是原子性的,所以这里不需要 SCAN,而 DEL 不起作用,因为 SCAN 是随机的),并返回已删除键的名称:

local exp=ARGV[1] * 60 * 60 * 24;
local exs={};
local keys=redis.call('keys', 'sid:*');

for _,v in next,keys,nil do
  local ttl=redis.call('ttl', v);
  if ttl < exp then
    redis.call('del', v);
    exs[#exs + 1] = v;
  end
end

return exs;

注意: 这个脚本使用起来不安全,可能会破坏您的生产实例(更不用提它不是群集安全的);)

2014-02-15 18:01:00