Memcached的概述和操作确认

首先

在实习期间,我有机会接触到Memcached,于是我开始调查它是什么东西。
关于Memcached有许多优秀的文章,我参考了它们并整理成了篇幅比较长的引用。

memcached是什么?

因为有一篇非常易懂的文章,因此我将引用它。

Memcached是一种高性能的分布式内存缓存服务器。通过临时缓存数据库查询结果,可以减少对数据库的访问次数,进而提高动态网络应用的速度和可伸缩性。

引入的方式

参考资料:在Mac上安装memcached的步骤 – Qiita

安装

# brewでmemcachedをインストール
$ brew install memcached

守护进程自动启动设置

创建符号链接,并设置为定期在launchctl中执行。

# シンボリックリンクの作成
$ ln -sfv /usr/local/opt/memcached/*.plist ~/Library/LaunchAgents

# 定期的にスクリプトを実行する設定
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.memcached.plist

确认动作

0. 前提知識

memcachedがどのような仕組みで値を格納しているのかのイメージを持っていないと、これからのコマンド操作などが理解しづらいと思いました。
とてもいい記事を見つけたので、引用させていただきます。

memcachedはSlabAllocatorという構造でデータを格納している。SlabAllocatorは、メモリを最初からある程度の量確保しておき、その確保したメモリを一定サイズの塊に分割してフラグメンテーションが起こらないようにした構造。memcachedはchunkという小さなメモリ領域に値を保存する。このchunkは決まったサイズので、chunkのサイズは複数ある。同一サイズのchunkをまとめたものがSlabと呼ばれる。memcachedはまずメモリをPageという単位で分割する。このPageはデフォルトで1MB。そのPageのなかにそれぞれのSlabが入り、Slabの中にはSlab固有のchunksizeのchunkたちが入っているという構造になっている。
引用元:キー一覧を見るためにmemcached入門

つまり、chunkというさまざまな大きさがある最小単位の入れ物があって、そのchunkを大きさごとにまとめたものがSlabっていうことみたいだ。格納する値の大きさによって使うchunkが変わってくるみたいです。

1. 确认进程是否已启动

参考资料:在Mac上安装memcached的步骤 – Qiita

# デーモンの自動起動設定をしたため、ずっと動いているはず。以下のような出力されればOK
$ ps aux | grep memcached
username      93162   0.0  0.0  4962944    668   ??  S    水06PM   0:01.21 /usr/local/opt/memcached/bin/memcached -l localhost
username       5111   0.0  0.0  4427068    828 s000  S+   10:36AM   0:00.00 grep memcached

2. 确认是否可以实际使用memcached。

参考资料:浏览Rails中使用Memcached的同时窥探其实质-株式会社ランチェスター

rails consoleでmemcacheにアクセスするためのインスタンスを作る

[1] pry(main)> a = ActiveSupport::Cache::MemCacheStore.new('localhost:11211', expires_in: 60, namespace: 'NS_ABC', compress: true)
=> #<ActiveSupport::Cache::MemCacheStore:0x007f9e886df938
 @data=#<Dalli::Client:0x007f9e886df690 @options={}, @ring=nil, @servers=["localhost:11211"]>,
 @options={:expires_in=>60, :namespace=>"NS_ABC", :compress=>true}>

引数で渡しているもの

    • localhost:11211 > ポート番号の指定

 

    • expires_in: 60 > 時間の指定

 

    • namespace: ‘NS_ABC’ > タグと認識している

 

    compress: true > compressにtrueを指定した時は、データ容量が特定の閾値(compress_thresholdで指定も可能)を超えた際に圧縮するという設定のよう

データをキャッシュさせたり取り出したりする

# キャッシュ
[3] pry(main)> a.write('key', 'val')
=> 5044031582654955520

# 取り出し
[4] pry(main)> a.read('key')
=> "val"

用telnet连接到memcached,并确认实际上是否存储了值。

# telnetでmemcachedに接続する
$ telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.

まずはstats itemsでSlabの一覧を確認する。

stats items
STAT items:1:number 4
STAT items:1:number_hot 0
STAT items:1:number_warm 1
STAT items:1:number_cold 3
・
・
・
END

先程格納した値がどのSlabに格納されているかはstats cachedump [Slabの番号] [取得する要素数]で1つ1つ中身を確認していく。

#1つ1つのSlabを確認する stats cachedump [Slabの番号] [取得する要素数]
stats cachedump 1 100
stats cachedump 2 100
stats cachedump 3 100
・
・
・
stats cachedump 4 100
ITEM NS_ABC:key [102 b; 1638165259 s]
END

Slab番号4のところに、先程格納したものが[namespace]:[key]というファーマットで格納されていることがわかります。
get <キー>で値を確認してみましょう。

get NS_ABC:key
VALUE NS_ABC:key 1 102
o: ActiveSupport::Cache::Entr:
                              @valueIval:ET:@created_atf1638164899.004805:@expires_in6e1
END

我不太了解出现的值,但这是一个经过序列化的存储值。

したがって、ActiveSupport::Cache::Entryにデータを詰め込んでシリアライズをすると、同じようなものが作れます。rails consoleの方で値(val)をシリアライズしてみましょう。シリアライズはMarshalというクラスを使うのがスタンダードらしいです。

[32] pry(main)> b = ActiveSupport::Cache::Entry.new('val', expires_in: 60)
=> #<ActiveSupport::Cache::Entry:0x007f8ee9c7e758 @created_at=1638165624.288047, @expires_in=60.0, @value="val">

# Marshalというクラスを使ってシリアライズする
[33] pry(main)> puts Marshal.dump(b)                                                                                                 o: ActiveSupport::Cache::Entr:
                             @valueIval:ET:@created_atf1638165624.288047:@expires_in6e1
=> nil

可以通过key/val确切地确定值被储存在memcached中,并且与memcached输出的内容相同。

可以在Memcached中存储数据,并通过Rails控制台进行确认的逆向操作。

# 値を入れる set <キー> <フラグ> <有効期間> <サイズ>
set NS_ABC:hoge 0 60 8
hogehoge
STORED


# 値をmemcached側で確認してみる get <キー>
get NS_ABC:hoge
VALUE NS_ABC:hoge 0 8
hogehoge
END

我发现它们已经被有效地储存。
看起来,实例和命名空间是对应的。

而且,还可以在正在运行的应用程序控制台上进行确认。

Cache read: "namespace"
Cache fetch_hit: "namespace"

casheが利用される時は、上記にあるように、fetch_hitと出力されます。
cacheはconfig/environments/development.rbでmemcachedが設定されています。

最后

今回はローカル上での簡単な動作確認を行いました。速度改善などに役立ってくる機能なので、今後は実際の開発現場での活用法などをまとめていけたらと思います。至らない点が多くあると思うので、ご指摘などございましたらご教授いただけると幸いです。
最後まで読んでいただき、ありがとうございました。

参考にさせていただいた資料一覧

第1回:探索memcached的基础知识:了解memcached的方方面面
第2回:理解memcached的内存存储机制
在Mac上安装memcached的步骤- Qiita
入门使用memcached以查看键列表 – tumblr
从Rails中使用Memcached并窥探其实质- 株式会社ランチェスター

广告
将在 10 秒后关闭
bannerAds