2014-02-10 10 views
1

会话被设置为一个哈希:我将使用什么命令过期Redis中拥有不到5天的密钥?在我的分贝

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

+0

这与Lua有什么关系? – lhf

+0

你说得对,我以为我会整合EVAL,但是我的Lua脚本编写不到位,并且对sh进行了解决。谢谢 – asing

回答

1

这里有一个Lua中使用DEL删除的SID(必须... ...荣誉的...标记...)”按照自己的定义S和返回删除按键的名称(尽管我的意见再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; 

注意:这scrip pt是任何安全使用,可能会杀死你的生产实例(更不用说它不是集群安全);)

+0

我不认为它的原子性使得KEYS不可取,这是因为KEYS(正如文档所述)“可能会在被称为大集合的键或元素时阻塞服务器很长时间(甚至几秒)”。在这种情况下,SCAN仍然强烈建议。 – Lyle

+2

由于Lua本身是阻塞的,因此在执行KEYS和循环遍历该脚本内的整个SCAN之间的“阻塞期”方面几乎没有区别。注1:SCAN在这种情况下的优势在于它对RAM的低要求(使用KEYS,直到完成后才存储整个回复)。注2:只有在没有发生写入的情况下,Lua中的SCAN才有可能 - 因为这里的目标是DEL,所以不能使用SCAN。 –

+0

我明白了,谢谢澄清! – Lyle

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; 
+0

Nice.sh - 但是,KEYS是一个你不想在生产中使用的命令。如果你有2.8 - 使用SCAN来代替。 –

+0

真棒谢谢@ItamarHaber! – asing

相关问题