LREMの挙動

挙動というかなんというか……
説明を読んでなかったのでよく理解できていなかったのだけど。


LREMは

> LREM list [-1,0,1] "value"

というふうに使うのだけど、2つ目の引数であるcountの意味がよくわかってなかった。

count > 0 先頭から後方に向かってvalueに一致する要素を1つだけ削除
count < 0 後方から先頭に向かってvalueに一致する要素を1つだけ削除
count = 0 valueに一致する要素をすべて削除

ということになる。(てかLREM – Redisにちゃんと書いてある)


参考として、

> flushdb
OK
> RPUSH aaa 1 2 3 1 2 3
(integer) 6
> LRANGE aaa 0 -1
1) "1"
2) "2"
3) "3"
4) "1"
5) "2"
6) "3"

とかやってからそれぞれ試してみると、以下のような感じ。

count > 0

> LREM aaa 1 "3"
(integer) 1
> LRANGE aaa 0 -1
1) "1"
2) "2"
3) "1"
4) "2"
5) "3"

先頭から後方に向かって検索し、先頭に近い"3"が削除される。

count < 0

> LREM aaa -1 "2"
(integer) 1
> LRANGE aaa 0 -1
1) "1"
2) "2"
3) "1"
4) "3"

後方から先頭に向かって検索し、後方に近い"2"が削除される。

count = 0

> LREM aaa 0 "1"
(integer) 2
> LRANGE aaa 0 -1
1) "2"
2) "3"

"1"に一致するすべての値が削除される。


countの値はindexかなんかだと思ってたので、思ったとおりに削除できないなあと思ってたり。
ドキュメントはちゃんと読みましょうという感じ……