缓存

spring mvc ehcache 详细配置 亲测可用

我的未来我决定 提交于 2021-02-19 03:52:32
1.废话不多说首先配置spring pom.xml 添加dependency <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.9.0</version> </dependency> maven在打包时候会自动从网上下载对应的jar包。 2.写一个ehcache配置文件 ehcache-context.xml (名字可以随便起不过后面要引入) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation=" http://www.springframework.org/schema/context http://www.springframework.org

分布式之缓存击穿

烂漫一生 提交于 2021-02-12 08:32:01
在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询,这样缓存就失去了意义。如果在大流量下数据库可能挂掉。这就是缓存击穿。 场景如下图所示: 我们正常人在登录首页的时候,都是根据userID来命中数据,然而黑客的目的是破坏你的系统,黑客可以随机生成一堆userID,然后将这些请求怼到你的服务器上,这些请求在缓存中不存在,就会穿过缓存,直接怼到数据库上,从而造成数据库连接异常。 0 解决方案 在这里我们给出三套解决方案,大家根据项目中的实际情况,选择使用. 讲下述三种方案前,我们先回忆下redis的setnx方法 SETNX key value 将 key 的值设为 value ,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。 SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。 可用版本 :>= 1.0.0 时间复杂度: O(1) 返回值: 设置成功,返回 1。设置失败,返回 0 。 效果如下 redis> EXISTS job # job 不存在 (integer) 0 redis> SETNX job "programmer" # job 设置成功 (integer) 1 redis> SETNX

大型网站技术架构--性能

人走茶凉 提交于 2020-12-18 09:38:33
不同视角 用户眼中的性能: 客户的机器,浏览器,网络状况,通信协议,服务器处理时间,浏览器解析时间。另外 1s左右 ,对用户来说是无区别的。 开发严重的性能:程序本身和相关子系统。响应延迟,系统吞吐量,并发处理能力,系统稳定性等。 运维人员:关注基础设施的资源和性能的利用率,合理利用,最优发挥(不浪费,不堵塞) 性能指标 响应时间 :10000/n次时间和,除以10000/n。 并发数 吞吐量 :TPS(每秒事务数),HPS(每秒请求数),QPS(每秒查询数) 。理论上讲 应该是个抛物线,峰值即为吞吐量值。 吞吐量,并发数,响应时间之间的关系 用高速公路形容很接近。车越少(并发数),资源越浪费(内存,硬盘,网络),车增多,开始吞吐量上升,到达峰值后会随之下降,直至瘫痪。 性能计数器:描述操作系统的性能指标(System Load,对象与线程数,内存使用,cpu使用,磁盘及网络io等指标) 测试方式 性能 测试:验证资源可接受范围 稳定性 测试:不均匀的施加压力,验证稳定性 压力 测试:超过安全负载的情况下,继续对系统施加压力,直至系统崩溃或者不能处理请求,来获取系统最大压力承受能力。 负载 测试:对系统不断增加并发,不断增加压力,直至系统或者应用多项指标达到临界值 性能优化 web前端,应用服务器,存储服务器性能优化。 Web前端优化 浏览器优化 1 减少http请求 2

缓存与数据库一致性

断了今生、忘了曾经 提交于 2020-12-17 01:00:42
1.使用缓存的场景 缓存是提高系统读性能的常用技术,尤其对于读多写少的应用场景,使用缓存可以极大的提高系统的性能 例子:查询用户的存款: select money from user where uid = YYY; 为了优化该查询功能,我们可以在缓存中建立uid->money的键值对。 减少数据库的查询压力。 2. 读操作流程 目前数据库和缓存中都有存储数据,当读取数据的时候,流程如下。 1)先读取缓存是否存在数据(uid->money)。如果缓存中有数据返回结果。 2)如果缓存中没有数据,则从数据库中读取数据。 介绍一个概念: 缓存命中率:缓存命中数/总缓存访问数。 3. 写操作流程 在介绍写操作流程之前,先讨论两个问题 问题一:淘汰缓存还是更新缓存? 淘汰缓存:数据只会写入数据库,不会写入缓存,只会把数据淘汰掉。 更新缓存:数据不但写入数据库,还会写入缓存。 问题二:先写缓存还是先写数据库? 由于对缓存的更新和数据库的更新无法保证事务性操作。一定涉及到哪个先做,哪个后做的问题,我们的原则是采取对业务影响小的策略。下面是四种不同的组合策略 由此可见第四种策略的影响最小,只会造成一次查询缓存miss而已。那么当查询缓存miss的时候,我们该怎么办?很简单,查询数据库,然后将数据库的内容更新到缓存中。可能有人会问第四种策略,如果一上来淘汰缓存就失败了怎么办,当然是直接返回即可

