Redis使用
在上一篇介绍了Redis后,现在介绍Redis的使用,
Redis是一种在缓存中存入数据的数据库,那么它可以怎么用呢?
- 直接当做数据库,也就是说对于实现高并发时还是使用的这一套体系,包括了我们在缓存中的访问,以及对数据的持久化,在这方面Redis的实现并没有MySQL那么优秀,Redis对于存储相当复杂,没有MySQL简洁明了。
- 当做一个数据的缓存,我们只是对它进行一系列操作,而它对数据的持久化等交给MySQL等数据库去实现,这样就可以更加优化Redis的性能。
有关Redis的优缺点请查阅:Redis的优缺点
Redis的缓存策略
对于数据库的操作我们分开来看:
读操作:在缓存中查找数据,如果有,则直接返回。
读操作:造缓存中查找数据,如果没有,则在数据库中查找数据,将结果返回,并将数据放入缓存中。
增删改:在数据库中修改修改数据,修改成功后,让缓存中有关数据失效,并将当前数据放入缓存。
此时,就会出现上一篇中所遗留的问题,如果在修改之后,但是还没有更新缓存的情况下,有别的事务进来读数据,那么读到的数据并不是真实的数据,表达为脏读,此时的解决办法有加锁,实现数据库和缓存对于修改数据的同步,这种类似的问题在高并发的时候出现概率相当高,应该尽量避免。
缓存击穿
缓存击穿指的是我们缓存中的某一个key值非常的受欢迎,在高并发时,大家都来访问这一个点,如果在某一时刻这个数据失效,那么就会对数据库访问,高并发集就会冲击数据库,虽然一般情况下并不会把数据库压垮,但是还是小心为上。
解决办法:一个比较简单的解决办法就是如果预感某一个key变得非常受欢迎,那么提前将其设置为永不过期。
缓存穿透
缓存穿透是指直接查找一个数据库确定不存在的值,因为这样缓存中肯定是没有该数据的,然后就会去访问数据库,但是数据库也没有,此时就会返回空,但是缓存和数据库并没有发生变化,那么就可以持续利用此数据进行访问,这样下去很容易压垮数据库。
解决办法:如果一个数据在缓存及数据库中没有找到,那么将key-null存入缓存,只不过此时将该数据的有效时间缩短,这样如果出现缓冲穿透也能缓解数据库的压力。
缓存雪崩
缓存雪崩指的是在同一时间,缓存中大量数据失效,造成并发集访问数据库,比如在电商活动中,双十一上架很多的产品到缓存中,设置同一过期时间,导致到了某一个时间大量数据失效,数据库被集中访问,这和缓存击穿类似,但是缓存击穿是并发访问一个数据,而缓存雪崩是并发访问多个数据而在缓存中访问不到。
解决办法:
- 随机设置过期时间,防止集中失效
- 如果实在分布式架构中,则将热点数据分散放在服务器中。
- 将热点数据设置为永久有效