缓存设计(cache-design)

分布式缓存设计

目前常见的缓存方案都是分层缓存,通常可以分为以下几层:

1.1NG本地缓存,命中的话直接返回

1.2 NG没有命中时则需要查询分布式缓存,如redis

1.3 如果分布式缓存没有命中则需要回源到Tomcat在本地堆进行查询,命中之后异步写回redis

1.4以上都没有命中那就只有从DB或者是数据源进行查询,并写回到redis

缓存更新原子性

在写回到redis的时候如果是Tomcat集群, 多个进程同时写那很有可能出现脏数据,这时就会出现更新原子性的问题,

可以有以下解决方案:

1、可以将多个Tomcat中的数据写入到MQ队列中,由消费者进行单线程更新缓存

2、利用分布式锁,只有获得到锁进程才能写数据

如何写缓存

写缓存时也要注意,通常来说分为以下几步:
1、开启事务

2、写入db

3、提交事务

4、写入缓存

这里可能会存在数据库写入成功但是缓存写入失败的情况,但是不建议将写缓存加入到事务中,因为写缓存的时候可能会因为网络原因耗时较长,这样会阻塞数据库事务。如果对一致性要求不高并且数据量也不大的情况下,可以单独起一个服务来做DB和缓存之间的数据同步操作。

更新缓存也建议做增量更新

负载策略

缓存负载策略一般有以下两种:

1、轮训机制

2、一致哈希算法

轮训的优点是负载到各个服务器的请求是均匀的,但是如果进行扩容则缓存命中率会下降

一致哈希的优点是相同的请求会负载到同一台服务器上,命中率不会随着扩容而降低,但是当大流量过来时有可能把服务器拖垮。

所以建议两种方案都采用:首先采用一致哈希算法,当流量达到一定阈值的时候则切换为轮询,这样既能保证缓存命中率,也能提高系统的可用性。

原文地址:https://www.cnblogs.com/cherish010/p/9647327.html

时间: 2024-07-30 18:22:51

缓存设计(cache-design)的相关文章

【设计优化】-使用缓存(Cache)提高程序性能

        缓存(Cache)就是一块用来存放数据的内存空间.主要作用是暂存数据处理结果,并提供下次访问使用.         缓存的使用非常普遍,比如,浏览器都会在本地缓存页面,从而减少HTTP 的访问次数.又如服务器系统开发时,设计人员为一些核心的 API 加上缓存,从而提高系统的缓存时间.         最简单的缓存实现可以使用 HashMap .当然,这样做会有很多问题,如何时清理无效的数据:如何防止缓存数据过多而导致内存溢出等.一个稍好的方案是使用 WeakHashMap,使用弱

分布式系统缓存设计浅析

1. 分布式缓存面临比较大的三个问题: (1) 数据一致性. 在分布式系统这点显得尤为重要,主要原因有三点: 缓存系统与底层数据的一致性.这点在底层系统是“可读可写”时,写得尤为重要 有继承关系的缓存之间的一致性.为了尽量提高缓存命中率,缓存也是分层:全局缓存,二级缓存.他们是存在继承关系的.全局缓存可以有二级缓存来组成. 多个缓存副本之间的一致性.为了保证系统的高可用性,缓存系统背后往往会接两套存储系统(如memcache,redis等),以上的ppt也主要是讲这方面的内容. (2)缓存雪崩

【转】缓存设计的一些思考

***{转自:缓存设计的一些思考}*** 互联网架构中缓存无处不在,某厂牛人曾经说过:”缓存就像清凉油,哪里不舒服,抹一下就好了”.高品质的存储容量小,价格高:低品质存储容量大,价格低,缓存的目的就在于”扩充”高品质存储的容量.本文探讨缓存相关的一些问题. LRU替换算法 缓存的技术点包括内存管理和替换算法.LRU是使用最多的替换算法,每次淘汰最久没有使用的元素.LRU缓存实现分为两个部分:Hash表和LRU链表,Hash表用于查找缓存中的元素,LRU链表用于淘汰.内存常以Slab的方式管理.

CYQ.Data V5 分布式自动化缓存设计介绍(二)

前言: 最近一段时间,开始了<IT连>创业,所以精力和写的文章多数是在分享创业的过程. 而关于本人三大框架CYQ.Data.Aries.Taurus.MVC的相关文章,基本都很少写了. 但框架的维护升级,还是时不时的在进行中的,这点从开源的Github上的代码提交时间上就可以看出来了. 毕竟<IT连>的后台WebAPI,用的是Taurus.MVC,后台系统管理用的是Aries. 不过今天,就不写创业相关的文章了,先分享篇技术类的文章. CYQ.Data 分布式自动缓存 之前写过一篇

ASP.NET——缓存(cache)

1.      基础 ?  定义     缓存(cache)是一种用空间换取时间的技术,存在于计算机的很多地方,用来将一些慢速设备中的常用数据保存在快速设备中,取数据的时候直接从快速设备中取,比如cpu二级缓存.内存以及window文件读取缓存. ?  特点     如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,那么网站性能会非常差.而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统的性能,这样无论有多少人访问,都只是访问一次数据库:数据

nginx+Memcached 缓存设计

单页面缓存方案 单静态页缓存 解决问题场景 常见的缓存设计利用System.Web.Cache 保存在内存内,效率高,可以减轻数据库访问的压力.但是Web除了获取数据之外,还有呈现页面渲染,生成HTML很多功能都是消耗性能.在Web层也需要一个缓存,同时柔性设计,应用代码不需要大变动. 架构 客户端 访问 /Report Nginx 接收请求,判断Memcached是否存在以该网址的Key,存在直接返回不经过IIS,不存在 ,透传到IIS,并在Memacched中保存 优势:memcached性

Kafka元数据缓存(metadata cache)

经常有人问的一个问题就是:Kafka broker到底是不是无状态的?网上有这样的说法: 正常情况下consumer会在消费完一条消息后线性增加这个offset.当然,consumer也可将offset设成一个较小的值,重新消费一些消息.因为offet由consumer控制,所以Kafka broker是无状态的...... 我猜想作者的意思应该是说:broker不保存消费者的状态.如果从这个角度来说,broker无状态的说法倒也没有什么问题.不过实际上,broker是有状态的服务:每台brok

本地缓存设计

被问到本地缓存设计,有点蒙,事后反应过来,何必一个Map呢,两个就可以解决了.真是当时脑子短路了. package cache; import java.util.Map;import java.util.concurrent.ConcurrentHashMap; public class MyCache<K, V> { private static class ValueObject<T> { private T value; private long timeout; priv

MyBatis缓存设计

和大多数ORM框架一样,为了尽可能减少数据库的访问,MyBatis设计支持缓存功能.设计上通过Cache接口提供SPI(服务提供接口),可以让第三方缓存提供具体的缓存实现,比如使用ehcache.Redis等,通过这些常用环境提供的实现类,即可将其配置成MyBatis中使用的缓存. 除了给第三方缓存提供SPI接口外,MyBatis自身也通过HashMap做了简单的缓存实现.总体上MyBatis缓存设计分为一级缓存和二级缓存. MyBatis一级缓存是SqlSession级别的本地缓存,默认开启不

Linux的缓存内存 Cache Memory详解

http://www.ha97.com/4337.html PS:前天有童鞋问我,为啥我的Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存以提高读写性能,通常叫做Cache Memory. 有时候你会发现没有什么程序在运行,但是使用top或free命令看到可用内存free项会很少,此时查看系统的 /proc/meminfo 文件,会发现有一项 Cached Memory: 输入cat /proc/meminfo查看:MemTotal: 16