智慧社区3.0
项目介绍:
此项目旨在推动成都市探索**超大城市社区发展治理新路**,由三个实验室负责三大内容
1、**研发社区阵地空间管理模块**:AI算法实现态势感知(如通过社区图片和视频、文本,对环境 空间质量、绿视率、安全感分数、压抑感分数等.....)
2、**社区服务机器人**:门禁控制、视频监控检测
3、**社区“微网实格”智慧管理综合服务平台**:党群服务、大数据管理、AI能力管理、与上面两 大块的集成
项目负责:
- 数据库设计:设计 MySQL 关系型数据库,配置 多数据源(MySQL + HDFS + Redis+OSS),确保数据存储高效、稳定。
- 后端接口开发:基于 Spring Boot + MyBatis Plus 开发 RESTful API,处理用户请求,保证前后端数据交互流畅。
- 分布式存储 & 文件管理:基于 HDFS + Redis + 对象存储 设计 缓存策略,优化数据查询性能。
项目亮点难点:
1.AOP(面向切面编程)+ Redis
2.多线程控制
问题一:
1. 为什么采用 AOP?
如果不使用AOP,则需要直接在代码中手写缓存逻辑
- 需要在 每个查询方法 中手动写 Redis 查询 + MySQL 查询 + Redis 存储,代码重复且维护成本高
- 如果有 多个业务场景,每个查询都要写 相同的逻辑,代码冗余
- 逻辑分散在多个地方,不便于统一管理和修改
2. 为什么使用 AOP + Redis?
AOP 允许我们在不改动业务逻辑的情况下,把缓存逻辑封装成一个可复用的模块,然后在需要的地方自动生效,避免手写大量重复代码。
AOP用到的场景:
- 社区居民 获取 政策法规、社区公告等
AOP 带来的优势:
✅ 解耦业务代码
- 把 缓存逻辑 和 业务逻辑 分离,业务代码更干净
- 业务代码 只关心业务,不需要关心 Redis 的处理逻辑
✅ 统一维护
- 以后要调整 Redis 缓存策略(比如过期时间、缓存结构),只需要修改 AOP 代码,不需要改动多个业务方法
✅ 提高代码复用性
- AOP 只写一次,所有查询都可以使用,不需要重复写 Redis 逻辑
✅ 便于扩展
- 未来如果要增加 缓存穿透、缓存击穿、缓存雪崩 处理逻辑,只需要改 AOP 一处代码,所有缓存逻辑都生效
总结:AOP + Redis 的核心注解
问题二:
监控视频流需要实时调用算法接口(如人脸识别、行为分析),单线程处理无法满足实时性要求。
基于 @Async(适用于 Spring 项目)
3.1 线程池配置
(拒绝策略--CallerRunsPolicy)当线程池无法接受新的任务时,它会将任务交给调用线程来执行,而不是抛出异常或丢弃任务。
3.2 视频帧提取与任务提交
- 使用 OpenCV 提取视频帧,封装为任务对象
- 将提取的视频帧提交到线程池处理。
3.3 异步回调与结果处理
使用 CompletableFuture:实现异步回调,处理算法接口返回的结果。
3.4 线程同步与资源管理
线程同步:使用 CountDownLatch 确保所有任务完成后执行后续操作。
项目提问:
你们为什么选择使用 Spring Security + JWT 进行用户认证,而不是 OAuth 或者其他方案?
我们选择 Spring Security + JWT 作为用户认证方案,主要基于以下几点考虑:
- 项目需求:轻量级认证,适用于前后端分离
- 由于我们的智慧社区平台是基于 Spring Boot + Vue 前后端分离 的架构,不适合传统的 Session 认证(因为 Session 需要服务器存储状态,无法跨域,且扩展性差)。
- JWT 采用 无状态认证,前端存储 Token 并在每次请求时携带,后端无需存储 Session,适合高并发场景。
- OAuth 过于复杂,不适合当前业务
- OAuth 适用于第三方授权登录,例如使用微信、GitHub 登录,但我们的系统主要是 内部用户(社区管理人员、居民),不涉及第三方授权,不需要 OAuth 这样的授权协议。
- 配置 OAuth2 服务器需要额外的授权流程,增加了系统复杂性,而 JWT 更加 轻量级,实现和维护都更简单。
- JWT 认证的优势
- 无状态:服务器不用存储用户状态,扩展性更强,适用于微服务架构。
- 安全性:JWT 可以存储用户权限信息,并通过签名(HMAC 或 RSA)防止篡改。
- 性能优化:相比传统 Session,每次请求都不需要查询数据库(Session 需要 Redis 存储),减轻数据库压力。
总结:考虑到我们的 前后端分离架构、内部用户管理 以及 轻量级认证需求,Spring Security + JWT 是最合适的方案。OAuth 适用于第三方授权,Session 适用于传统服务端渲染系统,而 JWT 更符合我们的高并发需求和无状态认证需求。
如何处理 JWT 失效和续期?
JWT 失效的主要挑战 :
- Token 过期后,用户体验受影响(需要重新登录)
- 如果设置较长的过期时间,会增加安全风险(Token 被盗用后有效期长)
- Token 有效期设计
- JWT(Access Token):有效期短,一般设为 15-30 分钟,用于每次请求身份验证。
- Refresh Token:有效期长,一般设为 7 天甚至更长,用于申请新的 Access Token。
- 自动续期策略(Sliding Expiration)
- 当 Access Token 过期时,前端可以使用 Refresh Token 访问后端,后端验证 Refresh Token 是否有效,如果有效,就 重新签发新的 Access Token 并返回给前端。
- 如果 Refresh Token 也过期,则要求用户重新登录。
- 安全性考虑
- Refresh Token 存储:前端使用 HttpOnly Cookie 存储 Refresh Token,避免被 JavaScript 读取,防止 XSS 攻击。
- 黑名单机制:如果用户主动登出或密码修改,后端会 将 Refresh Token 加入 Redis 黑名单,防止被继续使用。
总结:我们通过 短 Token + 刷新 Token 结合 HttpOnly Cookie 存储和 Redis 黑名单 机制,保证了用户体验(无感续期)和系统安全性(防止 Token 被滥用)。
- 你们的 JWT 续期是在前端还是后端实现的?(建议说 前端在 Token 过期前会主动请求刷新)
- 如果 JWT 被盗,如何避免滥用?(可以回答 绑定 IP、设备信息,并使用 Redis 记录 Refresh Token 状态)
- 为什么不直接让 Access Token 过期时间更长?(可以回答 安全性考虑,避免 Token 被盗后长期有效)
MyBatis Plus相比传统 MyBatis 更具优势:
1. CRUD 代码简化,提高开发效率
传统 MyBatis 需要 手写 XML 或 Mapper 方法 来实现增删改查。
而 MyBatis Plus 直接提供了 BaseMapper,无需写 SQL 语句即可完成 CRUD
2. 内置分页插件,优化查询
MyBatis 需要手写分页 SQL,而 MyBatis Plus 提供了 PageHelper 插件,支持 IPage 分页查询:
面试官可能的追问
- MyBatis Plus 的分页插件底层如何实现?(可以回答 通过
LIMIT语句实现,适配不同数据库) - 如果使用 MyBatis Plus,是否还能手写复杂 SQL?(可以回答 支持自定义 SQL,使用
@Select或 XML 文件) - 你们的项目中是如何避免 MyBatis Plus SQL 注入的?(可以回答 使用
Wrapper进行参数绑定,避免拼接 SQL)
你们如何使用 Redis 进行缓存控制?有哪些缓存策略?
Redis 缓存策略(Cache Strategy):
在项目中,我们主要采用了以下 缓存策略:
- LRU(Least Recently Used):Redis 默认淘汰策略,最近最少使用的数据会被删除,避免缓存占用过多内存。
- TTL(Time To Live):给缓存数据设置过期时间,保证数据不会永久驻留,减少缓存不一致问题。
- 预热(Cache Warming):服务启动时,主动将高频访问数据写入 Redis,减少数据库压力。
- 定期刷新(Cache Refreshing):对某些关键数据(如统计数据)设定定期刷新机制,确保数据实时性。
- 分级缓存(Multi-Level Caching):使用 本地缓存 + Redis 缓存 结合,比如用户权限数据先查询本地缓存,未命中时再访问 Redis,提高访问效率。
相关文章:
智慧社区3.0
项目介绍: 此项目旨在推动成都市探索**超大城市社区发展治理新路**,由三个实验室负责三大内容 1、**研发社区阵地空间管理模块**:AI算法实现态势感知(如通过社区图片和视频、文本,对环境 空间质量、绿视率、安全感分…...
C#语法基础总结
输入和输出 输入 Console.Read(); 从屏幕读取一个字符,并返回该字符所对应的整型数字 Console.ReadLine(); 从屏幕读取一串字符,并返回该字符串 输出 Console.WriteLine(); 输出内容,并换行 Console.Write(); 输出内容,不换行…...
Springboot+Vue登录、注册功能(含验证码)(后端!)
我们首先写一个接口,叫login!然后对传入一个user,因为我们前端肯定是要传过来一个user,然后我们后端返回一个user,因为我们要根据这个去校验!我们还引入了一个hutool的一个东西,在pom文件里面引…...
深入理解 HTML 中的<div>和元素:构建网页结构与样式的基石
一、引言 在 HTML 的世界里,<div>和元素虽看似普通,却扮演着极为关键的角色。它们就像网页搭建过程中的万能积木,能够将各种 HTML 元素巧妙地组合起来,无论是构建页面布局,还是对局部内容进行样式调整ÿ…...
搞定python之八----操作mysql
本文是《搞定python》系列文章的第八篇,讲述利用python操作mysql数据库。相对来说,本文的综合性比较强,包含了操作数据库、异常处理、元组等内容,需要结合前面的知识点。 1、安装mysql模块 PyMySql模块相当于数据库的驱动&#…...
游戏立项时期随笔记录(1)
模拟经营的项目还没有完全结束,这几天又有可能涉及到一个新项目。感想随笔记录一下,防止忘记。今天一天整理这个,搞得今天没时间看数学和AI。 在 Unity3D 游戏前端主程序的立项时期,核心目标是明确技术方向、评估可行性、搭建基础…...
LVGL 中设置 UI 层局部透明,显示下方视频层
LVGL层次 LVGL自上而下分别是layer_sys > layer_top > lv_sreen_active > layer_bottom 即 系统层、顶层、活动屏幕、底层 原理 如果将UI设置为局部透明,显示下方的视频层,不仅仅需要将当前活动屏幕的背景设置为透明,还需要将底层…...
Debezium日常分享系列之:Debezium 3.1.0.Beta1发布
Debezium日常分享系列之:Debezium 3.1.0.Beta1发布 新特性和改进Debezium 平台的首次发布Percona 的最小锁定新的 Oracle 源信息 SCN 和时间戳字段Vitess Epoch/零日期列解析的变化Vitess 二进制排序的 tiny、medium 和 long 文本列的变化CloudEvent traceparent 支…...
21.多态
一、多态概念 多种形态。 静态多态:编译时多态。(函数重载) 动态多态:运行时多态。(继承关系下,调用父类指针或引用,对于不同的对象有不同的行为) 二、多态的定义及实现 1ÿ…...
【蓝桥杯】第十三届C++B组省赛
⭐️个人主页:小羊 ⭐️所属专栏:蓝桥杯 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 试题A:九进制转十进制试题B:顺子日期试题C:刷题统计试题D:修剪灌木试题E…...
C# PaddleOCR字符识别
1 安装Nuget 2 C# using System; using OpenCvSharp; using Sdcb.PaddleOCR; using Sdcb.PaddleOCR.Models.Local; using Sdcb.PaddleOCR.Models; using Sdcb.PaddleInference;namespace ConsoleApp1 {public class MichaelOCR{string imagePath "D:\\BUFFER\\VS\\Text\…...
网络爬虫相关
一、爬虫的基础内容 1、基本概念和用途 1.1、概念: 模拟浏览器、发送请求,获取响应。(只能获取客户端所展示出来的数据) 1.2、特点:知识碎片化,针对不同的网站对应的方法也不同。 爬虫:模拟…...
算法及数据结构系列 - 二分查找
系列文章目录 算法及数据结构系列 - BFS算法 文章目录 二分查找框架思路经典题型二分查找寻找左侧边界寻找右侧边界 刷题875. 爱吃香蕉的珂珂1011. 在 D 天内送达包裹的能力392. 判断子序列 二分查找 框架思路 int binarySearch(int[] nums, int target) {int left 0, righ…...
多环境开发-Profiles
在实际的项目开发中,我们通常会涉及多个环境,如开发环境(dev)、测试环境(test)和生产环境(pro)。在不同的环境下,程序的配置信息会有所不同,例如连接的数据库…...
《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现
《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现 《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现线程的概念引入线程的背景线程与进程的区别 线程创建与运行pthread_createpthread_join可在临界区内调用的函数工作&#…...
MambaVision:一种Mamba-Transformer混合视觉骨干网络
摘要 我们提出了一种新型混合Mamba-Transformer主干网络,称为MambaVision,该网络专为视觉应用而设计。我们的核心贡献包括重新设计Mamba公式,以增强其对视觉特征的高效建模能力。此外,我们还对将视觉Transformer(ViT&…...
【Visio使用教程】
Visio使用教程 1. Visio 的基本介绍1.1 Visio 是什么?核心特点: 1.2 主要功能与应用场景典型用途:行业应用: 1.3 版本与兼容性1.4 Visio下载1.5 安装 2. Visio 的界面与基础操作2.1 界面布局详解2.2 创建新文档与模板选择2.3 形状…...
深度学习-服务器训练SparseDrive过程记录
1、cuda安装 1.1 卸载安装失败的cuda 参考:https://blog.csdn.net/weixin_40826634/article/details/127493809 注意:因为/usr/local/cuda-xx.x/bin/下没有卸载脚本,很可能是apt安装的,所以通过执行下面的命令删除: a…...
什么是梯度方差和缩放因子
什么是梯度方差和缩放因子 目录 什么是梯度方差和缩放因子计算梯度方差(Fisher 信息)作用梯度方差计算方式(方差越大,参数越重要,小步更新(细致一些))示例使用缩放因子作用示例两者的区别总结在 LoRA(Low-Rank Adaptation)中,计算梯度方差和使用缩放因子是两个不同的概…...
Linux 如何上传本地文件以及下载文件到本地命令总结
如果你希望在 Shell 终端中将远程服务器上的文件下载到本地电脑,可以使用以下工具和命令: 1. rz / sz(用于 Xshell、MobaXterm 等终端) 如果你使用的是Xshell、SecureCRT、MobaXterm等支持 rz/sz 的终端,可以使用 rz …...
学习单片机需要多长时间才能进行简单的项目开发?
之前有老铁问我,学单片机到底要多久,才能进行简单的项目开发?是三个月速成,还是三年磨一剑? 今天咱们就来聊聊这个话题,我不是什么高高在上的专家,就是个踩过无数坑、烧过几块板子的“技术老友”…...
stm32 L432KC(mbed)入门第一课
目录 一. 前言 二. 专栏意义 三. MS入门第一课 一. 前言 新的一年MS课程又开始了,同时也到了该专栏的第三个年头。在前两年中,该专栏帮助了很多第一次接触单片机的同学。其中,有的同学订阅专栏是为了更好的完成并且通过MS这门课程…...
【面试手撕】非常规算法,多线程常见手撕题目
【面试手撕】非常规算法,多线程常见手撕题目 生产者消费者ReentrantLock实现的生产苹果/消费苹果synchronized实现的生产消费LinkedBlockingQueue阻塞队列方法实现多条件资源分配分布式任务调度模拟 交替打印两个线程交替打印1-100之间的数ReentrantLock 实现synchr…...
Python 基础语法详解
一、变量和数据类型 变量 在 Python 中,变量无需声明类型,直接赋值即可。变量名区分大小写。 # 整数类型 age 25 print(age) # 输出:25# 浮点数类型 height 1.75 print(height) # 输出:1.75# 字符串类型 name "张三&…...
批量给 Excel 添加或删除密码保护|Excel 批量设置打开密码和只读密码
我们在将 Excel 文档发送给第三方或者进行存档的时候,对 Excel 文档添加密码保护是非常重要的一个操作。添加保护后的 Excel 文档。就只能有相应权限的用户才能够打开或者编辑操作。尤其是当我们 Excel 文档中内容非常敏感非常重要的时候,添加保护就显得…...
4.JVM-垃圾回收介绍
记录个人学习中记录笔记,如有错误请您指正,谢谢🙏 垃圾回收器发展史 传统垃圾回收: 分代回收 不同代有不同的垃圾回收机制 保底 标记清除算法 垃圾识别算法 引用计数法 缺陷:下图2 出现循环引用 无法解决 可达性分析 大部分(Java,pytho…...
Redis-锁-商品秒杀防止超卖
一、秒杀(Seckill) 1. 定义 秒杀:短时间内(如1秒内)大量用户同时抢购 限量低价商品 的营销活动。典型场景:双11热门商品抢购、小米手机首发、演唱会门票开售。 2. 技术挑战 挑战点说明后果…...
PostgreSQL 多数据库集簇配置及多数据库复制方法【流程+代码实例】
PostgreSQL 多数据库集簇配置及多数据库复制方法 1. 多数据库集簇配置 安装下载完postgresql后,系统此时包含一个postgres用户和一个名为postgres的默认数据库。 PostgreSQL 基本命令 服务管理命令 # 停止和启动及重启PostgreSQL服务 sudo systemctl stop postgr…...
【k8s004】 Docker 打包 K8s镜像
文章目录 一. 准备工作1. 安装 Docker: [官方安装文档](https://docs.docker.com/get-docker/)2. 准备应用代码(示例使用 Node.js 应用) 二. 创建 Dockerfile3、构建镜像(注意最后的点号)4、测试运行5、推送镜像到仓库6、 Kuberne…...
std::invoke详解
基础介绍 c17版本引入了std::invoke特性,这是一个通用的调用包装器,可以统一调用: 普通函数成员函数函数对象Lambda表达式指向成员的指针 它的主要作用是提供一个统一的方式来调用各种可调用对象。 std::invoke依赖的头文件:#…...

