RedisのHASH、SET、ZSET 型で、要素数が0になると、キーそのものが削除されるので、注意した方が良い


あまり使わないだろうけど、単体テストでZSETに対してEXISTSを使っていたら、思ってたのと違う挙動した。

概要

メンバー数が0になると、キー自体が削除されるっぽい。

PHPでいえば、以下のような挙動をする。

<?php
$set[] = 'a';
array_pop($set);
var_dump($set);
  // PHPならarray(0) だが、
  // Redisだと"Undefined variable"になる。

検証

Hash

127.0.0.1:6379[255]> FLUSHALL
OK
127.0.0.1:6379[255]> HSET myh a aa
(integer) 1
127.0.0.1:6379[255]> HGETALL myh
1) "a"
2) "aa"
127.0.0.1:6379[255]> GET myh
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379[255]> EXISTS myh
(integer) 1

127.0.0.1:6379[255]> HDEL myh a
(integer) 1
127.0.0.1:6379[255]> HGETALL myh
(empty list or set)
127.0.0.1:6379[255]> GET myh
(nil)
127.0.0.1:6379[255]> EXISTS myh
(integer) 0

Set

127.0.0.1:6379[255]> SADD mys a
(integer) 1
127.0.0.1:6379[255]> SMEMBERS mys
1) "a"
127.0.0.1:6379[255]> GET mys
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379[255]> EXISTS mys
(integer) 1

127.0.0.1:6379[255]> SREM mys a
(integer) 1
127.0.0.1:6379[255]> SMEMBERS mys
(empty list or set)
127.0.0.1:6379[255]> GET mys
(nil)
127.0.0.1:6379[255]> EXISTS mys
(integer) 0

Sorted Set

127.0.0.1:6379[255]> ZADD myz 0 a
(integer) 1
127.0.0.1:6379[255]> ZRANGE myz 0 -1 withscores
1) "a"
2) "0"
127.0.0.1:6379[255]> GET myz
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379[255]> EXISTS myz
(integer) 1

127.0.0.1:6379[255]> ZREM myz a
(integer) 1
127.0.0.1:6379[255]> ZRANGE myz 0 -1 withscores
(empty list or set)
127.0.0.1:6379[255]> GET myz
(nil)
127.0.0.1:6379[255]> EXISTS myz
(integer) 0