面试题答案
一键面试使用Redis实现分页展示
在Redis的有序集合中,可以使用ZRANGE
命令来实现按成绩分页展示用户信息。ZRANGE
命令可以返回有序集合中指定区间内的成员,语法如下:
ZRANGE key start stop [WITHSCORES]
key
是有序集合的键名,start
和 stop
是索引值,用于指定返回的区间。索引值从0开始,其中 -1
表示最后一个元素,-2
表示倒数第二个元素,以此类推。如果加上 WITHSCORES
选项,则返回的结果中会包含成员的分数。
假设有序集合的键名为 user_scores
,要实现每页显示10条数据,第 n
页的查询命令如下:
ZRANGE user_scores (n - 1) * 10 n * 10 - 1 WITHSCORES
这里 (n - 1) * 10
是起始索引,n * 10 - 1
是结束索引,通过这种方式可以获取到第 n
页的10条用户成绩信息。
高并发场景下可能出现的问题及优化思路
- 缓存击穿:在高并发情况下,可能会有大量请求同时查询某一页数据,当这一页数据在缓存中失效时,所有请求都会直接访问数据库,给数据库带来巨大压力。
- 优化思路:
- 使用互斥锁:在缓存失效时,只允许一个请求去查询数据库并更新缓存,其他请求等待。可以使用Redis的
SETNX
命令来实现互斥锁。 - 热点数据永不过期:对于经常访问的热点页面数据,设置一个超长的过期时间,或者不设置过期时间,定期在后台更新数据。
- 使用互斥锁:在缓存失效时,只允许一个请求去查询数据库并更新缓存,其他请求等待。可以使用Redis的
- 优化思路:
- 缓存雪崩:如果大量数据在同一时间过期,可能会导致大量请求直接访问数据库,造成数据库压力过大甚至崩溃。
- 优化思路:
- 分散过期时间:避免设置相同的过期时间,在原过期时间基础上加上一个随机值,让数据的过期时间分散开来。
- 二级缓存:使用两级缓存,如一级缓存为Redis,二级缓存为本地缓存(如Guava Cache)。当一级缓存失效时,先从二级缓存获取数据,减轻数据库压力。
- 优化思路:
- 缓存穿透:如果有大量请求查询不存在的数据,这些请求都会绕过缓存直接访问数据库,可能导致数据库压力过大。
- 优化思路:
- 布隆过滤器:在查询数据前,先通过布隆过滤器判断数据是否存在。如果布隆过滤器判断数据不存在,则直接返回,不会查询数据库。
- 缓存空值:当查询到数据不存在时,也将空值缓存起来,并设置一个较短的过期时间,避免后续重复查询数据库。
- 优化思路: