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について
memcachedとRedisの違い
なるほどねー。
Macにmemcachedをインストールし、実行確認する手順
memcachedをbrewインストール
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 Sierraでtelnetを使えるようにする
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
各項目の詳細
データをセット&ゲット
このへんを参考にデータをセットしたりゲットしたりしてみる。
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
キーの削除
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コマンド一覧
NoSQL比較
Redisと違って、永続化もできないし、保存できるデータ構造も文字列しかなさそうなので
他にいろんな用途で使うようなことがあればRedisのほうがいいのかなと思いました。
でもmemcachedはシンプルで分かりやすくていいです。
ちなみにLaravelのセッションドライバーはRedisも選べます。
パート2はLaravel側の設定について書くぜ!
お楽しみにー。