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スクリプトです(必要...尊重... the... tag...) ( KEYSLuaスクリプトはアトミックであるため、私のコメント re. の使用にもかかわらず)はランダムであるため、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 に答える