一、缓存存储结构设计
- 分组与设备的映射关系(使用 Set 结构) :
- 键格式 :采用
group:{groupId}:devices
的格式作为 Redis 中 Set 的键,例如group:1:devices
就代表了分组 ID 为 1 的分组所关联的设备集合。 - 值内容 :Set 中的元素为设备 ID,如
device001
、device002
等。这样的设计使得可以方便且高效地判断某个设备是否属于特定分组、快速添加或移除设备到分组中,利用了 Set 数据结构操作成员的高效性(时间复杂度为 O(1)),非常适合维护分组与设备之间多对多的映射关系。
- 键格式 :采用
- 设备详细信息(使用 Hash 结构) :
- 键格式 :以
device:{deviceId}
作为键,像device:device001
即对应设备 ID 为device001
的设备详细信息存储位置。 - 值内容 :Hash 内部存储设备的各项属性,例如
{ "name": "设备名称", "status": "on", "type": "1" }
,通过不同的字段(field)存储设备名称、状态、类型等信息,便于后续根据设备 ID 精准查询和更新设备的某一项或多项属性,借助 Redis 的HGET
、HSET
等命令能灵活操作这些属性值。
- 键格式 :以
二、Spring Boot 中的实现示例
创建操作分组与设备缓存的服务类:
java
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Service
public class GroupDeviceCacheService {
private final RedisTemplate<String, String> redisTemplate;
public GroupDeviceCacheService(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}
// 添加设备到分组的方法
public void addDeviceToGroup(String groupId, String deviceId) {
redisTemplate.opsForSet().add("group:" + groupId + ":devices", deviceId);
}
// 从分组移除设备的方法
public void removeDeviceFromGroup(String groupId, String deviceId) {
redisTemplate.opsForSet().remove("group:" + groupId + ":devices", deviceId);
}
// 获取分组下所有设备 ID 的方法
public Set<String> getDevicesByGroup(String groupId) {
return redisTemplate.opsForSet().members("group:" + groupId + ":devices");
}
// 获取设备详细信息的方法
public Map<String, String> getDeviceInfo(String deviceId) {
return redisTemplate.opsForHash().entries("device:" + deviceId);
}
// 更新设备某一属性的方法(以更新状态为例)
public void updateDeviceStatus(String deviceId, String newStatus) {
redisTemplate.opsForHash().put("device:" + deviceId, "status", newStatus);
}
// 设置分组与设备映射关系缓存过期时间的方法(可按需调用)
public void setGroupDeviceMappingExpire(String groupId, long expireTime, TimeUnit timeUnit) {
redisTemplate.expire("group:" + groupId + ":devices", expireTime, timeUnit);
}
}
代码实现了如添加设备到分组、移除设备、查询分组下设备以及设备详细信息的获取和更新等核心功能,同时还可以设置缓存的过期时间来控制缓存数据的有效期。
三、优势与应用场景
- 优势 :
- 操作高效性:Set 结构用于分组与设备的映射,在添加、删除设备以及判断设备所属分组等操作上效率高;Hash 结构存储设备详细信息能快速查询和更新单个属性,整体提升了缓存数据的读写性能,满足频繁的设备管理操作需求。
- 数据清晰性与可维护性:两种结构清晰地划分了分组与设备的关联以及设备自身的属性信息,逻辑上易于理解和维护,无论是新增、修改还是查询相关数据,代码的可读性和可扩展性都较好。
- 灵活应对业务变化:可以方便地根据业务需求扩展设备属性(在 Hash 结构中添加新的 field),或者调整分组与设备的关联关系(通过 Set 操作),很好地适配智能家居业务场景下可能出现的变化。
- 应用场景 :
- 智能家居系统:用于管理家庭内不同房间分组(如客厅分组、卧室分组)下的各类智能设备(智能音箱、智能灯具等),可以快速查询设备状态、控制设备,也能方便地进行设备在不同房间分组间的迁移等操作。