面试题答案
一键面试- 数据存储设计:
- 使用Redis的字符串类型(String)结合位操作:
- 可以为每种状态分配一个单独的Redis字符串键。例如,对于“在线”状态,可以使用键
online_status_bitmap
,“离线”状态使用键offline_status_bitmap
,“故障”状态使用键fault_status_bitmap
等。 - 每个字符串的长度(以字节为单位)应足够容纳千万级设备的状态标识。因为每个设备状态用1位标识,1字节 = 8位,假设有N(千万级,如N = 10000000)个设备,则需要的字节数为
ceil(N / 8)
。
- 可以为每种状态分配一个单独的Redis字符串键。例如,对于“在线”状态,可以使用键
- 使用Redis的字符串类型(String)结合位操作:
- 操作逻辑:
- 写入操作:
- 当某个设备状态发生变化时,根据设备ID和对应的状态键,使用
SETBIT
命令来设置相应的位。例如,如果设备ID为device_123
进入“在线”状态,在online_status_bitmap
键上执行SETBIT online_status_bitmap device_123 1
,如果设备离线则执行SETBIT online_status_bitmap device_123 0
。
- 当某个设备状态发生变化时,根据设备ID和对应的状态键,使用
- 读取操作(统计每种状态的设备总数):
- 使用
BITCOUNT
命令来统计每种状态键中值为1的位数,即处于该状态的设备总数。例如,要统计在线设备总数,执行BITCOUNT online_status_bitmap
,此命令可以高效地返回处于在线状态的设备数量。由于BITOP
命令主要用于对多个位图进行逻辑运算,在这里统计每种状态总数时,直接使用BITCOUNT
更为合适,如果后续有需要对多个状态进行逻辑运算(如在线且无故障设备数等场景),可以使用BITOP
命令,例如:BITOP AND result_key online_status_bitmap non_fault_status_bitmap
,然后对result_key
使用BITCOUNT
统计符合逻辑运算结果的设备数量。
- 使用
- 写入操作: