【Redis入門】Ubuntu20.04でRedisの学習(docker)

NoSQL(ノーエスキューエル)の一つであるRedis(レディス)はあまり馴染みがなかったので、使ってみることにしました。UbuntuにRedisをインストールするのは簡単ですが、一時的な検証に留めたいときにもあると思います。Docker imageからRedis環境を構築し、コマンドベースの基本的な使い方を確認しました。(もし、既にローカルにインストール済であれば、Dockerを使う必要はないです。)

テスト環境

  1. OS:Ubuntu 20.04
  2. Redis:v7.4

Redisとは

RedisとはREmote DIctionary Serverの略で、オープンソースのインメモリーで動作する高速なNoSQLキー/値ストアです。メモリ上で動作しますので非常に高速ですが、大規模なデータ処理には不向きです。

RDBなどで云うところのデータベースはなく、0から15までの番号で管理されています。Redisに接続してもuse <database名>; は使わず、select <番号>で保存先を決めます。デフォルトは0になっています。

環境構築

ローカル環境にインストールするなら、sudo apt install redis-serverで可能です。ですが、ここでは試しにdocker環境を使います。

docker-compose.yml

bitnami/redis(redis:7.4)を使わせて頂きました。

version: '2'

services:
  redis:
    image: docker.io/bitnami/redis:7.4
    environment:
      # ALLOW_EMPTY_PASSWORD is recommended only for development.
      - ALLOW_EMPTY_PASSWORD=yes
      - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL
    ports:
      - '6379:6379' # ローカル環境にインストールされていない前提。
    volumes:
      - redis_data:/bitnami/redis/data

volumes:
  redis_data:
    driver: local

起動は、このファイルが置いてあるフォルダに移動して、そこから

sudo docker-compose up -d

としてコンテナを作成し起動します。2回めから停止/再起動は次のようにします。

# 停止
sudo docker-compose stop

# 再起動
sudo docker-compose start

ローカル環境のターミナルから使う

ローカル環境にredis-serverがインストールされていない前提ですので、portの6379は同じにして大丈夫です。ターミナルから使用するにはredis-cliコマンドを使いますが、最初は「コマンド 'redis-cli' が見つかりません。」のエラーが出ると思いますので、sudo apt install redis-cli でインストールしてください。

redis-cli
127.0.0.1:6379>   # ⬅となれば成功です。
動作確認

ここで確認したデータ構造(他にsets型(集合型)やsorted sets型などもありますが)

  1. string型(単純にkeyと文字列)
  2. リスト型(配列的な管理)
  3. ハッシュ型(連想配列)

実行結果

番号の切り替え

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 10
OK
127.0.0.1:6379[10]>

string型

127.0.0.1:6379> set name 'TARO'
OK
127.0.0.1:6379> get name
"TARO"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> mset name 'taro' age 23  # 複数セット
OK
127.0.0.1:6379> get name
1) "taro"
127.0.0.1:6379> get age
"23"
127.0.0.1:6379> del name age  # 複数削除
(integer) 2
  • set key <文字列> で保存
  • 複数一度に保存もできて、
    mset key1 <文字列1> key2 <文字列2> ...と書く
  • get key で値取得
  • del key で削除
  • 複数一度に削除する場合は
    del key1 key2 ...

リスト型

一つのkeyで複数のvalueが配列のように管理されていますが、左から右に向かって一列に並んでいるイメージです。

l(eft)push , l(eft)pop ▶ 左からpushしたりpopしたりします。
r(ight)push , r(ight)pop ▶右からpushしたりpopしたりします。

【注意】コマンドのlやrはleftやrightの略でlistの略ではありません。

127.0.0.1:6379> lpush myLang 'Python'
(integer) 1

この段階ではmyLangには"Python"のみ格納。

127.0.0.1:6379> rpush myLang 'JavaScript'
(integer) 2
127.0.0.1:6379> rpush myLang 'Ruby'
(integer) 3

この段階では["Python","JavaScript","Ruby"]が格納されています。

127.0.0.1:6379> lrange myLang 0 -1 # 最初から最後まで
1) "Python"
2) "JavaScript"
3) "Ruby"

lrange myLang 0 -1で保存された全ての値を確認します。

127.0.0.1:6379> llen myLang
(integer) 3   # 大きさは3
127.0.0.1:6379> lpop myLang
"Python"   # 左から"Python"を取り出すとリストから消えます。
127.0.0.1:6379> lrange myLang 0 -1 # 最初から最後まで値を確認
1) "JavaScript"
2) "Ruby"

この段階では最後に["JavaScript","Ruby"]のみが残ります。

Hash型(連想配列型)

h(ash)set: hset key field value ▶ keyにfieldとvalueをセットします。
h(ash)m(uluti)set: hmset key field value [field value …]▶ keyにfieldとvalueのペアを複数同時にセットします。

hgetall key ▶ fieldとvalueのペアを全て取得します。

127.0.0.1:6379> hset myuser name 'Taro'
(integer) 1
127.0.0.1:6379> hmset myuser email 'taro@exsample.com' age 33
OK
127.0.0.1:6379> hget myuser email
"taro@exsample.com"
127.0.0.1:6379> hgetall myuser
1) "name"
2) "Taro"
3) "email"
4) "taro@exsample.com"
5) "age"
6) "33"

インメモリで動作しますので、途中のデータは消えてしまいそうですが、短い期間で保存していますので意外と安心して使えます。

全削除と終了

del key* でも消えず、 hgetall key*で思い当たる"keyなんちゃら"だったかなぁ?と考えながら探しても見付からないときがあります。その場合はkeys * で全てのkeyを探してから不要なデータを削除してください。

# 全てのkeyを取得(※何かしらデータが残っているとき)
127.0.0.1:6379> keys *
1) "post:undefined" # これを消したいとき
2) "myLang"
# 削除
127.0.0.1:6379> del post:undefined
(integer) 1

# 終了(抜ける)
127.0.0.1:6379> exit
日本語で起動

--raw オプションを付けて起動する。環境によっては文字化けするかもしれませんが、自分の環境では上手くいきました。

日本語オプションで起動

$ redis-cli --raw
127.0.0.1:6379> set name 'はじめまして'
OK
127.0.0.1:6379> get name
はじめまして

以上です。

Follow me!