From c65cf7ba05361366d1cf269e3f82a8e83dbb992a Mon Sep 17 00:00:00 2001
From: Jerry Yan <792602257@qq.com>
Date: Thu, 26 Dec 2024 14:04:23 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0RedisTemplate=EF=BC=8CassureD?=
 =?UTF-8?q?B=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/ycwl/basic/constant/FaceConstant.java |  5 ++
 .../impl/task/TaskFaceServiceImpl.java        | 61 ++++++++++++++++---
 .../basic/service/task/TaskFaceService.java   |  6 +-
 3 files changed, 60 insertions(+), 12 deletions(-)
 create mode 100644 src/main/java/com/ycwl/basic/constant/FaceConstant.java

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<String, String> 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);
 }