服务器更新宕机-自我检讨

为君一笑 提交于 2020-11-21 04:18:38
昨天晚上对 yi18.net (医药吧网站 ) 做 了 代码的更新,更新运行正常。本以 晚上做服务器的更新时最好的,但我错了,并不是晚上更新服务器不好。对于那些 大量用户的网站,白天更新对用户使用很受影响。但对于我这个个人网站现在日访 问量还不到100的网站其实影响不大。 我在快晚上12点时,对网站做了更新,一切很好!就开开心心的睡觉去了,当然 还做了一个美梦。早上噩梦就来了,网站不知什么时候宕掉了。于是就开始查找 问题,结果发现宕机时间是网站更新后的一个小时,为什么是一个小时?由于我的 网站做了大量的数据缓存,而且缓存时间设置的过期时间都是一个小时。访问的时候 就会全部重新去请求数据库,所以就出现CUP,内存报表的情况,无图无真相,下图: 所以就出现高使用? 事后检讨 与思考 1、以后尽量的避免更新服务器后做美梦,应该尽量跟踪服务器状态 2、修改缓存的过期时间,不应该把所以的过期时间设置在同一时刻 3、从图中就知道网站的mysql是心病,所以现在就开始做mysql的优化,不能再推了! 4、升级服务器硬件,现在配置(1G内存,单核cup),原来内存还是512的内存, 希望尽快的绑上富婆、白富美。 来源: oschina 链接: https://my.oschina.net/u/657074/blog/201378

redis 3.0尝鲜

安稳与你 提交于 2020-11-19 03:54:37
1.安装redis wget http://download.redis.io/releases/redis-3.0.5.tar.gz tar zxf redis-3.0.5.tar.gz -C /export/server/ cd /export/servers/redis-3.0.5 make && make install mkdir conf;cp redis.conf conf/ 2.redis集群模式配置 2.1redis主配置文件: vim /export/servers/redis-3.0.5/conf/redis.conf daemonize yes pidfile /var/run/redis.pid tcp-backlog 511 timeout 0 tcp-keepalive 0 loglevel notice logfile "" databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir /export/data/redis slave-serve-stale-data yes slave-read-only yes repl

五分钟理解什么是浏览器缓存?

核能气质少年 提交于 2020-11-06 04:46:09
有什么技术,是运用了空间换时间的思想?看了这么久文章,如果你记忆力不错的话,应该很容易想到「缓存」。空间换时间这个词最早的意思,就是用来描述缓存的。当然,缓存是一个很大的话题。比如说 CPU 嫌内存速度太慢,就自己带了一个存储器,用来缓存最近使用的命令,这就是 CPU 的高速缓存。再比如,操作系统嫌每次从硬盘里读取代码来运行速度太慢,就在一开始打开一个程序的时候,把它读到内存里做一个缓存,这就是为什么你打开游戏的时候,一般都有个 loading。 今天咱们顺着这个思路,来看一下浏览器是如何利用缓存来加快网页的打开速度的。如果按照上面的句型造句的话,这里应该是「浏览器嫌每次从网上下载一个网页太慢,就在硬盘上找了个地方,专门缓存已经浏览过的东西,这就是浏览器的缓存」。很简单的道理。跟硬盘相比,网络的速度还是差了一大截,而且还不稳定,随时都有可能连不上网,直接读硬盘上缓存的网页比去网上现下载要快的多。我这里说它缓存「浏览过的东西」,而不仅仅是我们看到的html页面,其实是因为在浏览器看来,服务器上的一切都是资源,每个资源都有自己的url地址,有时候网页里的图片、视频,比 html 页面本身大的多,因此更需要缓存起来。 举个简单的例子。当你在浏览器里打开 www.google.com 的时候,它会先去 google 的服务器上下载 google 的 html 网页。html 网页里

