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会被删除,导致缓存穿透,从而升高缓存命中率,因而合理配置缓存容量很有必有