あまり使わないだろうけど、単体テストで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