缓存更新的套路

為{幸葍}努か 提交于 2020-04-18 05:19:08
看到好些人在写更新缓存数据代码时, 先删除缓存,然后再更新数据库 ,而后续的操作会把数据再装载的缓存中。 然而,这个是逻辑是错误的 。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。 我不知道为什么这么多人用的都是这个逻辑,当我在微博上发了这个贴以后,我发现好些人给了好多非常复杂和诡异的方案,所以,我想写这篇文章说一下几个缓存更新的Design Pattern(让我们多一些套路吧)。 这里,我们先不讨论更新缓存和更新数据这两个事是一个事务的事,或是会有失败的可能,我们先假设更新数据库和更新缓存都可以成功的情况(我们先把成功的代码逻辑先写对)。 更新缓存的的Design Pattern有四种:Cache aside, Read through, Write through, Write behind caching,我们下面一一来看一下这四种Pattern。 Cache Aside Pattern 这是最常用最常用的pattern了。其具体逻辑如下: 失效 :应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。 命中 :应用程序从cache中取数据,取到后返回。 更新

php静态缓存简单制作

馋奶兔 提交于 2020-04-08 04:40:41
制作缓存的目的是为了让我们的页面运行更加快速,减少读取数据库内容的次数,给用户更好的体验,为此我们可以使自己的程序做一下缓存,并且设置一个缓存过期的时间,来保证与数据库的一致,当然并不是所有的程序都适合做缓存,这里简单介绍一下php静态缓存制作的方法: 1.首先我们要定好一个缓存文件存放的位置,即存放目录 (李昌辉) 例如我这里存放在cache目录下,将来所有的缓存文件都放到该目录下 2.在要做静态缓存的页面,我们定义一个变量来存放一个缓存文件的路径(相对于当前页面的路径) $filename = "./cache/test.html"; 3.定义一个变量来存储缓存过期时间 $cachetime = 5; 4.判断一下,缓存文件是否存在或者是否过期,如果缓存文件不存在就执行源代码生成缓存,或者时间过期了也应该重新缓存一下,如果上述条件不满足则调用缓存页面显示。 if(!file_exists($filename) || filemtime($filename)+$cachetime<time()) { //缓存页面代码 } else { include($filename);//如果存在,调用缓存文件 } 5.生成缓存,在页面输出内容之前,我们调用ob_start()方法打开内存缓冲区,将要输出的内容放到内存里面。 ob_start(); 6.在页面输出完之后

基于三维GIS技术的矢量地图动态LOD渲染方法

大城市里の小女人 提交于 2020-04-08 00:29:31
本文从地图操作和要素可见性入手分析地图简化的影响因素,并基于分析的结果设计相应的缓存结构以加速地图的渲染。研究GPU环境下梯形格网的高效LOD方法,探讨简化前后节点的重组和显存中EBO数据的更新方法,最终提出一种基于 三维GIS 技术的矢量地图动态LOD渲染方法。 1 简化的影响因素 1.1 地图操作对简化的影响 本文方法依据视点进行简化,当要素与视点的位置发生变化时进行实时简化操作。用户进行地图操作时,当视点与要素的距离发生变化时进行简化,不发生变化时则可以使用缓存数据进行绘制,从而加快渲染。因此,需要讨论地图操作导致的视点与要素的距离变化情况。 (1)平移操作 平移操作可能会导致视点与要素的距离发生变化。在非俯仰状态下,平移操作不会导致视点与要素的距离发生变化;在俯仰状态下,平移操作会导致视点与要素的距离发生变化。 平移操作示意图 (2)旋转 旋转操作可能会导致视点与要素的距离发生变化。非俯仰状态下,旋转操作不会导致视点与要素的距离发生变化;俯仰状态下,旋转操作会导致视点与要素的距离发生变化。 旋转操作示意图 (3)放缩操作 放缩操作会导致视点与要素的距离发生变化。 放缩操作示意图 (4)俯仰 俯仰操作会导致视点与要素的距离发生变化。 俯仰操作示意图 综上分析可知,在非俯仰状态下,地图平移操作和旋转操作不会改变要素距视点的距离,可以使用上一帧的地图缓存进行绘制,加快其渲染速度