Files
his/md/手术和麻醉信息Redis缓存实现说明.md
chenqi cb268fe26d feat(operating-room): 添加手术室类型和所属科室字段
- 新增手术室类型字段支持急诊、择期、日间、复合手术室四种类型
- 添加所属科室字段实现科室级别资源管理
- 前端列表页面新增类型和所属科室显示列
- 新增类型选择器和科室选择器组件
- 后端实体类和服务类添加对应字段处理逻辑
- 数据库添加room_type_enum字段和相关索引
- 创建手术室类型字典数据和字典项配置
- 生成手术室管理功能说明文档
2026-01-13 10:03:57 +08:00

4.0 KiB

手术和麻醉信息Redis缓存实现说明

概述

为提高手术和麻醉信息的查询性能,已将手术信息缓存到Redis中。接口查询时先从Redis缓存获取,如果没有则从数据库查询并更新到Redis缓存。

实现细节

1. Redis缓存Key定义

openhis-common/src/main/java/com/openhis/common/utils/RedisKeys.java 中定义了以下缓存Key:

// 单个手术信息缓存
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)

这些字段已经包含在手术实体的缓存中,无需单独实现麻醉信息的缓存。

使用示例

查询手术信息(自动使用缓存)

// 自动从缓存获取,未命中则查询数据库
Surgery surgery = surgeryService.getSurgeryById(surgeryId);

更新手术信息(自动清除缓存)

// 更新数据库,同时清除相关缓存
surgeryService.updateSurgery(surgery);

手动清除缓存(如需要)

String cacheKey = RedisKeys.getSurgeryKey(surgeryId);
redisCache.deleteObject(cacheKey);

性能优化建议

  1. 对于频繁访问的手术信息,缓存命中率高,可显著提升查询性能
  2. 对于不常访问的手术信息,30分钟缓存时间可避免占用过多Redis内存
  3. 如需调整缓存时间,可修改代码中的 30, TimeUnit.MINUTES 参数
  4. 如需更精细的缓存控制,可考虑使用不同的缓存时间策略(如根据手术状态设置不同过期时间)

监控建议

建议监控以下指标:

  • Redis缓存命中率
  • Redis内存使用情况
  • 查询响应时间对比(缓存命中 vs 缓存未命中)