LoginSignup
3
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-06-01

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1