关于现金,我试图简单明了地总结一下
我是在Atrae株式会社担任工程师的中村。这篇文章是Atrae Advent Calendar 2020的第23篇。由于在工作中接触到了缓存,所以我想和大家谈谈关于缓存的事情。
什么是缓存?简便解释一下。
这类似于视频中的截图。
假设有一个连续播放牛丼店情况的直播,如果一直保持LIVE连接,通信会变得很慢。尤其是深夜的画面,仅有关闭的卷帘门,没有太大的变化。这时候就可以利用缓存(屏幕截图),在午夜12点截取画面,并贴上早上6点开店前的截图,这样就不需要一直通过直播来传送视频,通信也会更顺畅。
假設有人通過觀看這個影片,就會根據店內的繁忙程度來吃牛丼。如果這種情況,他們在中午11點30分拍下了現金櫃檯(截圖),然後一直拍下去,那就會有麻煩了。因為中午11點30分和12點30分的繁忙程度完全不同。
在合适的情况下,恰当地运用缓存是非常重要的。接下来将详细解释。
本次的对象
处理Web应用程序层的缓存。
请注意,它与所谓的缓存存储器、浏览器缓存、HTTP缓存、内容分发网络(CDN)中的缓存等上下文中的缓存是不同的。
在Web应用程序中,缓存是什么?
在服务器应该返回的内容
-
- 1次ストレージより高速なストレージに配置しておいてそこから返す
アプリケーションレイヤーでのキャッシュ
もしくは返さない
HTTPレイヤーでのキャッシュ
一定時間ローカルストレージに蓄積してクライアントがアクセスしようとした時に再利用するやつ
适合缓存的数据特性
首先,我想介绍一些作为缓存数据所需具备的特性。
允许删除(数据保存期限)
作为一个重要前提,更希望将数据视为缓存,并允许其消失。由于缓存的特性,保存的数据可能会因以下事件或操作而消失。
-
- キャッシュの有効期限(TTL)が切れる
-
- キャッシュサーバを再起動する
- 無効化(invalidate)された
可能有以下选项:
– 可能会发生此类缓存清除,因此需要重新从数据库中获取值或重新生成缓存。换句话说,需要进行数据生命周期的管理。
– 可能会有以上情况发生,所以需要重新从数据库中获取值或重新生成缓存。换句话说,需要管理数据的生命周期。
这个东西经常被阅读的频率很高。
当然地,将经常被加载的数据缓存起来是有利的。相反,对于读取次数较少的数据,则无法享受到缓存的好处。
换个说法,数据不应该是唯一的。对于被多次调用的冗长数据进行缓存会产生很好的效果。
写入频率较低
如果数据更新频繁,为了保持缓存的一致性就会增加成本。因此,少量更新的静态数据作为缓存数据是有优势的。
为什么要使用缓存?
-
- リクエストを高速に返却するため
UXの向上
高速に返却することでストレスが少なくなりUXがアップする!
時間あたりの処理数を増加させるため
計算機リソースの利用効率上昇(Request Per Secondの増加)
単位時間あたりの処理数増加により一度にたくさんのリクエストを捌ける
特定コンポーネント(SQLなどのRDBMS)の負荷低減のため
システムの安定運用
サーバーからストレージにリクエストがたくさん走って負荷が集中している場合に、キャッシュに逃してあげることで過負荷コンポーネントの負荷を軽減できる
DBからキャッシュをとってくることと、キャッシュからとってくるのは何が違うのか?
たくさんの名前から検索するのではなく、キーバリュー型で引っ張ってこれるので検索負荷がかからない
在什么情况下使用缓存?
无论如何查询速度都很慢。
依赖外部服务
- 外部サービスに都度リクエストを飛ばしていては遅い
缓存架构模式示例
缓存旁置模式
经常使用的最简单的模式
“好处”
シンプルで理解が容易
キャッシュ戦略のなかでも最もシンプルで扱いやすい。そのおかげで参考ドキュメントなども豊富。アーキテクチャに一度でも複雑性を持ち寄ると管理コストが爆発的に大きくなるので、それを最小限に抑えてくれる。
キャッシュとデータベースでデータ構造を変えられる
アプリケーション側でキャッシュとデータベースを区別しなければいけない。これを上手く利用すれば、例えばデータベースに保存している全情報のうちIDだけをキャッシュサーバに保存する、などのデータ構造の応用を効かせることができる。
データをWriteする場合にデータベースに書き込むだけで良い
つまりキャッシュに対するWriteを意識しなくてよいということ。
キャッシュにWriteされるのはキャッシュミスした直後。キャッシュへとWriteしたタイミングで、データを無効化(invalidate)しなければ、取得できるデータの不整合が発生するので注意が必要。
缺点?
Note: The phrase “デメリット” is borrowed from Japanese and generally means “disadvantage” or “drawback.” It does not have a direct translation in Chinese, so the closest counterpart would be “缺点” which carries a similar meaning.
初回のデータ取得が遅い
キャッシュとデータベース両方にアクセスをする必要があるので、初回データの読み込み時は遅くなることが想定される。さらにデータの追加・更新でデータベースにWriteした後に、初めてデータを取得しようとすると必ずキャッシュミスが発生する。
アプリケーション側でキャッシュとデータベースを区別する必要がある
先述の通り、キャッシュとデータベースのうち、どちらから値を取得するかを制御する必要がある。アプリケーションコード内のあらゆる箇所でこの制御を入れようとすれば、あっという間にカオスになる。そのため、データソース層で抽象化するなどして、設計ルールを敷くことが必要。
这种采用具体中间件的方法通常会使用Redis或Memcache等。
缓存存储概述
-
- Redis
-
- memcached
-
- BerkeleyDB
-
- mmap()
- などなど
Redis是什么?
Redis是一种开源的可持久化的内存数据库,以BSD许可证进行公开。Twitter、Github、Pinterest等服务都选择了Redis,以实现大规模数据处理和提高处理速度。
*内存数据库是一种设计用于将数据存储在主存储器(RAM)上的数据库。
由于存储在内存中的数据是易失性的,所以如果重新启动而不进行任何操作,所有数据都会丢失。但Redis在利用内存的同时,还有机制将内存中的数据根据需要存储到磁盘上并保持。
有两种方法:
1. RDB(数据库备份文件)是一种将快照保存为类似于转储文件的方法。它对速度的影响很小,但是使用这种方法无法恢复发生故障前几分钟的数据。
2. 第二种方法是将所有命令记录为AOF(追加文件)的方式。这种方法只丢失发生故障前约1秒钟的数据,但是执行速度显著降低。
优点?
Webアプリケーションの高速化
RedisはインメモリのNoSQLデータベースのため、RDBよりも処理速度が高速。Webアプリケーションのセッションやキャッシュの一時的な保存先に指定することで、アクセス速度が飛躍的に向上する。
アトミック(原子性)
ある操作がアトミックであるとは、複数の操作が全て実行されるかあるいは全く実行されないと保証される性質のこと。実際Redisのコマンド実行もトランザクション(複数の操作をまとめてやるもの)もアトミックなので不整合が生じない。当たり前のように思うかもしれないが、他の多くのキーバリューストアにはトランザクション機能がないのが普通。
データ型のサポート
一般的なキーバリューストアにはデータ型がない。保存したJSONやCSVをアプリケーション側で解釈して使用。しかしRedisには以下のようなデータ型が用意されており、各言語のクライアントで取得したデータはそのまま使用可能。
缺点?
常にメモリを消費する
メモリ上で動作するため常にメモリを消費する。またメモリに乗り切るデータしか扱えないため、大容量のデータを一度に取り扱うような処理はできない。またメモリの断片化の問題もある。大量のデータの書き込み・削除を繰り返すとパフォーマンスが低下する。
データの揮発性
RDB・AOFの2種類の永続化機能があるとはいえ、基本的には揮発性がある。データの消失を許さないシステムではRedisを用いることはできない。
请参考
以下是一种本地的中文译文:
– https://codeahoy.com/2017/08/11/caching-strategies-and-how-to-choose-the-right-one/:缓存策略及如何选择合适的策略
– https://buildersbox.corp-sansan.com/entry/2019/03/25/150000:Web应用缓存技术
– https://www.codementor.io/@meysamsamanpour/caching-in-web-applications-fz1gzizpa:Web应用中的缓存实践
– https://speakerdeck.com/moznion/pattern-and-strategy-of-web-application-caching?slide=148:Web应用缓存的模式和策略
– https://itiskj.hatenablog.com/entry/2017/08/18/000000:了解Redis的使用场景和优势
– https://agency-star.co.jp/column/redis/:Redis入门指南
– https://www.slideshare.net/yujiotani16/redis-76504393:Redis的介绍与实践
– http://ccs-tech-blog.blogspot.com/2017/05/redis.html:Redis缓存的基本概念和用法