双木林lrb 2024-03-28 00:05 采纳率: 0%
浏览 15

人脸识别签到系统中参会人员签到状态数据更新的问题

我在设计“基于人脸识别签到管理系统”中遇到了一个数据更新的问题,想求见各位有什么更好的解决方案,web框架用的是SpringBoot,数据库是mysql和redis缓存。
我在设计人脸识别模块的时候,我使用了余弦相似度比较的方法来比对人脸的相似度,我在redis当中存放了以会议号为key,参会人员信息为value的数据,参会人员信息中包括了参会号码,参会人员姓名,参会人员的人脸特征以及参会人员的签到状态。
现在主要的问题就是,我每次从redis中获取了参会人员信息列表之后遍历列表中的参会人员的人脸特征进行余弦相似度比较,当相似度大于0.7时就修改对应参会人员的签到状态,问题就是,我修改了签到状态后更新信息到了redis当中,但是mysql的没有更新,如果我每次都把两个数据库都更新一遍就会导致很严重的性能问题,想请问各位有什么解决方法?

  • 写回答

5条回答 默认 最新

  • 专家-皆知 2024-03-28 00:05
    关注

    引自免费微信小程序:皆我百晓生

    您好,根据您的描述,我理解到您在处理人脸识别签到管理系统时遇到了一个数据更新问题。为了解决这个问题,我们可以采用以下方法:

    1. 使用异步更新:在签到过程中,当发现相似度大于0.7时,不直接修改MySQL数据库中的签到状态,而是将这一信息放入一个消息队列(如RabbitMQ或Kafka)中。然后,您可以使用一个单独的异步任务来处理这些消息,从而避免频繁地更新数据库。

    2. 使用乐观锁:在更新数据库之前,您可以使用乐观锁来检查MySQL中的数据是否已被其他应用程序更新。如果数据已被更新,则您可以先更新Redis中的数据,然后再更新MySQL。

    3. 使用分布式锁:如果您希望确保在多个数据库之间同步数据,可以使用分布式锁。在这种方法中,您可以使用Redis作为缓存,并在更新数据库之前获取一个锁。只有当锁被释放时,才会更新数据库。

    以下是使用乐观锁和分布式锁的示例代码:

    乐观锁示例:

    public class OptimisticLock {
        public static boolean lock(Connection connection, String resourceId, String lockKey, String lockValue) {
            try {
                PendingUpdate update = new PendingUpdate(resourceId, lockKey, lockValue);
                return update.tryLock(connection);
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    
        public static void unlock(Connection connection, String resourceId, String lockKey, String lockValue) {
            try {
                PendingUpdate update = new PendingUpdate(resourceId, lockKey, lockValue);
                update.unlock(connection);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    分布式锁示例:

    public class DistributedLock {
        public static boolean lock(String resourceId, String lockKey, String lockValue, String lockPath) {
            try {
                return Redisson.getRedisson().tryLock(lockPath + "/" + resourceId, 10, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
                return false;
            }
        }
    
        public static void unlock(String resourceId, String lockKey, String lockValue) {
            Redisson.getRedisson().unlock(lockPath + "/" + resourceId, lockKey, lockValue);
        }
    }
    

    这些示例代码需要根据您的实际项目进行调整。希望这些建议能帮助您解决问题。如果您需要进一步的帮助,请随时告诉我。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月28日

悬赏问题

  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数
  • ¥15 ADS时域 连续相位观察方法
  • ¥15 Opencv配置出错