【Redis入門】Ubuntu20.04でRedisの学習(docker)
NoSQL(ノーエスキューエル)の一つであるRedis(レディス)はあまり馴染みがなかったので、使ってみることにしました。UbuntuにRedisをインストールするのは簡単ですが、一時的な検証に留めたいときにもあると思います。Docker imageからRedis環境を構築し、コマンドベースの基本的な使い方を確認しました。(もし、既にローカルにインストール済であれば、Dockerを使う必要はないです。)
目次
テスト環境
- OS:Ubuntu 20.04
- 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型などもありますが)
- string型(単純にkeyと文字列)
- リスト型(配列的な管理)
- ハッシュ型(連想配列)
実行結果
番号の切り替え
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
はじめまして
以上です。