fix(ops): 同步区域设备关联配置至 Redis 缓存
- 修复管理后台更新、绑定、解绑设备关联配置时未清理缓存导致旧配置(如客流阈值)在24小时内依然生效的问题 - 采用 Cache-Aside 模式,在 DB 操作后主动逐出 (evictConfigCache) 对应区域的关联类型缓存,确保高可用和强一致性 - 补充 AreaDeviceService Mock,修复并更新对应单元测试
This commit is contained in:
@@ -34,14 +34,17 @@ import static com.viewsh.module.ops.enums.AreaTypeEnum.*;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class AreaDeviceRelationServiceImpl implements AreaDeviceRelationService {
|
public class AreaDeviceRelationServiceImpl implements AreaDeviceRelationService {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private OpsAreaDeviceRelationMapper opsAreaDeviceRelationMapper;
|
private OpsAreaDeviceRelationMapper opsAreaDeviceRelationMapper;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private OpsBusAreaMapper opsBusAreaMapper;
|
private OpsBusAreaMapper opsBusAreaMapper;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private IotDeviceQueryApi iotDeviceQueryApi;
|
private IotDeviceQueryApi iotDeviceQueryApi;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private AreaDeviceService areaDeviceService;
|
||||||
|
|
||||||
private static final String TYPE_TRAFFIC_COUNTER = "TRAFFIC_COUNTER";
|
private static final String TYPE_TRAFFIC_COUNTER = "TRAFFIC_COUNTER";
|
||||||
private static final String TYPE_BEACON = "BEACON";
|
private static final String TYPE_BEACON = "BEACON";
|
||||||
@@ -114,9 +117,13 @@ public class AreaDeviceRelationServiceImpl implements AreaDeviceRelationService
|
|||||||
.enabled(true)
|
.enabled(true)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
opsAreaDeviceRelationMapper.insert(relation);
|
opsAreaDeviceRelationMapper.insert(relation);
|
||||||
return relation.getId();
|
|
||||||
}
|
// 清除可能存在的 NULL_CACHE 标记
|
||||||
|
areaDeviceService.evictConfigCache(relation.getAreaId(), relation.getRelationType());
|
||||||
|
|
||||||
|
return relation.getId();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@@ -134,24 +141,32 @@ public class AreaDeviceRelationServiceImpl implements AreaDeviceRelationService
|
|||||||
relation.setConfigData(updateReq.getConfigData());
|
relation.setConfigData(updateReq.getConfigData());
|
||||||
}
|
}
|
||||||
|
|
||||||
// enabled 更新
|
// enabled 更新
|
||||||
if (updateReq.getEnabled() != null) {
|
if (updateReq.getEnabled() != null) {
|
||||||
relation.setEnabled(updateReq.getEnabled());
|
relation.setEnabled(updateReq.getEnabled());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
opsAreaDeviceRelationMapper.updateById(relation);
|
||||||
|
|
||||||
|
// 删缓存以同步 Redis
|
||||||
|
areaDeviceService.evictConfigCache(existing.getAreaId(), existing.getRelationType());
|
||||||
|
}
|
||||||
|
|
||||||
opsAreaDeviceRelationMapper.updateById(relation);
|
@Override
|
||||||
}
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Boolean unbindDevice(Long id) {
|
||||||
@Override
|
OpsAreaDeviceRelationDO existing = opsAreaDeviceRelationMapper.selectById(id);
|
||||||
@Transactional(rollbackFor = Exception.class)
|
if (existing == null) {
|
||||||
public Boolean unbindDevice(Long id) {
|
return false;
|
||||||
OpsAreaDeviceRelationDO existing = opsAreaDeviceRelationMapper.selectById(id);
|
}
|
||||||
if (existing == null) {
|
|
||||||
return false;
|
boolean deleted = opsAreaDeviceRelationMapper.deleteById(id) > 0;
|
||||||
}
|
if (deleted) {
|
||||||
|
// 同步 Redis 缓存
|
||||||
return opsAreaDeviceRelationMapper.deleteById(id) > 0;
|
areaDeviceService.evictConfigCache(existing.getAreaId(), existing.getRelationType());
|
||||||
}
|
}
|
||||||
|
return deleted;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 转换为响应 VO
|
* 转换为响应 VO
|
||||||
|
|||||||
@@ -43,11 +43,14 @@ class AreaDeviceRelationServiceTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private OpsAreaDeviceRelationMapper opsAreaDeviceRelationMapper;
|
private OpsAreaDeviceRelationMapper opsAreaDeviceRelationMapper;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private OpsBusAreaMapper opsBusAreaMapper;
|
private OpsBusAreaMapper opsBusAreaMapper;
|
||||||
|
|
||||||
@InjectMocks
|
@Mock
|
||||||
private AreaDeviceRelationServiceImpl areaDeviceRelationService;
|
private AreaDeviceService areaDeviceService;
|
||||||
|
|
||||||
|
@InjectMocks
|
||||||
|
private AreaDeviceRelationServiceImpl areaDeviceRelationService;
|
||||||
|
|
||||||
private OpsBusAreaDO testArea;
|
private OpsBusAreaDO testArea;
|
||||||
private OpsAreaDeviceRelationDO testRelation;
|
private OpsAreaDeviceRelationDO testRelation;
|
||||||
|
|||||||
Reference in New Issue
Block a user