赞
踩
Redis是一个基于内存读写数据的高性能非关系型数据库,数据格式以key-value形式存储。企业开发中常用来存放缓存数据,减少关系型数据库的压力,提高请求的响应效率。
Redis使用内存来提高读写数据的效率,但是数据在内存中容易丢失,所以Redis提供了两种数据持久化机制。
AOF
持久化机制: 当Redis数据发生更新时,会将操作命令记录在一个日志文件当中,在日志文件结尾追加。Redis重启时,将日志文件的命令重新执行一遍,以达到数据恢复的目的。
优点: 每次数据变化都会记录下来,数据不易丢失
缺点:
耗性能:每次记录操作时,都会开启一个进程来记录操作命令。
恢复数据慢:恢复数据时需要将日志中的全部命令执行一遍
RDB
持久化机制: 每间隔一段时间,将当前Redis数据库中的所有数据以快照的形式存储到文件当中,当Redis重启时会将快照中的数据加载到Redis中。
优点: 恢复数据快,直接恢复快照中的数据
缺点:
数据容易丢失:在保存快照的时间间隔时发生宕机,这段时间的数据是无法恢复的
耐久性差 :保存快照是需要耗费性能的,如果在保存快照时对数据进行读写,会存在等待响应的时间
当然,两者可以组合使用,既可以保证数据的快速恢复又可以保证数据不丢失
Redis的数据可以设置有效时间,当Redis数据失效时,Redis有多种机制来清除失效的数据。
定期删除(立即删除)
数据一旦过期立即删除
优点: 快速删除不需要的数据,及时释放内存,节约内存
缺点: 如果到期的数据量过大过多,会对CPU造成压力,影响性能
定期删除(随机删除)
根据CPU的性能和内存占用情况对已过期的数据进行不定时的清除
惰性删除
数据到期时不进行删除,直到数据被访问时才进行删除
优点: 发现时才删除数据,节约CPU性能
缺点: 内存中可能会存在大量的过期数据,内存压力会较大
Redis缓存数据流程:
一般来讲,redis在项目中缓存的逻辑是先判断缓存中是否存在数据,如果存在直接返回,如果不存在,从数据库查找后再缓存到Redis中,然后再返回数据。
流程图如下:
问题场景:
缓存穿透是指用户查询的数据在缓存和数据库中都不存在,然后请求量过大,导致数据库的压力过大,一般是有人恶意攻击的情况下导致,比如查根据用户id查询个人信息,但是有人一直通过 id = -1频繁访问接口,很明显用户id为-1的用户不存在。
解决方案:
1.可以设计访问请求监测机制,拦截非法请求用户
2.缓存的数据为key-value格式,可以将value设置为null,防止数据库产生过大压力
问题场景:
缓存击穿一般是指缓存中没有的数据,数据库中存在,然后过大的并发量导致数据库压力过大。
举例说明:场假如某一商品为秒杀商品,将此商品信息放入缓存中,以减少查询数据库的压力,缓存有效期为商品秒杀结束前。此逻辑看似合理,但在实际应用场景中,秒杀结束后,用户依然会频繁访问此商品,此时缓存已过期,所有请求查询都会访问数据库,导致数据库压力过大。
解决方案:
1.延长数据的有效期或设置热点数据为永不过期
2.设置互斥锁减少访问数据库的请求
问题场景:
缓存雪崩一般是指某一时刻,缓存数据全部过期失效或者缓存服务器宕机,所有数据请求都通过数据库查询,数据库压力瞬间增大
缓存击穿与雪崩的区别:缓存击穿是指访问某一条数据,并发量过大。缓存雪崩是指缓存大量请求去访问不通的数据,而缓存中不存在。
解决方案:
1.随机延长数据的有效期,防止数据同时过期,减少访问数据库的频率
2.Redis集群防止单点故障
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。