共计 1342 个字符,预计需要花费 4 分钟才能阅读完成。
redis 缓存
在 redis 的理论利用场景中,用做缓存居多
mysql 关系型数据库查问数据较慢(受架构、老本等方面的因素),而 redis 纯内存操作,做缓存能够大大提高数据访问速度
redis 缓存命中率的几个概念
命中 (keyspace_hits):间接从 Redis 缓存获取数据,而不是从数据库
不命中 (keyspace_misses):缓存中没有数据,须要去数据库加载
命中率:
能够通过命令 info 查看命中与未命中状况
keyspace_hits:1741626534
keyspace_misses:36020166
命中率算法:keyspace_hits/(keyspace_hits+keyspace_misses)
进步 redis 缓存命中率
1. 业务场景及时效性
缓存适宜读多写少的场景,尽可能的聚焦在高频拜访且时效性要求不高的热点业务上(如字典数据、session、token)。拜访频率越高,命中率天然也越高;时效性越低,在雷同 key 和雷同申请数的状况下,缓存工夫越长,命中率会越高。
注:如果是高并发,就算时效性短,也一样能够有很高的缓存命中率
2. 缓存粒度
缓存的粒度越小,缓存命中率越高。也就是说,单个 key 缓存的数据单位越小,越不容易产生更改,比方一个 key A 只缓存用户地址,另外一个 key B 缓存用户信息的汇合(比方蕴含用户名、明码、地址、手机号码等),那么只有批改用户的手机号码,key B 就生效了
3. 缓存过期策略
此处的缓存过期策略并非 redis 自带定期删除和惰性删除策略,而是依据业务场景优化 key 的过期工夫,如用户的 key 信息,如果同时过期,那么多个用户同时查问时,就会都落到数据库去,也就是说要防止缓存同时生效
注:redis 缓存自带的过期策略在理论利用中,可能有大量曾经生效的 key 仍然存在于 redis 中
4. 缓存预加载 - 预热
redis 的缓存必定都是从数据库加载的,那么第一次应用数据的时候,redis 须要从数据库去加载数据,所以在对用户前,能够提前加载须要的数据到缓存,这样用户在第一次拜访的时候就能够间接走缓存而不是去查询数据库
5. 避免缓存击穿和穿透
缓存击穿和穿透也会影响缓存命中率,当然如果产生,大概率呈现利用故障了。
缓存击穿:
次要是缓存过期时的高并发拜访,能够通过加锁,同一 key 只容许一个连贯拜访到 DB 数据库解决
缓存穿透:
个别是拜访不存在的 key,导致落到数据库 (可能数据库也没有),这样会升高缓存命中率
(1) 利用拜访缓存,如果数据存在,则间接返回数据
(2) 数据在 redis 不存在,则去拜访数据库,数据库查问到了间接返回利用,同时把后果写回 redis
(3)数据在 redis 不存在,数据库也不存在,返回空,一般来说空值是不会写入 redis 的,如果重复申请同一条数据,那么则会产生缓存穿透
解决:能够应用布隆过滤器先判断 key 是否存在,存在才去 redis 缓存读取(redis 缓存里可能 key 也不存在,这时候就去数据库读取,没有则返回空)
6. 缓存容量
要留神缓存容量,太小会触发 redis 的内存淘汰机制,线上 redis 个别配置 maxmemory-policy allkeys-lru
算法来进行内存淘汰,这样有一部分 key 会被删除,导致缓存穿透,从而升高缓存命中率,因而合理配置缓存容量很有必有