2024年最全【Redis】线上Redis实战应用(3),2024年最新四年Golang面试遇到的问题整理

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取


* 使用缓存:  
 ①**Redis原生客户端**;



public User findUserById(String userId) throws Exception{
// 1、先读取缓存
Object cacheValue = redisTemplate.opsForValue().get (userId);
if (cacheValue != null) {
System.out.println(“###缓存命中:” + ((User)cacheValue).getUname());
return (User) cacheValue;
}
//以下代码是异常情况下执行
// 2、如果缓存miss, 则查询数据库
User user = userDao.findUserById (userId);
System.out.println(“###缓存miss:” + user.getUname());

// 3、设置缓存(重建缓存)
redisTemplate.opsForValue().set(userld, user);
return user;

}


②**缓存+注解**;



@chche
public User findUserById(String userId){
User user = userDao.findUserById(userId);
System.out.println(“###缓存miss:” + user.getUname());
return user;
)


### 二、Redis相关术语



> 
> * 缓存命中:数据直接从Redis缓存中读取到;
> * 缓存Miss:数据在Redis缓存中没有读取到,查询数据库;
> * 缓存重建:从数据库中读取数据并放到Redis缓存中;
> 
> 
> 


#### 1、缓存穿透


(1)缓存穿透是指用户想要查询一个数据,**发现redis内存数据库没有,缓存Miss,于是向持久层数据库查询,发现也没有,查询失败**,当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库,给持久层数据库造成很大的压力,出现缓存穿透。



> 
>   缓存穿透查询一个根本不存在的数据,导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储层的意义。
> 
> 
> 


(2)解决方案:


* **布隆过滤器**:对所有可能查询的参数以hash形式存储,当用户想要查询的时候,使用布隆过滤器发现不在集合中,就直接丢弃,不再对持久层查询。
* **缓存空对象**:当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源;


#### 2、缓存击穿


(1)缓存击穿是指**针对一个设置了过期时间的key**,某些时间段大并发的集中对这个key进行访问,当这个**key在一个瞬间失效(缓存过期)了**,大量的访问会直接请求数据库,给数据库瞬间造成极大的压力。



> 
> 缓存击穿是针对某一特定的key缓存,缓存雪崩是针对很多key缓存。
> 
> 
> 


(2)解决方案:


* **设置热点数据永不过期;**
* 后台定义一个job(定时任务)专门**主动更新缓存数据**,比如,一个缓存中的数据过期时间是30分钟,那么job每隔29分钟定时刷新数据(将从数据库中查到的数据更新到缓存中),这种方案比较容易理解,但会增加系统复杂度,适合那些 key 相对固定,cache 粒度较大的业务,key 比较分散的则不太适合,实现起来也比较复杂。
* 使用**分布式锁**,保证在高并发情况下每次同时只有一个线程去查询数据库,没有获得分布式锁权限的线程,等待。


#### 3、缓存雪崩


(1)缓存雪崩是指**大量设置了过期时间的key**,过期时间相同,在**同一时间失效**,所有的访问会直接请求数据库,数据库无法承受如此大的压力,系统崩溃,单系统挂掉,其他依赖于该系统的应用也会出现问题甚至崩溃。  
 (2)解决方案:


* **搭建集群**,Redis集群,一台挂掉之后其他的还可以继续工作;
* **限流降级**,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量;
* **数据预热**,在正式部署之前,先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。
* **过期时间**,在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。


### 三、Redis线上部署



> 
> 性能指标:
> 
> 
> * **TPS**(Transaction Per Second):**数据库每秒执行的事务数**,以commit为准。
> * **QPS**(Query Per Second):**数据库每秒执行的SQL数**(含insert、select、update、delete 等)。
> 
> 
> 


#### 1、涉及到的系统(3个)


* **JAVA服务器——接收用户请求**
* **Redis服务器——数据缓存**
* **MySQL服务器——数据存取**


#### 2、部署设计


**JAVA服务器集群 + 单个Redis服务器 + 单个MySQL服务器**



> 
>   双11之前,服务器会预热(开放访问之前,把数据库中的数据按需提前加载到Redis缓存中),商家的活动会提前配置好,用户的信息等会进行资源锁定。
> 
> 
> 



> 
> MySQL硬件配置要求高于Redis,在同样的硬件条件下,性能远低于Redis。
> 
> 
> 


### 四、线上注意问题


#### 1、什么情况下会出现缓存Miss?


  肯定是经过测试,缓存功能有效的情况下才上线运行,持续运行一段时间后才出现缓存Miss,运行过程中出现缓存Miss,会导致一系列问题(缓存穿透、缓存击穿、缓存雪崩),运行前出现缓存Miss,可以通过预热解决。


* **重启**之后内存中的数据消失
* 内存中存放的**数据太多**
* **有效期机制**,过期自动删除
* **网络不通**,Redis服务器和Java服务器之间网络不通


#### 2、如何避免缓存Miss?


  内存方面的问题没有办法解决,网络方面的问题可以不考虑,所以关键在于过期时间方面。Redis默认永不过期。  
 (1)针对**数据量小的**,**不设置过期时间**,在缓存场景中要注意增量数据;  
 (2)**数据量大的**情况下,要设置过期时间


* **固定过期时间**,所有缓存数据过期时间一致;
* **动态过期时间**,缓存数据随机,避免同一时间大量缓存失效;
* **不同数据不同过期时间**,热点数据可以设置为永不过期;


#### 3、能不能完全规避缓存Miss?


  从Redis的原理角度来说,无法100%规避。因为重启之后内存中的数据就没了。


* **不能保证硬件不出问题**,断电、硬件损坏、磁盘损坏;
* **持久化**也不能解决重启数据丢失问题;
* **主从集群**,避免单台机器出故障,数据不一致;



> 
>   Redis默认数据存放在内存中,持久化机制就是把内存中的数据放到一个文件中,保存在磁盘中,将内存的数据同步到磁盘。
> 
> 
> * 全量持久化RDB,定时任务,周期性保存当前所有数据,系统可能在持久化之前就挂掉;
> * 增量持久化AOF,实时记录Redis每条写操作,三种方式(不记录、每秒记录一次、每个操作都记录),效率会受影响。
> 
> 
> 



> 
>   主从集群是为了防止出现单点故障,同步数据到多台Redis服务器,同步过程是异步的,会导致主从集群的数据不一致。
> 
> 
> 


#### 4、如何降低缓存Miss的影响?


  系统雪崩需要满足两个条件:**缓存Miss、大量访问请求数据库**。  
   缓存Miss只能避免出现,不能100%规避,所以关键在于数据库,不要让大量访问直接请求数据库,数据库查询代码执行时,同一时间不要太多次。


* **加锁**,每次只让一个请求查询数据库,其他请求等待;



img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

转存中…(img-u8SY8Myu-1715722778061)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值