Redis缓存命中率如何提高
一、缓存命中率
- 命中:可以直接通过缓存获取到需要的数据,而不是从数据库中获取
- 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作。原因可能是由于缓存中根本不存在,或者缓存已经过期。
通常来讲,缓存的命中率越高则表示使用缓存的收益越高,应用的性能越好(响应时间越短、吞吐量越高),抗并发的能力越强。
由此可见,在高并发的互联网系统中,缓存的命中率是至关重要的指标。
如何查看Redis缓存命中率
redis-cli -h xx -p xx info stats
可以看到
keyspace_hits:90176387
keyspace_misses:5182698
缓存命中率:keyspace_hits / (keyspace_hits + keyspace_misses)
二、缓存命中率的影响因素
2.1 业务场景
缓存适合“读多写少”的业务场景,反之,使用缓存的意义其实并不大,命中率会很低。
2.2 时效性
业务需求决定了对时效性的要求,直接影响到缓存的过期时间和更新策略。时效性要求越低,就越适合缓存。在相同key和相同请求数的情况下,缓存时间越长,命中率会越高。
互联网应用的大多数业务场景下都是很适合使用缓存的。
2.3 缓存粒度
通常情况下,缓存的粒度越小,命中率会越高。
举个实际的例子说明:
当缓存单个对象的时候(例如:单个用户信息),只有当该对象对应的数据发生变化时,我们才需要更新缓存或者让移除缓存。而当缓存一个集合的时候(例如:所有用户数据),其中任何一个对象对应的数据发生变化时,都需要更新或移除缓存。
还有另一种情况,假设其他地方也需要获取该对象对应的数据时(比如其他地方也需要获取单个用户信息),如果缓存的是单个对象,则可以直接命中缓存,反之,则无法直接命中。这样更加灵活,缓存命中率会更高。
2.4 过期时间和更新策略
缓存的更新/过期时间和策略也直接影响到缓存的命中率。此处的缓存过期策略并非Redis自带的定期删除和惰性删除策略,而是根据业务场景优化Key的过期时间和更新策略。
如用户的key信息,如果同时过期,那么多个用户同时查询时,就会落到数据库去,也就是要避免缓存同时失效。当数据发生变化时,直接更新缓存的值会比移除缓存(或者让缓存过期)的命中率更高,当然,系统复杂度也会更高。
2.5 缓存预加载-预热
redis的缓存大部分是从数据库加载的,那么第一次使用数据的时候,redis需要从数据库去加载数据,所以在对用户前,可以提前加载需要的数据到缓存,这样用户在第一次访问的时候就可以直接走缓存而不是去查询数据库。
2.6 缓存击穿和缓存穿透
- 缓存击穿:
主要是缓存过期时的高并发访问,可以通过加锁,同一key只允许一个连接访问到DB数据库解决 - 缓存穿透:
一般是访问不存在的key,导致落到数据库(可能数据库也没有),这样会降低缓存命中率
(1)应用访问缓存,假如数据存在,则直接返回数据
(2)数据在redis不存在,则去访问数据库,数据库查询到了直接返回应用,同时把结果写回redis
(3)数据在redis不存在,数据库也不存在,返回空,一般来说空值是不会写入redis的,如果反复请求同一条数据,那么则会发生缓存穿透
解决:可以使用布隆过滤器先判断key是否存在,存在才去redis缓存读取(redis缓存里可能key也不存在,这时候就去数据库读取,没有则返回空)
2.7 缓存容量
要注意缓存容量,太小会触发redis的内存淘汰机制,线上redis一般配置maxmemory-policy allkeys-lru算法来进行内存淘汰,这样有一部分key会被删除,导致缓存穿透,从而降低缓存命中率,因此合理配置缓存容量很有必有。
提高缓存命中率的方法
- 聚焦在高频访问且时效性要求不高的热点业务上(如字典数据、session、token)
- 缓存预加载(预热)
- 增加存储容量
- 调整缓存粒度
- 更新缓存
注意:对于时效性很高(或缓存空间有限),内容跨度很大(或访问很随机),并且访问量不高的应用来说缓存命中率可能长期很低,可能预热后的缓存还没来得被访问就已经过期了。
https://segmentfault.com/a/1190000023730820
https://www.cnblogs.com/shamo89/p/8383915.html
Redis缓存命中率如何提高相关推荐
- PHP提高redis命中率,怎么提高redis缓存命中率
缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常来讲 ...
- Redis 缓存命中率计算
1.需要先登陆到Redis服务器上 2.运行命令 info ,得到如下参数 keyspace_hits:命中的次数 keyspace_misses:没有命中的次数 3.缓存命中率 = keyspace ...
- Redis缓存命中率如何计算
我们登陆到Redis服务器上,运行命令info: 里面会有如下两个参数: keyspace_hits:命中的次数 keyspace_misses:没有命中的次数 缓存命中率 = keyspace_hi ...
- redis缓存命中率
登录redis服务器 输入 redis-cli 链接到redis之后,输入info 则会打印 通过计算hits和miss,我们可以得到缓存的命中率:111207/ (111207+ 50181) = ...
- 如何提高缓存命中率(Redis)
缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常来讲 ...
- mysql 加快命中_合理配置MySQL缓存 提高缓存命中率
众所周知,系统读取数据时,从内存中读取要比从硬盘上速度要快好几百倍.故现在绝大部分应用系统,都会最大程度的使用缓存(内存中的一个存储区域),来提高系统的运行效率.MySQL数据库也不例外.在这里,笔者 ...
- 合理配置MySQL缓存 提高缓存命中率
众所周知,系统读取数据时,从内存中读取要比从硬盘上速度要快好几百倍.故现在绝大部分应用系统,都会最大程度的使用缓存(内存中的一个存储区域),来提高系统的运行效率.MySQL数据库也不例外.在这里,笔者 ...
- mysql query cache 命中率_MySQL缓存命中率概述及如何提高缓存命中率
MySQL缓存命中率概述 工作原理: 查询缓存的工作原理,基本上可以概括为: 缓存SELECT操作或预处理查询(注释:5.1.17开始支持)的结果集和SQL语句: 新的SELECT语句或预处理查询语句 ...
- mysql提高缓存_合理配置MySQL缓存 提高缓存命中率
众所周知,系统读取数据时,从内存中读取要比从硬盘上速度要快好几百倍.故现在绝大部分应用系统,都会最大程度的使用缓存(内存中的一个存储区 域),来提高系统的运行效率.MySQL数据库也不例外.在这里,笔 ...
最新文章
- GNU make manual 翻译( 一百五十四)
- js获取当前日期,包括星期几
- Java模块化之路 —— OSGI介绍
- PMP知识点(九、风险管理)
- Linux——Ubuntu 18.04 安装screenFetch(显示系统/主题信息的命令行脚本)
- guid主分区表损坏怎么办_轻钢龙骨隔墙怎么办?轻钢龙骨隔墙的做法
- jboss7 关闭日志打印_使用自定义日志记录处理程序在JBoss AS 7中跟踪SQL语句
- spring aop的两种写法aspect和advisor
- 机器学习算法总结之K近邻(KNN)
- 史上最佳GAN被超越!生成人脸动物高清大图真假难辨,DeepMind发布二代VQ-VAE
- linux里用户权限:~$,/$,~#,/#的区别与含义
- java 字符串首字符大写_Java字符串为大写
- java http请求_零基础学Java,掌握Java基础难不难?
- 线性代数第六版答案(全)
- 计算机丢失msvcr100.dll解决办法,如何解决Msvcr100.dll丢失问题?两种方法可以解决...
- 【Python】利用Python对招聘信息数据分析
- 详解浏览器事件捕获、冒泡
- php curlesslcacert,Shipyard集群化docker管理平台部署
- 一不小心把此电脑删了,如何把此电脑添加到桌面?
- 汉字转拼音 - 输入汉字获取其拼音