1

我的数据库中的会话被设置为哈希:

1) "sid:lpg3um654ckqp7tj7fkr2qs2Zz" (this has a ttl of a week)
2) "sid:lpg3um654ckqp7tj7fkr2qs2Yy" (this has a ttl of 6 days)
3) "sid:g6sftph5dnun5bk6l0hqyyh6p5" (this has a ttl of 5 days)
4) "sid:g6sftph5dnun5bk6l0hqyxh6x3" (this has a ttl of 4 days)
5) "sid:g6sftph5dnun5bk6l0hqyxh4t1" (this has a ttl of 3.5 days)

我知道您可以从命令行在单个键上设置 ttl,但是对于将在特定时间段内(即少于 5 天 ttl)到期的一批键,您将如何做到这一点。运行所述命令应导致删除条目 4 和 5。

4

2 回答 2

1

DEL这是根据您的定义用于删除 sid: 的Lua 脚本(必须......尊重......标签......) (尽管我的评论重新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-15T18:01:00.210 回答
1
#!/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;
于 2014-02-10T22:18:55.490 回答