Ruby on RailsでRedisのLIST操作

RailsでRedisのLIST型操作のコード例が見当たらなかったので備忘録

rpush, lpush で追加

lrange で取得

lrem, rpop, lpop で削除

 

ドキュメントhttps://www.rubydoc.info/github/redis/redis-rb/Redis

 

前提

Gemfileに追記

gem 'redis'

予めRedisインスタンスをnewしておく

REDIS = Redis.new

 

rpushで追加
REDIS.rpush("hogelist", "item-a")
>["item-a"]

REDIS.rpush("hogelist", "item-b")
REDIS.rpush("hogelist", "item-c")
>["item-a", "item-b", "item-c"]

 

配列でまとめて追加もできる

REDIS.rpush("hogelist", ["item-d","item-d","item-d"])
>["item-a", "item-b", "item-c", "item-d", "item-d", "item-d"]

 

lpushで先頭に追加できる

REDIS.lpush("hogelist", "item-X")
REDIS.lpush("hogelist", ["item-Y","item-Y"])
>["item-Y", "item-Y", "item-X", "item-a", "item-b", "item-c", "item-d", "item-d", "item-d"]

 

lrangeで取得

REDIS.lrange("hogelist", 0, -1)
>["item-Y", "item-Y", "item-X", "item-a", "item-b", "item-c", "item-d", "item-d", "item-d"]

 

第二、第三引数で配列インデックスを指定することで部分取得できる。
REDIS.lrange("hogelist", 0, 0)
>["item-Y"]

REDIS.lrange("hogelist", 0, 3)
>["item-Y", "item-Y", "item-X", "item-a"]

REDIS.lrange("hogelist", 3, 3)
>["item-a"]

※インデックスが不正だと空になる
REDIS.lrange("hogelist", 3, 2)
>

 

※通常のgetだとエラーになる

REDIS.get("hogelist")

f:id:ikasekai:20211217225056p:plain

 

削除

delでLIST全削除

REDIS.del("hogelist")
>

 

部分削除

元:["item-Z", "item-Y", "item-Y", "item-X", "item-a", "item-Z", "item-b", "item-c", "item-d", "item-d", "item-d", "item-Z"]から

 

値を指定して削除

REDIS.lrem("hogelist", 0, "item-Z")
>["item-Y", "item-Y", "item-X", "item-a", "item-b", "item-c", "item-d", "item-d", "item-d"]

 

第二引数で削除数を指定 ※上のように0で全部

REDIS.lrem("hogelist", 2, "item-d")
>["item-Y", "item-Y", "item-X", "item-a", "item-b", "item-c", "item-d"]

※実際にある数より多くてもエラーにはならない
REDIS.lrem("hogelist", 3, "item-b")
>["item-Y", "item-Y", "item-X", "item-a", "item-c", "item-d", "item-d", "item-d"]

 

rpopで末尾削除

REDIS.rpop("hogelist")
>["item-Y", "item-Y", "item-X", "item-a", "item-c", "item-d", "item-d"]

 

lpopで先頭削除

REDIS.lpop("hogelist")
>["item-Y", "item-X", "item-a", "item-c", "item-d", "item-d"]