问题
💬 Question 1
Q:我看你做的项目中,都用到了 Redis,你在最近的项目中哪些场景使用了 Redis 呢?
A:
- 一个比较常见的场景是缓存一些访问频率比较高、但不经常变动的数据,比如用户信息、权限菜单这类的。我们会把这些数据缓存到 Redis 里,访问的时候就不用每次都查数据库了,能减轻数据库压力,也可以提升系统的响应速度。
- 还有就是缓存登录相关的信息。在用户登录成功以后,我们会把 token 和对应的用户信息一起存到 redis 里,并且设置一个过期时间。这样做主要是为了后续权限校验方便,也支持像自动登录、单点登录这类功能。
💬 Question 2
Q:什么叫缓存穿透?都是如何解决的呢?
A:用户请求的数据缓存里没有,数据库里也找不到。这样的话,每次请求都会直接打到数据库上,数据库压力就会很大,时间久了甚至可能会宕机。解决方式的话有两种,一种是缓存空数据,就是数据库查不到结果时,也把空值缓存起来,不过这样会占用比较多的内存,因此我们一般选择另一种方式即布隆过滤器,这种方式可以有效避免缓存穿透且内存占用较少。
💬 Question 3
Q:什么是布隆过滤器?
A:其实它相当于是一个以(bit)位为单位的数组,数组中每个单元只能存储二进制数0或1。
在 redis 缓存预热时,会先把缓存中的有效数据通过多个哈希函数映射到布隆过滤器的位数组上,将对应的索引位置置为 1。当有请求进来时,会用相同的哈希函数计算该数据对应的索引位置。若索引位置都为1,则说明数据“可能存在”,有一定误判的可能,但只要有一个索引位置是 0,就可以确定该数据一定不存在,直接返回,避免无效请求打到数据库。