Redi缓存注意事项
缓存使用的场景
在一个高频访问的应用系统中,每次用户的请求需要去存储中获取数据,会对数据库造成很大的压力、容易导致数据库的奔溃。所以才会出现缓存来分担一部分的数据库的压力。
具体会产生数据库访问压力的业务场景如下:
1 高频访问数据存储会对数据库的QPS造成很大的压力。
2数据统计类的查询需要消耗很大的数据库cpu、改成由定时任务产生数据推送缓存、每次查询从缓存里面取。
3 业务中产生中间态的数据没有什么业务含义、但有需要有个存储来持久化、所以放到缓存中来。例如验证码、登录的token等。
缓存使用的问题
1 缓存一致性问题
当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的时,主动移除对应的缓存。
所以需要通过事物机制来保证缓存的一致性。
2缓存高并发访问问题
在高并发场景下,有多个请求去共同请求一份相同的业务数据。有可能多个请求先去从缓存中获取数据、获取不到的并发的去从数据库获取数据,对后端数据库造成极大的冲击,甚至导致 “雪崩”现象。
方案一
可以做一个随机的等待、错峰去访问缓存的信息。这样就能保证同一时刻高并发的访问、经过时间离散之后只有小部分的请求访问数据库、大部分的请求去命中缓存。
方案二
可以按照比例限制有部分数据直接访问数据库然后更新缓存、大部分的数据直接请求缓存。
按照实际的场景去做判断例如 1%的场景直接访问数据库,99%的可以通过缓存获取到数据。
方案一和方案有什么区别呢?大家可以思考下。
3缓存击穿的问题
在系统设计的的时候预期是通过缓存来减轻数据库的压力、防止数据奔溃的情况。在某个实际发生的场景中、大量的请求并没有命中缓存而导致了大量请求达到数据库、从而导致数据库有巨大冲击和压力。
场景一 缓存中没有数据
在某个大促活动中有大量的热点数据,互动一开始需要访问这些数据。由于活动开始的时候洪峰流量到来,所有的请求缓存、缓存直接击穿,访问数据库导致数据库直接cpu 100%,业务系统直接奔溃。
对于这种场景可以提前对数据进行预热,开活动开始前先将数据推送到缓存中。
场景二 缓存集中失效
由于我们在缓存使用的过程中会设置缓存的失效时间、如果设置的不合理可能会导致数据集中失效的情况。由于缓存集中失效会导致系统缓存穿透、在同一时刻高并发的访问数据,造成数据雪崩。
解决这种场景的可以将失效的时间由固定值+随机值来构成。EXPIRE_TIME=FIX_TIME+RUND_TIME 例如你想保证整个EXPIRE_TIME是5S 左右,可以 通过EXPIRE_TIME=4000+Random(1000)
3单条缓存数据过大
我们大多数缓存服务的实现都依赖于内存,而大多数缓存服务在设计的时候都是用来存储很多小数据的内存分配机制。而内存分配算法都是 512 bte ,1k,2k,4k的内存分配机制来确保系统的内存能够容纳更多的记录数。
同时对接持久存储的时候大多都遵循磁盘4k对其的刷盘原理。如果我们存储的一条记录数据超过4K、对整个缓存的性能造成很大的影响。从而导致系统oom。
例如REDIS内存分配策略:
Redis默认内存分配器采用jemalloc,可选的分配器还有:glibe、tcmalloc。
内存分配器是为了更好的管理和重复利用内存,分配内存策略一般采用固定范围的内存块进行内存分配。
这里不去深究jemalloc的内存分配原理,简单地说jemalloc将内存空间划分为三个部分:Small class、Large class、Huge class,每个部分又划分为很多小的内存块单位:
- Small class: [8byte], [16byte, 32byte, … 128byte], [192byte, 256byte, … 512byte], [768byte, 1024byte, … 3840byte]
- Large class: [4kb, 8kb, 12kb, … 4072kb]
- Huge class: [4mb, 8mb, 12mb …]
https://blog.csdn.net/Leon_cx/article/details/82597722
常见使用方式
1定时失效
用发起请求后系统从缓存获取数据、获取不到从数据库获取、获取之后放入到缓存中,设置一个主动失效的时间。
2 主动失效
在数据查询的时候会设置一个时间、超时会依赖缓存自身的机制来失效数据。当数据更新的时候、会主动失效缓存。保证缓存的数据和数据库的数据尽可能一致。
3 定时更新缓存
对于统计类的需求、每次查询需要耗费很多数据库资源、直接查询数据库会严重影响数据库的性能。并且数据变化非常快、采用主动或者被动缓存都会有缓存击穿的风险。所以直接通过定时任务来统计数据、统计完以后会更新到缓存中,每次用去取都是从缓存中查询。这样做会造成缓存中的数据不是实时的,但能确保整个系统的稳定性。
3 按比例放行更新缓存
当用户在大流量访问的时候可以按照比列来更新数据缓存信息 这样既能保证数据的实时性,又能保证数据库的稳定性。在用户访问量小的情况下可以将访问数据库的比列调大一点,在数据访问的高峰期的是可以将比列调小。
Redi缓存注意事项的更多相关文章
- 同时使用Redis缓存和Google Guava本地缓存注意事项(深拷贝和浅拷贝)
目录 1.问题场景及说明 2.Redis 缓存是深拷贝 3.Guava本地缓存直接获取则是浅拷贝 4.如何实现Guava获取本地缓存是深拷贝? 1.问题场景及说明 系统中同时使用 Redis 缓存和 ...
- 使用YII缓存注意事项
在使用YII自身缓存时,在main.php文件配置中一定要配置keyPrefix,如下图: 'cache' => array( 'class' => 'CFileCache', 'keyP ...
- 组件缓存注意事项 ---keep-alive
- mybatis缓存学习笔记
mybatis有两级缓存机制,一级缓存默认开启,可以在手动关闭:二级缓存默认关闭,可以手动开启.一级缓存为线程内缓存,二级缓存为线程间缓存. 一提缓存,必是查询.缓存的作用就是查询快.写操作只能使得缓 ...
- jQuery数据缓存data(name, value)详解及实现
一. jQuery数据缓存的作用 jQuery数据缓存的作用在中文API中是这样描述的:“用于在一个元素上存取数据而避免了循环引用的风险”.如何理解这句话呢,看看我下面的举例,不知道合不合适,如果你有 ...
- yii中缓存(cache)详解
缓存是用于提升网站性能的一种即简单又有效的途径.通过存储相对静态的数据至缓存以备所需,我们可以省去生成这些数据的时间.在 Yii 中使用缓存主要包括配置和访问缓存组件 . 内部方法 一.缓存配置: 1 ...
- iOS笔记-(缓存机制的理解与实现)
(1)运行中的现象: 在iOS开发中,会遇到:同一NSURL被多次请求,会造成用户的流量浪费,程序的响应速度不够快.比如说,从服务器上请求一张图片,请求100次,下载的结果都是一样的. (2)解决方法 ...
- yii中缓存(cache)详解 - 彼岸あ年華ツ
缓存是用于提升网站性能的一种即简单又有效的途径.通过存储相对静态的数据至缓存以备所需,我们可以省去生成 这些数据的时间.在 Yii 中使用缓存主要包括配置和访问缓存组件 . 内部方法 一.缓存配置: ...
- 06 部署redis缓存数据库
1 安装redis $ sudo apt-get install redis-server 安装完成后,Redis服务器会自动启动,检查Redis服务器程序 注:在安装过程中,腾讯服务器会中途停止. ...
随机推荐
- 机器学习: t-Stochastic Neighbor Embedding 降维算法 (一)
Introduction 在计算机视觉及机器学习领域,数据的可视化是非常重要的一个应用,一般我们处理的数据都是成百上千维的,但是我们知道,目前我们可以感知的数据维度最多只有三维,超出三维的数据是没有办 ...
- vector删,erase和remove难怪--【STL】
供vector使用容器.通常只是一个简单的遍历查找,其他操作已执行,这不是,今天,稍有不慎. erase方法的操作是将此时的节点删除,然后指向被删除节点的下一个: 如对数据1 6 6 4 7; #in ...
- boost::bind应用示例
// testBind.cpp : Defines the entry point for the console application. // #include "stdafx.h&qu ...
- JS数组操作:去重,交集,并集,差集
原文:JS数组操作:去重,交集,并集,差集 1. 数组去重 方法一: function unique(arr) { //定义常量 res,值为一个Map对象实例 const res = new Map ...
- cocos2d-x 在XML分析和数据存储
无意中起到一周中的游戏,哎,时间过得总是打得那么快时,. .. 于是今天决定看一下之前不怎么非常熟悉的XML;(之前做游戏时数据的储存用到过XML.但这块是还有一个同事在做,所以不怎么熟悉), 看了看 ...
- VLC-FM PLAYLIST
VLC-FM-PLAYLIST.xspf <?xml version="1.0" encoding="UTF-8"?> <playlist x ...
- WPF 数据模板使用值转换器
<Window x:Class="CollectionBinding.MainWindow" xmlns="http://schemas.micros ...
- ASP FirstWeb
//html <!DOCTYPE html> <html><head><meta http-equiv="Content-Type" co ...
- 如果你说最近在看《诛仙》,平时喜欢玩LOL,你就是在把自己往悬崖上推
面试官可能会问你一些和技术看上去没有任何关系的问题,比如问你最近在看什么书,学习之余喜欢做什么,常去哪些网站之类的.如果你说最近在看<诛仙>,平时喜欢玩LOL,你就是在把自己往悬崖上推.实 ...
- WPF 中style文件的引用
原文:WPF 中style文件的引用 总结一下WPF中Style样式的引用方法: 一,内联样式: 直接设置控件的Height.Width.Foreground.HorizontalAlignment. ...