塩焼きブログ

塩焼きに関しての研究内容を公開しています

Redisのsaddで作成したデータに有効期限を付ける

Redisでは有効期限をつけて値を保存できる。これは文字列型の例を書く。

127.0.0.1:6379> SETEX hoge 30 value1
OK
127.0.0.1:6379> keys *
1) "hoge"
127.0.0.1:6379> GET hoge
"value1"
127.0.0.1:6379> TTL hoge
(integer) 13
127.0.0.1:6379> TTL hoge
(integer) 11
127.0.0.1:6379> TTL hoge
(integer) 3
127.0.0.1:6379> TTL hoge
(integer) -2
127.0.0.1:6379> GET hoge
(nil)

さて、一つのキーに対して同時に大量の値を保存できるセット型のSADDというのがある。普通に値を保存するだけの用途では使うことはないが、短い期間に大量の値を保存する時に活躍する。

しかし、SETEXのように有効期限を指定して値を保存するコマンドは存在しない。したがって、このセット型のデータは何らかの削除処理を行わなければ残り続ける。

127.0.0.1:6379> SADD hoge 1
(integer) 1
127.0.0.1:6379> SADD hoge 2
(integer) 1
127.0.0.1:6379> SADD hoge 3
(integer) 1
127.0.0.1:6379> SADD hoge 4
(integer) 1
127.0.0.1:6379> SADD hoge 5
(integer) 1
127.0.0.1:6379> SMEMBERS hoge
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> TTL hoge
(integer) -1
127.0.0.1:6379> SMEMBERS hoge
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379>

SADDでデータを保存する時に有効期限を指定するには、一旦SADDで値を保存してから、全データ型に対応しているEXPIREを使って有効期限を設定することで可能になる。

127.0.0.1:6379> SADD hoge ''
(integer) 1
127.0.0.1:6379> EXPIRE hoge 30
(integer) 1
127.0.0.1:6379> TTL hoge
(integer) 26
127.0.0.1:6379> SADD hoge value1
(integer) 1
127.0.0.1:6379> SADD hoge value2
(integer) 1
127.0.0.1:6379> SADD hoge value3
(integer) 1
127.0.0.1:6379> SMEMBERS hoge
1) "value3"
2) "value1"
3) ""
4) "value2"
127.0.0.1:6379> TTL hoge
(integer) 8
127.0.0.1:6379> TTL hoge
(integer) -2
127.0.0.1:6379> SMEMBERS hoge
(empty list or set)