MST

星途 面试题库

面试题:Redis SETBIT命令在实际场景中的应用

请举例说明在哪些实际业务场景中会使用到Redis的SETBIT命令,并阐述如何使用它来解决问题。
26.7万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

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命令解决问题:布隆过滤器本质上是一个位数组。假设有多个哈希函数hash1hash2hash3。对于一个URL,通过这些哈希函数计算出不同的哈希值,这些哈希值对应位数组的偏移量。例如,通过hash1(url)得到偏移量10,hash2(url)得到偏移量20 ,hash3(url)得到偏移量30 。使用SETBIT bloom_filter 10 1SETBIT bloom_filter 20 1SETBIT bloom_filter 30 1将这些偏移量位置的二进制位置为1。当判断一个URL是否已经爬取过时,同样通过哈希函数计算偏移量,检查这些偏移量位置的二进制位是否都为1,如果是,则大概率该URL已经被爬取过(存在误判可能性)。