苍穹外卖面试题准备
- 讲讲 redis,它在你的项目中作用是什么?
- 在你的项目中 redis 作为缓存, MySQL 的数据如何与 redis 进行同步呢?
- 如何解决 Redis 的缓存穿透问题
- redis 的淘汰机制是怎么样的?
- redis 的 IO 多路复用是什么?
- 商品超卖问题如何解决?
- 讲讲什么是 Httpclient(DAY06微信登录模块
- MD5加密
- nginx反向代理与负载均衡(视频P10-P11
- jwt token ThreadLocal 拦截器(还没理解
讲讲 redis,它在你的项目中作用是什么?
Redis 是高性能的,基于键值对的,写入缓存的 内存存储系统。它支持多种数据结构如字符串、哈希表、列表、集合、有序集合等,并提供了丰富的操作命令。项目中引入 Redis 的地方是:查询店铺营业状态 ,像这种店铺营业状态,本项目无非就两个状态:营业中/打样。而且它属于高频查询。只要用户浏览到这个店铺,前端就要自动发送请求到后端查询店铺状态。Redis 是基于键值对这种形式存储的,而且 Redis 也把将数据放到缓存中,而不是磁盘,有效缓解了这种高频查询给磁盘带来的压力。
在你的项目中 redis 作为缓存, MySQL 的数据如何与 redis 进行同步呢?
苍穹外卖这个项目中用户在查看店铺状态时,需要让数据库与 redis 高度保持一致,因为如果店铺没有营业的话就不能点单了,所以它要求时效性比较高,所以采用的读写锁保证的强一致性。我们采用的是 redisson 实现的读写锁,在读的时候添加共享锁,可以保证读读不互斥,读写互斥。当我们更新数据的时候,添加排他锁,它是读写,读读都互斥,这样就能保证在写数据的同时是不会让其他线程读数据的,避免了脏数据。这里面需要注意的是读方法和写方法上需要使用同一把锁才行。
如何解决 Redis 的缓存穿透问题
- 缓存穿透是指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。这种情况大概率是遭到了攻击。
- 使用布隆过滤器来解决缓存穿透:主要是用于检索一个元素是否在一个集合中。我们当时使用的是 redisson 实现的布隆过滤器。它的底层主要是先去初始化一个比较大数组,里面存放的二进制 0 或 1。在一开始都是 0,当一个 key 来了之后经过 3 次 hash 计算,模于数组长度找到数据的下标然后把数组中原来的 0 改为 1,这样的话,三个数组的位置就能标明一个 key 的存在。查找的过程也是一样的。当然是有缺点的,布隆过滤器有可能会产生一定的误判,我们一般可以设置这个误判率,大概不会超过 5%,其实这个误判是必然存在的,要不就得增加数组的长度,其实已经算是很划分了,5%以内的误判率一般的项目也能接受,不至于高并发下压倒数据库。
redis 的淘汰机制是怎么样的?
- 数据的淘汰策略:当 Redis 中的内存不够用时,此时在向 Redis 中添加新的 key,那么 Redis 就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。
- 这个在 redis 中提供了很多种,默认是 noeviction,不淘汰任何 key,但是内存满时不允许写入新数据。还有随机淘汰以及 LRU(最少最近使用)和 LFU(最少频率使用)等等。
redis 的 IO 多路复用是什么?
Redis 的 IO 多路复用是一种技术,允许 Redis 同时监听多个客户端连接,并在有数据到达时及时处理,提高了 IO 效率和性能。它通过一种机制来管理和处理多个连接,使得 Redis 能够高效地处理大量客户端请求。
商品超卖问题如何解决?
-
- 悲观锁: 在商品购买过程中,使用悲观锁(Pessimistic Locking)对库存进行加锁,确保同一时间只有一个用户可以执行减库存操作,避免并发冲突导致的超卖问题。例如,在数据库层面使用数据库行级锁或者事务进行控制。
- 乐观锁: 使用乐观锁(Optimistic Locking)进行并发控制。在购买商品时,先查询当前库存数量,然后在更新库存时进行版本号比对,如果版本号一致才执行更新操作,否则返回库存不足错误。这种方式适用于读多写少的场景。
- 分布式锁: 在分布式系统中,使用分布式锁对库存进行加锁,确保同一时间只有一个节点可以执行库存减少操作,避免多个节点之间的并发冲突。
讲讲什么是 Httpclient(DAY06微信登录模块
Httpclient是一个服务器端进行 HTTP 通信的库,他使得后端可以发送各种 HTTP 请求和接收 HTTP 响应,使用 HTTPClient,可以轻松的发送 GET, POST, PUT, DELETE 等各种类型的的请求。
在我们的项目中,在进行微信登录开发时,后端在使用登录凭证校验接口的时候就需要发送指定请求到给定的 URL 中。因此我们使用 Httpclient 去完成该任务。
MD5加密
nginx反向代理与负载均衡(视频P10-P11
- 正向代理:
正向代理是客户端发送请求后通过代理服务器访问目标服务器,代理服务器代表客户端发送请求并将响应返回给客户端。正向代理隐藏了客户端的真实身份和位置信息,为客户端提供代理访问互联网的功能。 - 反向代理:
反向代理是指代理服务器接收客户端的请求,然后将请求转发给后端服务器,并将后端服务器的响应返回给客户端。反向代理隐藏了服务器的真实身份和位置信息,客户端只知道与反向代理进行通信,而不知道真正的服务器。
jwt token ThreadLocal 拦截器(还没理解
(DAY01用户登录模块
(DAY06微信登录模块