你们怎么保证Redis和Mysql的一致性
我们在代码中控制,如果数据库做是写操作,直接把redis中的对应数据删除,下次查询数据会重新写入缓存。
我们的业务对一致性要求不是很高,因此采用了先操作mysql,后删除redis。在写数据库和删除缓存行代码之间如果有查询请求依然会查询到Redis中的老数据,但是这种情况非常极端,而且我们的业务也能容忍这种短暂的脏数据。
我还知道其他方案,比如延迟双删 , 监听Mysql事务日志自动同步Redis等。
SpringCache常用注解
@EnableCaching:打在主启动类上,开启缓存功能
@Cacheable:打在方法上,表示该方法会开启缓存,打在类上,表示类中所有的方法都开启缓存,方法的返回值会自动写入缓存。如果缓存中已经有数据,方法将不会被调用,而是拿着缓存数据直接返回给客户端。
@CacheEvict:搭载类或者方法上,会将缓存清除
@CachePut:更新缓存
@Caching:组合操作,要应用于方法的多个缓存操作
@CacheConfig:打在类上,共享的一些常见缓存设置
了解缓存击穿,穿透,雪崩吗?怎么处理?
缓存穿透:是指缓存和数据库中都没有的数据,而用户不断发起请求-可能为恶意攻击,导致数据库压力过大
1.接口层增加校验,如用户鉴权,或者id的基础校验,直接拦截
2.对于都取不到的数据,设置为key-null存储到缓存中,缓存设置有效时间,防止同一个key请求反复攻击
缓存击穿:指的是缓存中没有,但是数据库的有,在同一时间,多个请求同时获取不到缓存中数据,又同时获取数据库中的数据,导致数据库压力过大
1.设置热点数据永不过期
2.加互斥锁,只能允许一个线程访问数据库,然后其它的线程就可以往内存里拿
缓存雪崩:是指缓存中大部分数据过期,而查询数据量大,导致数据库压力大
1.热点数据永不过期
2.给缓存中的数据设置随机过期时间
3.缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中
Redis的主从有什么优点,和缺点?
优点是读写分离,分担了读的压力,同时能起到备份作用,防止数据丢失
缺点是不能分担写的压力,主的单点故障没有解决,存储没有得到扩容
解释一下Redis的哨兵模式。哨兵的不足?
当主服务器中断服务后,可以将一个从服务器升级为主服务器 ,以便继续提供服务
哨兵就是用来监控主从服务器,实现故障恢复功能的。它会不断的检查主服务器和从服务器的健康状态,当某个服务器出现问题时,可以向管理员发起通知。如果主服务器不可用时,会自动选择一个从服务器作为新的主服务器,并让其他的从服务器从新的主服务器复制数据
哨兵也是主从模式,没有解决写的压力,只减轻了读的压力,而且存储也得不到扩容
Redis的cluster集群怎么存储数据的?
Redis Cluster集群实现了redis分布式存储,也就是每台redis节点存储不同的内容,采用哈希槽 (hash slot)的方式来分配的。它默认分配了16384个槽位,当我们set一个key 时,会用CRC16算法得到所属的槽位,然后将这个key 分到对应区间的节点上