Redis
redis是一个可进行持久化的内存数据库,可以支持string,list,hsh,set,zet这五种数据类型。
redis的性能很高(redis的读取速度可以达到11万次每秒,写的速度达到8万次每秒)
redis【缓存穿透】
缓存穿透是指去查询一个一定不存在的数据,比如说我一共有100个商品,然后你偏偏去查询第101,102个这些不存在的商品,这个时候我们通常情况下就先回去redis里面去查询,但是redis里面就存在,所以就会去数据库中查询,如果大量的这种请求过来,那么就都落在了数据库上面,而数据库也不存在这样的数据,那么缓存就如同虚设,增加了数据库的压力。
解决方法:
为了解决这个问题,我们可以缓存空值,也就是说即便数据库中查询出来的数据不存在,也会缓存空值在reids的缓存中,这样下一次就可以走我们的缓存而不是数据库啦,但是太多的空值会占用我们的缓存的内存空间,导致内存的浪费,我们就通过给它设置一个过期时间比如3分钟,这样过了3分钟后存入的空值就会清空,释放空间,但是这样又出现另外一个问题,就是说如果有人在三分钟内加了一条数据,这个时候就有了第101条数据啦,但是当我们用户去查的时候,走的缓存而缓存中却还是空值,导致缓存中的数据和数据库中的数据不一致,为了解决这个问题我们可以在后台增加数据的时候,同时主动更新缓存中存在的数据,或者去删除缓存中的数据,但这条数据还需再次去数据库中查询。
redis【缓存雪崩】
大量的缓存穿透,或者缓存在一段时间内同时失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。
解决方法:
1.为不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
2.做双缓存策略。
A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,
A1缓存失效时间设置为短期,A2设置为长期。
【redis持久化】
有AOF和RDB两种方式,我们一般使用默认的RDB方式。
因为它的效率会更高,
RDB持久化是在指定的时间间隔内将内存中的数据集快照写入磁盘,
实际操作过程是fork[分]一个子进程,
先将数据集写入临时文件,
写入成功后,再替换之前的文件,用二进制压缩存储,这样可以有效防止写入失败到账先前的数据也丢失。
具体是在redis.conf中配置的,找到save关键字,
指定每隔多长时间有多少个key发生变化,
就将其持久化。
save 900 1
#在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10
#在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000
来源:oschina
链接:https://my.oschina.net/u/4401748/blog/4129469