# 手术和麻醉信息Redis缓存实现说明 ## 概述 为提高手术和麻醉信息的查询性能,已将手术信息缓存到Redis中。接口查询时先从Redis缓存获取,如果没有则从数据库查询并更新到Redis缓存。 ## 实现细节 ### 1. Redis缓存Key定义 在 `openhis-common/src/main/java/com/openhis/common/utils/RedisKeys.java` 中定义了以下缓存Key: ```java // 单个手术信息缓存 public static String getSurgeryKey(Long surgeryId) // 按患者ID查询的手术列表缓存 public static String getSurgeryListByPatientKey(Long patientId) // 按就诊ID查询的手术列表缓存 public static String getSurgeryListByEncounterKey(Long encounterId) ``` ### 2. 缓存实现 #### 2.1 SurgeryServiceImpl (Domain层) - **getSurgeryById(Long id)**: 根据手术ID查询单个手术信息 - 先从Redis缓存获取 - 缓存未命中则从数据库查询 - 查询结果存入Redis缓存(30分钟过期) - **getSurgeryListByPatientId(Long patientId)**: 根据患者ID查询手术列表 - 先从Redis缓存获取 - 缓存未命中则从数据库查询 - 查询结果存入Redis缓存(30分钟过期) - **getSurgeryListByEncounterId(Long encounterId)**: 根据就诊ID查询手术列表 - 先从Redis缓存获取 - 缓存未命中则从数据库查询 - 查询结果存入Redis缓存(30分钟过期) - **insertSurgery(Surgery surgery)**: 新增手术信息 - 插入成功后清除相关缓存 - **updateSurgery(Surgery surgery)**: 更新手术信息 - 更新成功后清除相关缓存 - **deleteSurgery(Long id)**: 删除手术信息 - 删除成功后清除相关缓存 - **updateSurgeryStatus(Long id, Integer statusEnum)**: 更新手术状态 - 更新成功后清除相关缓存 #### 2.2 SurgeryAppServiceImpl (Application层) - **getSurgeryDetail(Long id)**: 根据ID查询手术详情 - 先从Redis缓存获取 - 缓存未命中则从数据库查询 - 查询结果存入Redis缓存(30分钟过期) - **addSurgery(SurgeryDto surgeryDto)**: 新增手术信息 - 插入成功后清除相关缓存 - **updateSurgery(SurgeryDto surgeryDto)**: 更新手术信息 - 更新成功后清除相关缓存 - **deleteSurgery(Long id)**: 删除手术信息 - 删除成功后清除相关缓存 - **updateSurgeryStatus(Long id, Integer statusEnum)**: 更新手术状态 - 更新成功后清除相关缓存 ### 3. 缓存清除策略 当手术信息发生变化时(新增、更新、删除),会清除以下相关缓存: 1. 单个手术信息缓存 2. 患者手术列表缓存 3. 就诊手术列表缓存 ### 4. 缓存配置 - **缓存时间**: 30分钟 - **时间单位**: TimeUnit.MINUTES - **序列化**: 使用RedisTemplate默认序列化方式 ## 关于麻醉信息 当前项目中,麻醉信息是手术表(`cli_surgery`)中的字段,包括: - 麻醉医生ID (anesthetistId) - 麻醉医生姓名 (anesthetistName) - 麻醉方式编码 (anesthesiaTypeEnum) - 麻醉费用 (anesthesiaFee) 这些字段已经包含在手术实体的缓存中,无需单独实现麻醉信息的缓存。 ## 使用示例 ### 查询手术信息(自动使用缓存) ```java // 自动从缓存获取,未命中则查询数据库 Surgery surgery = surgeryService.getSurgeryById(surgeryId); ``` ### 更新手术信息(自动清除缓存) ```java // 更新数据库,同时清除相关缓存 surgeryService.updateSurgery(surgery); ``` ### 手动清除缓存(如需要) ```java String cacheKey = RedisKeys.getSurgeryKey(surgeryId); redisCache.deleteObject(cacheKey); ``` ## 性能优化建议 1. 对于频繁访问的手术信息,缓存命中率高,可显著提升查询性能 2. 对于不常访问的手术信息,30分钟缓存时间可避免占用过多Redis内存 3. 如需调整缓存时间,可修改代码中的 `30, TimeUnit.MINUTES` 参数 4. 如需更精细的缓存控制,可考虑使用不同的缓存时间策略(如根据手术状态设置不同过期时间) ## 监控建议 建议监控以下指标: - Redis缓存命中率 - Redis内存使用情况 - 查询响应时间对比(缓存命中 vs 缓存未命中)