一、Redis简介
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
二、redis有什么缺点
(一)缓存和数据库双写一致性问题:
比如在操作的过程中,向数据库和缓存中都插入,这时有可能导致数据不一致的问题,有可能缓存里面 有了,但是数据库中还没有。这里可以用弱一致性处理,可以做预热处理,也就是先把数据库的数据预热到缓存里去。
(二)缓存雪崩问题:
这里 的缓存雪崩和雪崩效应不一样,雪崩效应:如下图:可能服务与服务之间出现网络失联,或者网络抖动,由于服务一直连源不断的有请求过来。但是没有去直接给个返回已经失联了,然后其中一个服务会请求挤压,最终导致另一个服务的效率越来越低。
缓存雪崩:缓存中的key出现大面积的失效。而导致所有的请求去请求数据库做处理,从而导致数据库宕机。
解决方案:
a、给缓存的失效时间,加上一个随机值,避免集体失效,这样就不会导致大面积的失效。
随机数作为失效时间。
b、使用互斥锁,但是该方案吞吐量明显下降了。
c、双缓存:二级缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。然后细分以下几个小点
I 从缓存A读数据,有则直接返回
II A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。然后把从B中读的数据更新到A中去。
III 更新线程同时更新缓存A和缓存B。
(三)缓存击穿问题:
①、是有黑客惯用的手段,比如现在发送一个请求,比如请求到nginx服务器,然后反向代理到web服务器,在缓存中专门制造不存在的数据进行请求,不会在缓存中去找了,然后请求到数据库db,比如10万个请求直接,到DB,这时数据库就崩溃,称之为缓存击穿。
②、在缓存中存的少量数据的缓存时间失效了,就是key所对应的时间已经过期了。过期之后请求在缓存中找不到数据了,然后请求到数据库db,比如10万个请求直接到DB,这时数据库就崩溃,称之为缓存击穿。
解决办法:
a、利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试。
b、采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。
c、提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出,请求所携带的Key是否合法有效。如果不合法,则直接返回。就是白名单和黑名单的方式来做,不常见的ip地址纳入到黑名单里面去,现在谷歌工具集中已经有布隆过滤器了,由32位的位变量,矢量的方式来做的。这个布隆过滤器在大数据里面用的也很多。
(四)缓存的并发:竞争问题