diff --git a/src/main/java/com/ycwl/basic/constant/FaceConstant.java b/src/main/java/com/ycwl/basic/constant/FaceConstant.java new file mode 100644 index 0000000..86e1d3b --- /dev/null +++ b/src/main/java/com/ycwl/basic/constant/FaceConstant.java @@ -0,0 +1,5 @@ +package com.ycwl.basic.constant; + +public class FaceConstant { + public static final String FACE_DB_NAME_PFX="face:db:"; +} diff --git a/src/main/java/com/ycwl/basic/service/impl/task/TaskFaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/task/TaskFaceServiceImpl.java index e46466b..1200703 100644 --- a/src/main/java/com/ycwl/basic/service/impl/task/TaskFaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/task/TaskFaceServiceImpl.java @@ -9,11 +9,14 @@ import com.aliyuncs.facebody.model.v20191230.AddFaceResponse; import com.aliyuncs.facebody.model.v20191230.CreateFaceDbRequest; import com.aliyuncs.facebody.model.v20191230.DeleteFaceDbRequest; import com.aliyuncs.facebody.model.v20191230.DeleteFaceEntityRequest; +import com.aliyuncs.facebody.model.v20191230.ListFaceDbsRequest; +import com.aliyuncs.facebody.model.v20191230.ListFaceDbsResponse; import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesRequest; import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesResponse; import com.aliyuncs.facebody.model.v20191230.SearchFaceRequest; import com.aliyuncs.facebody.model.v20191230.SearchFaceResponse; import com.ycwl.basic.config.FaceDetectConfig; +import com.ycwl.basic.constant.FaceConstant; import com.ycwl.basic.exception.BaseException; import com.ycwl.basic.mapper.FaceMapper; import com.ycwl.basic.mapper.FaceSampleMapper; @@ -31,6 +34,7 @@ import com.ycwl.basic.utils.AliFaceUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; @@ -52,6 +56,8 @@ public class TaskFaceServiceImpl implements TaskFaceService { private ScenicMapper scenicMapper; @Autowired private FaceDetectConfig faceDetectConfig; + @Autowired + private RedisTemplate redisTemplate; private IAcsClient getClient() { DefaultProfile profile = DefaultProfile.getProfile( @@ -59,6 +65,7 @@ public class TaskFaceServiceImpl implements TaskFaceService { IAcsClient client = new DefaultAcsClient(profile); return client; } + @Override public SearchFaceRespVo searchFace(Long scenicId, Long faceId) { FaceRespVO faceRespVO = faceMapper.getById(faceId); @@ -176,9 +183,9 @@ public class TaskFaceServiceImpl implements TaskFaceService { } @Override - public void deleteFaceDB(Long scenicId) { + public void deleteFaceDB(String dbName) { ListFaceEntitiesRequest request = new ListFaceEntitiesRequest(); - request.setDbName(scenicId.toString()); + request.setDbName(dbName); request.setLimit(200); IAcsClient client = getClient(); try { @@ -204,26 +211,60 @@ public class TaskFaceServiceImpl implements TaskFaceService { }); } DeleteFaceDbRequest deleteFaceDbRequest = new DeleteFaceDbRequest(); - deleteFaceDbRequest.setName(scenicId.toString()); - try { - client.getAcsResponse(deleteFaceDbRequest); - } catch (ClientException e) { - log.error("删除人脸数据库失败!", e); - } + deleteFaceDbRequest.setName(dbName); + client.getAcsResponse(deleteFaceDbRequest); + removeFaceDBCache(dbName); } catch (ClientException e) { log.error("删除人脸数据库失败!", e); } } @Override - public void createFaceDB(Long scenicId) { + public void createFaceDB(String dbName) { try { CreateFaceDbRequest request = new CreateFaceDbRequest(); - request.setName(scenicId.toString()); + request.setName(dbName); IAcsClient client = getClient(); client.getAcsResponse(request); + addFaceDBCache(dbName); } catch (ClientException e) { log.error("阿里云添加人脸数据库失败!", e); } } + + public void addFaceDBCache(String dbName) { + redisTemplate.opsForValue().set(FaceConstant.FACE_DB_NAME_PFX + dbName, "1"); + } + + public Boolean removeFaceDBCache(String dbName) { + return redisTemplate.delete(FaceConstant.FACE_DB_NAME_PFX + dbName); + } + + public Boolean clearFaceDBCache() { + return redisTemplate.delete(FaceConstant.FACE_DB_NAME_PFX + "*"); + } + + @Override + public void assureFaceDB(String dbName) { + if (redisTemplate.hasKey(FaceConstant.FACE_DB_NAME_PFX + dbName)) { + return; + } + try { + ListFaceDbsRequest request = new ListFaceDbsRequest(); + request.setLimit(Long.MAX_VALUE); + IAcsClient client = getClient(); + ListFaceDbsResponse response = client.getAcsResponse(request); + if (response.getData().getDbList() == null) { + return; + } + boolean mismatch = response.getData().getDbList().stream().peek(item -> { + redisTemplate.opsForValue().set(FaceConstant.FACE_DB_NAME_PFX + dbName, "1"); + }).noneMatch(db -> db.getName().equals(dbName)); + if (mismatch) { + createFaceDB(dbName); + } + } catch (ClientException e) { + log.error("阿里云确保人脸数据库失败!", e); + } + } } diff --git a/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java b/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java index f4ed868..29dae3d 100644 --- a/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java +++ b/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java @@ -13,7 +13,9 @@ public interface TaskFaceService { void batchDeleteFace(Long scenicId); - void deleteFaceDB(Long scenicId); + void deleteFaceDB(String scenicId); - void createFaceDB(Long scenicId); + void createFaceDB(String scenicId); + + void assureFaceDB(String scenicId); }