Redisについて

Redisについてお話ししたいと思います。

Redisとは

メモリ上にKVS(Key Value Store)を保存できるようにするソフトウェアです。

  • インメモリ型データベース
    • メモリ上にデータをすべて持ち、ディスクから取り出すよりも高速処理が可能になる
  • データを永続化する
  • データ構造サーバー
    • String型, List型, Set型, SortedSet型, Hash型のデータ構造を持つことができる

公式サイト

Redis

データ型について

  • String型
    • 個々の要素を保存
  • List型
    • 順番に並べた複数の要素 ex: 時系列用のデータ
  • Set型
    • 順不同の複数の要素。重複を許さない ex: タグ
  • SortSet型
    • Setの特徴を持ちつつ、個々の要素にScore付けをする ex: ランキング機能
  • Hash型

起動方法

redis-server

# 別のconsole画面を開く
redis-cli

これでコマンドライン上から操作できるようになります。

String型の操作

String型は単純なkey, valueを保存するものになります。

set

key, valueの値を設定する

127.0.0.1:6379> set foo bar

127.0.0.1:6379> keys *
1) "foo"

get

keyを指定して、valueの値を取得します。

127.0.0.1:6379> get foo
=>bar

del

keyを指定して、 key, valueを削除します。

127.0.0.1:6379> del foo
=>1

127.0.0.1:6379> keys *

List型

(l/r)push

lは先頭に追加で、rは末尾に追加されます。

127.0.0.1:6379> rpush number 1
(integer) 1
127.0.0.1:6379> rpush number 2
(integer) 2
127.0.0.1:6379> rpush number 3
(integer) 3
127.0.0.1:6379> rpush number 4
(integer) 4
127.0.0.1:6379> rpush number 5
(integer) 5

(l/r)pop

lは先頭を削除で、rは末尾を削除します。

127.0.0.1:6379> rpop number
"5"
127.0.0.1:6379> lpop number
"1"

lrange

lrangeでList型の値を取得します。 lはList型のlを表しています。

127.0.0.1:6379> lrange number 0(start) -1(end)
1) "2"
2) "3"
3) "4"

lindex

特定の位置の値を取得

127.0.0.1:6379> lindex number 2
"4"
127.0.0.1:6379> lindex number 0
"2"

llen

要素の数を取得

127.0.0.1:6379> llen number
(integer) 3

ltrim

指定した位置以外の値を削除する

127.0.0.1:6379> ltrim number 0 1
OK
127.0.0.1:6379> lrange number 0 -1
1) "2"
2) "3"

Set型

sadd

Set型の値を設定していく

127.0.0.1:6379> sadd member foo bar baz
(integer) 3
127.0.0.1:6379> sadd member bob
(integer) 1
127.0.0.1:6379> sadd member2 abc def ghi
(integer) 3
127.0.0.1:6379> sadd member2 foo bar
(integer) 2

srem

Set型の値を削除する

127.0.0.1:6379> srem member bob
(integer) 1

smembers

Set型の値を取得する

127.0.0.1:6379> smembers member
1) "foo"
2) "bar"
3) "baz"

sunion

和集合

127.0.0.1:6379> sunion member member2
1) "baz"
2) "foo"
3) "bar"
4) "def"
5) "abc"
6) "ghi"

sinter

積集合

127.0.0.1:6379> sinter member member2
1) "foo"
2) "bar"

sdiff

差集合

127.0.0.1:6379> sdiff member member2
1) "baz"

SortSet

zadd

SortSet型の値を設定する

127.0.0.1:6379> zadd score 22 mikami 50 yagami 80 yasuda 21 akashi
(integer) 4
127.0.0.1:6379> zadd score 99 hoge
(integer) 1

zrem

SortSet型の値を削除する

127.0.0.1:6379> zrem score hoge
(integer) 1

zrange

SortSet型の値を取得する(取得方法はList型と同じ)

127.0.0.1:6379> zrange score 0 -1
1) "akashi"
2) "mikami"
3) "yagami"
4) "yasuda"

## revで反対の順番にする
127.0.0.1:6379> zrevrange score 0 -1
1) "yasuda"
2) "yagami"
3) "mikami"
4) "akashi"

zrank

順番を知る

127.0.0.1:6379> zrank score yasuda
(integer) 3

## revで反対の順番にする
127.0.0.1:6379> zrevrank score yasuda
(integer) 0

Hash型

hset

Hash型の値を設定する

127.0.0.1:6379> hset user name mikami
(integer) 1
## hmsetで複数の値を設定
127.0.0.1:6379> hmset user email foo@foo.com score 100
OK

hget

Hash型の設定を取得する

127.0.0.1:6379> hmget user name email score
1) "mikami"
2) "foo@foo.com"
3) "100"

hlen

Hash型の値の数を取得する

127.0.0.1:6379> hlen user
(integer) 3

hkeys

Hash型のkeyを全て取得する

127.0.0.1:6379> hkeys user
1) "name"
2) "email"
3) "score"

hvalues

Hash型のvalueを全て取得する

127.0.0.1:6379> hvals user
1) "mikami"
2) "foo@foo.com"
3) "100"

hgetall

全ての値を取得する

127.0.0.1:6379> hgetall user
1) "name"
2) "mikami"
3) "email"
4) "foo@foo.com"
5) "score"
6) "100"

まとめ

概要と簡単な使い方の説明になりました。 高速に値を取得するので、一部の場所に使用することができます。 基本的にはデータを永続化する仕組みが整っているとはいえ、ストレージとして利用されるのはおかしいと思っています。 expiresで期限を設定できるので、期限を設定して適切な値保持にしましょう。