把redis作为缓存来使用,是业界最广泛的使用方式了,但是使用redis也会碰到一系列的问题的,尤其是数量很大的时候:
(一)缓存和数据一直性的问题
分布式环境下面,使用redis非常容易出现缓存和数据库之间的数据一致性问题,redis只能做到最终一致性,但是没法做到强一致性,如果你的系统想要保证强一致性的话建议还是不要使用的缓存。我们只能采用一定的策略来降低缓存和数据的数据库数据的不一致的概率,而无法保证两者之间的强一致性:合适的策略包括,合适的缓存更新策略,更新数据库之后要即时的更新缓存(在调用增删改的时候,可以先查看redis里面是否有对应的key,如果有的话,可以做具体的操作,这里可以使用布隆过滤器加快数据的key的匹配,可以达到百万数据毫秒级别的速度,这里可以对mapper层做aop,来做到低耦合),更新数据后要即时的更新,缓存失败要增加重试的机制的,例如mq模式的消费队列。
(二)缓存击穿
缓存击穿指表示恶意用户请求很多的缓存中不存在的数据的,由于缓存中没有命中,导致这些请求在短时间之内直接的落在了数据库上面,导致数据库异常。经常会遇到接口的api被大量的恶意用户刷,导致短时间内数据库宕机,好在数据库做了多主多从,顶住了。
(三) 缓存雪崩
缓存雪崩指的是缓存在同一时间或者短时间段之内,大量建过期,接下来的一大波请求直接落在数据库上面,导致负载过大,连接异常。
(四)缓存并发的问题
这里指的是多个rediscli同时的set,导致的并发问题,比较有限的方案就是,set操作放在队列里面,使其串行化执行,当热,加锁也是可以的。