3

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


青叶
452 声望43 粉丝