Redis相关知识

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日志

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值