Redis和mernacached的区别:
1、redis支持更丰富的数据类型(支持更复杂的应用场景):Redis不仅仅支持简单的K/v类型的数据,同时还提供list,setzset,hash等数据结构的存储。memcache支持简单的数据类型,String。
2、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而M嗯么cache把数据全部存在内存之中。
3、集群模式:memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据:但是redis目前是原生支持cluster模式的
4、memcached是多线程,非阻塞io复用的网络模型:Redis使用单线程的多路io复用模型。
Redis缓存使用会出现什么问题,对应解决方案有什么:
一、缓存穿透
缓存穿透,是指查询一个数据库一定不存在的数据。
例如:对于系统A,假设一秒5000个请求,结果其中4000个请求时黑客发出的恶意攻击。黑客发出的那4000个攻击,缓存中查不到,每次你去数据库里查,也查不到。这种恶意攻击场景的缓存穿透就会直接把数据库给打死
解决方案:
1、采用布隆过滤器BloomFilter
将所用可以存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力
2、缓存空值
如果一个查询返回的数据为空(不管是数据不存在,还是系统故障)我们仍然把这个空结果进行缓存,但他的过期时间会很短,最长不超过五分钟。通过这个直接设置好默认值存放到缓存,这样第二次缓冲中获取就有值了,而不会继续访问数据库
3、接口限流与熔断、降级
-重要的接口一定要做好限流策略,防止用户恶意刷接口,同时要降级准备,当接口中的某些服务不可用时候,进行熔断,失败快速返回机制。
二、缓存雪崩
缓存雪崩,是指在某一时间段,缓存集中过期失效。
举个栗子:如果首页所有key的失效时间都是12小时,中午12点刷新的,我零点有个大促活动大量用户涌入,假设每秒6000个请求,本来缓存可以抗住每秒5000个请求,但是缓存中的所有key都失效了。此时6000个/秒的请求全部落在了数据库中,数据库必然扛不住。真实情况可能DBA都没反应过来就直接挂了。
解决方案:
1、加锁排队
key: whiltList value:1000w个uid 指定setNx whiltList value nullValue mutex互斥锁解决,Redis的SETNX去set一个mutex key, 当操作返回成功时,再进行load db的操作并回设缓存; 否则,就重试整个get缓存的方法
2、数据预热
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的key
3、双层缓存策略
C1为原始缓存,C2为拷贝缓存,C1失效时,可以访问C2,C1缓存失效时间设置为短期,C2设置为长期。
4、定时更新缓存策略
失效性要求不高的缓存,容器启动初始化加载,采用定时任务更新或移除缓存,
5、不同过期时间
设置不同的过期时间,让缓存失效的时间点尽量均匀
6、热点数据永不过期
部分用户访问特别频繁的热点数据,设置永不过期
三、缓存击穿
缓存击穿是指一个key非常热点,在不停地扛着大量的请求,大兵法集中对着一个点进行访问,当这个key在失效的瞬间,持续的大并发直接落到了数据库上,就在这个key的点上击穿了缓存。
解决办法
1、互斥锁,并发请求改为串行
2、热点数据永不过期
redis的数据持久化方式有哪些
RDB:对内存中数据库状态进行快照。
AOF:把每条命令都写入文件,类似mysql的binlog日志