redis - 缓存方案如何设计才能切合业务需求?
高洛峰
高洛峰 2017-04-24 09:13:06
0
3
728

缓存算是各个网站、服务的标配了,如何才能设计出一套切合实际需求的缓存方案,每个接触过缓存的Coder脑子里都会有自己的答案。
**缓存模块从无到有,要如何设计?
要考虑哪些因素?
如何方式设计不足?
如何防止设计过度?
如何满足实际需求?
要明确哪些问题,才能逐步的完善出一套实现方案?**
小弟才疏学浅,希望哪位高人能提点一二,不胜感激。

================都焦了,不如割了吧=====================
我的需求:
快,一些记录后就不会变(很少变),但每次都用的信息,每次读DB开销太大。

(Redis的掌握水平只有初级,后面会抓时间恶补)
自己设计:
0、要考虑到 缓存超时、命中率,按需求,逐级增加缓存级别;
1、(一级缓存)第一期,做本地内存级别的缓存,直接从内存中读取,如果没有,再读DB,同时更新缓存对象(DB中用View来提高查询速度);
2、(二级缓存)第二期,后期RQ增加到一定量,会需要Load Balance,此时会考虑使用Redis或Memcache方案作为二级缓存;当一级缓存未中,则读取二级缓存,扔未中,则查询数据库(将存在的数据,反向全部更新)

问题:
1、如果记录到DB中,配置参数不是单纯的key-value形式,也有查询匹配工作;并且随着业务复杂度提升,还会有其他数据需要缓存。
2、如果记录到NoSQL/Redis中,如Redis,其数据存储,是不是只能用于“灾备”,还是可以使用Redis的数据存储,抛弃DB
3、对Redis的写操作,能否直接记录到存储上? 因为那些需要缓存的数据,有些是需要手动录入的。

担忧:
第二期时,设计一级、二级缓存是否多余?主要是考虑 读取Redis中的缓存信息会涉及到网络传输

方案:
A、使用一级、二级缓存方案,但分布式部署后,一级缓存中的数据是否超时无法准确判断;
B、放弃一级缓存,直接读取Redis(不知道读取Redis的开销与直接读内存的开销,哪个高。而且一级不命中,再去二级中读,反而绕远)

自问自答:
放弃方案A,因为,虽然直接读本地内存,效率高,但是命中率不好说;
使用方案B,虽然有了网络传输的损耗,但后续的第三期、第四期。。甚至会需要Redis配置主从或分片,这时之前所担心的网络损耗根本不算什么。

以上就是 我的思路,不知道是否可行,还有哪些未考虑到的。因为第一期和第二期间隔的时间可能不会太久,所以最好能在一开始的设计上就要考虑周全些。

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(3)
伊谢尔伦

1. 適切なキャッシュのみを実行してください
目的のためだけにテクノロジーを使用しないでください

いいねを押す +0
Ty80

私の Redis の使用法について話しましょう
1. まず、静的データ (つまり、変更されない、またはほとんど変更されない) をキャッシュするために、第 1 レベルを挿入する必要はありません。キャッシュ。キャッシュ クエリが複雑になります。
2. 問題は、Redis を使用して変数データをキャッシュする、つまりデータを変更する必要があるということです。現時点では、Redis は DB のストレージの役割、つまり最終データを完全に置き換えることができないためです。永続化のために DB に入力する必要がありますが、これには Redis と DB 間の同期の問題が伴います。プロジェクトにおける私の解決策は、キャッシュされたデータの一貫性要件が非常に厳しいため、最初に Redis を変更し、次に DB を非同期に変更し、最後に DB を Redis に同期することです。
3. プロジェクトでは、キーに基づいてハッシュ データがクエリされますが、リクエストごとに Redis から同じキーを複数回取得するために、リクエストはハッシュ内のキー データの一部を個別にリクエストします。メモリ キャッシュが導入されています。これは、Redis へのアクセス数を減らすことを目的としています。ただし、この一次キャッシュの主な目的は、同じキーに対する複数のリクエストをマージすることです。結局のところ、最終キャッシュは Redis に基づいている必要があります。

いいねを押す +0
迷茫

1. 自分でメモリにキャッシュしないで、memcache または redis を直接使用してください。
CPU には複数のコアがあり、1 つのコアに 1 つのワーカーがあり、メモリは共有されません。8 つのコアがあり、アプリケーション内でキャッシュする場合、8 つのキャッシュがあることと同じになります。もちろん共有メモリを使用することもできますが、複数のワーカーの対話に対処する必要があります。したがって、memcache と redis にそれを実行させます。
2. ネットワーク遅延は非常に小さいため、http 応答時間は無視できます (通常は 0.1 ミリ秒未満です)。
3. 十分でない場合は、マルチレベル キャッシュを使用しないでください。
4. キャッシュのみ、つまり書き込み時にのみデータベースに書き込み、その後、対応する memcache キャッシュを削除します。読み取り時には、最初に memcache に移動し、失敗した場合はデータベースに移動してから、memcache に書き込みます。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート