nanisore oishisou

Webエンジニアあるまさんのゆるふわ奮闘記。

Laravel5.6のセッション管理をmemcachedでやる手順(1)

おっす、おらベル子。久しぶりのブログだぜっ!

最近、忙しくてイラストもまともに描けなくてストレスが溜まってるぜっ!
その代わり踊ってるんですが、踊りとイラストはまた別物なので、イラストを描く一人の時間がとにかく欲しいです。

昔から、好きなことに一人で没頭する時間がないと、快適に暮らしていてもストレスが徐々に溜まってきてしまうんですよね。

とにかく一人の時間を少し作って絵を描きたいです。

ということで本題です。

Laravel5.6のセッション管理をmemcachedでやりたい人向けの記事です。

memcached、何それ美味しいの?」な人から手順どおりやれば、Laravelのセッションドライバーをmemcachedでやれるようになります。

具体的にどういうときにmemcached使ったほうがいいのかというと、
Webサーバ2台構成とかでセッションを共有しないといけないなどの際に
ローカルストレージのfileじゃセッションの共有ができないので、 memcachedでやるとかそういう感じです。

キーと値のペアをメモリ上に保持するKVSの一種でRedisのお友達なので、
memcachedじゃなくてRedisでもいいです。

というかむしろ特別な理由がなければRedisでもいい気がしました。

まず、パート1ではmemcachedとは何かと基本的な使い方を学び、Macローカルにmemcachedをインストールします。

memcachedについて

gihyo.jp

memcachedとRedisの違い

yakst.com

qiita.com

post.simplie.jp

なるほどねー。

Macmemcachedをインストールし、実行確認する手順

memcachedbrewインストール

brew install memcached
which memcached

自動起動させるコマンドと、起動コマンドを案内してくれた。 brewでインストールしたので以下のフルパスじゃなくてmemcachedって打てば使えそう。

To have launchd start memcached now and restart at login:
  brew services start memcached
Or, if you don't want/need a background service you can just run:
  /usr/local/opt/memcached/bin/memcached

macOS High Sierratelnetを使えるようにする

https://qiita.com/samuraidays/items/b8a3d4a06e2c6c379865

brew install telnet

memcachedの起動オプション

オプション 説明
-p 利用するTCPのポート。デフォルトは11211
-m 最大のメモリーサイズ。デフォルトは64MB
-vv very verboseモードで起動してデバックメッセージやエラーをコンソールへ出力
-d memcachedをデーモンとしてバックグラウンドで起動
-h ヘルプを表示

telnet で接続

[~] telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.

バージョンの確認

version
VERSION 1.5.8

ステータスの確認

stats
STAT pid 3684
STAT uptime 96
STAT time 1529014973
STAT version 1.5.8
STAT libevent 2.1.8-stable
STAT pointer_size 64
STAT rusage_user 0.020749
STAT rusage_system 0.016610
STAT max_connections 1024
STAT curr_connections 2
STAT total_connections 3
STAT rejected_connections 0
STAT connection_structures 3
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
STAT get_misses 0
STAT get_expired 0
STAT get_flushed 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 16
STAT bytes_written 15
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT time_in_listen_disabled_us 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT slab_reassign_rescues 0
STAT slab_reassign_chunk_rescues 0
STAT slab_reassign_evictions_nomem 0
STAT slab_reassign_inline_reclaim 0
STAT slab_reassign_busy_items 0
STAT slab_reassign_busy_deletes 0
STAT slab_reassign_running 0
STAT slabs_moved 0
STAT lru_crawler_running 0
STAT lru_crawler_starts 510
STAT lru_maintainer_juggles 145
STAT malloc_fails 0
STAT log_worker_dropped 0
STAT log_worker_written 0
STAT log_watcher_skipped 0
STAT log_watcher_sent 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT slab_global_page_pool 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evicted_active 0
STAT evictions 0
STAT reclaimed 0
STAT crawler_reclaimed 0
STAT crawler_items_checked 0
STAT lrutail_reflocked 0
STAT moves_to_cold 0
STAT moves_to_warm 0
STAT moves_within_lru 0
STAT direct_reclaims 0
STAT lru_bumps_dropped 0
END

各項目の詳細

tetsuyai.hatenablog.com

データをセット&ゲット

このへんを参考にデータをセットしたりゲットしたりしてみる。

kakakakakku.hatenablog.com

morizyun.github.io

set

# set key flags expiretime bytes
set hoge 0 0 4
# value
huga
STORED

保存するbyte数が間違ってるとエラーが返ってくる

set hoge 0 0 4
laravel
CLIENT_ERROR bad data chunk
ERROR

get

get hoge
VALUE hoge 0 4
huga
END

ありもしないkeyを指定するとエラーは返ってこず、ただ終わる

get hogege
END

なるほど、難しいことは何もない。 Redisと変わらなそう。

インクリメントとかデクリメントとか、コマンド間違えてみたりとか

set count 0 0 1
1
STORED
get count
VALUE count 0 1
1
END
incr count 1
2
get count
VALUE count 0 1
2
END
decr count 1
1
get count
VALUE count 0 1
1
END
incr count 2
3
get count
VALUE count 0 1
3
END

ありもしないキーを指定

decr count3
ERROR

存在しないコマンドを唱える

dect count 3
ERROR

なるほど、Redisと一緒ですね。

保存しているキーの一覧を表示

stats itemsと打って、items:{m}:number {n}みたいな行を探し、 stats cachedump {m} {n}みたいに打つと、キーの一覧を表示できる。

stats items
STAT items:1:number 2
STAT items:1:number_hot 0
STAT items:1:number_warm 0
STAT items:1:number_cold 2
STAT items:1:age_hot 0
STAT items:1:age_warm 0
STAT items:1:age 572
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
STAT items:1:evicted_active 0
STAT items:1:crawler_reclaimed 0
STAT items:1:crawler_items_checked 6
STAT items:1:lrutail_reflocked 0
STAT items:1:moves_to_cold 7
STAT items:1:moves_to_warm 5
STAT items:1:moves_within_lru 0
STAT items:1:direct_reclaims 0
STAT items:1:hits_to_hot 0
STAT items:1:hits_to_warm 0
STAT items:1:hits_to_cold 7
STAT items:1:hits_to_temp 0
END
stats cachedump 1 2
ITEM count [1 b; 0 s]
ITEM hoge [4 b; 0 s]
END

mitsuakikawamorita.com

キーの削除

delete hoge
DELETED
stats items
STAT items:1:number 1
.
.
END
stats cachedump 1 1
ITEM count [1 b; 0 s]
END

有効期限付きでセット

set some_id 0 10 1
1
STORED

速攻唱えると参照できるが

get some_id
VALUE some_id 0 1
1
END

10秒後に唱えると消えている。

get some_id
END

儚い。

telnetを終了する

^C^]
telnet>  q
Connection closed.

memcachedコマンド一覧

l-w-i.net

NoSQL比較

qiita.com

Redisと違って、永続化もできないし、保存できるデータ構造も文字列しかなさそうなので
他にいろんな用途で使うようなことがあればRedisのほうがいいのかなと思いました。
でもmemcachedはシンプルで分かりやすくていいです。

ちなみにLaravelのセッションドライバーはRedisも選べます。

パート2はLaravel側の設定について書くぜ!
お楽しみにー。