面试题答案
一键面试1. 用户签到场景
- 实际业务场景:在一个APP的用户签到功能中,需要记录用户每月的签到情况,以便统计连续签到天数、月签到次数等数据。
- 使用SETBIT命令解决问题:假设以用户ID作为键,以每月的日期作为偏移量(1 - 31)。当用户在某一天签到时,使用
SETBIT user:1 5 1
(假设用户ID为1,在当月第5天签到),将对应偏移量位置的二进制位设置为1,表示已签到。统计月签到次数时,可以使用BITCOUNT user:1
命令获取该键中值为1的二进制位数量,即签到次数。要统计连续签到天数,可以从最后一天开始向前遍历,直到遇到值为0的二进制位,统计中间值为1的二进制位数量。
2. 统计活跃用户场景
- 实际业务场景:网站或应用程序需要统计一段时间内(如一周、一个月)的活跃用户。活跃用户定义为在这段时间内至少登录过一次的用户。
- 使用SETBIT命令解决问题:以时间周期(如一周,7天)作为键,以用户ID作为偏移量。每当一个用户登录时,例如用户ID为100在该周内登录,使用
SETBIT week:active_users 100 1
将对应偏移量位置的二进制位置为1。统计活跃用户数量时,使用BITCOUNT week:active_users
获取值为1的二进制位数量,即活跃用户数。
3. 布隆过滤器场景
- 实际业务场景:在爬虫系统中,需要判断一个URL是否已经被爬取过,以避免重复爬取。由于URL数量可能非常庞大,传统的哈希表存储方式占用内存过大,此时可以使用布隆过滤器。
- 使用SETBIT命令解决问题:布隆过滤器本质上是一个位数组。假设有多个哈希函数
hash1
、hash2
、hash3
。对于一个URL,通过这些哈希函数计算出不同的哈希值,这些哈希值对应位数组的偏移量。例如,通过hash1(url)
得到偏移量10,hash2(url)
得到偏移量20 ,hash3(url)
得到偏移量30 。使用SETBIT bloom_filter 10 1
、SETBIT bloom_filter 20 1
、SETBIT bloom_filter 30 1
将这些偏移量位置的二进制位置为1。当判断一个URL是否已经爬取过时,同样通过哈希函数计算偏移量,检查这些偏移量位置的二进制位是否都为1,如果是,则大概率该URL已经被爬取过(存在误判可能性)。