diff --git a/src/main/java/com/ruoyi/device/config/DeviceCacheConfig.java b/src/main/java/com/ruoyi/device/config/DeviceCacheConfig.java new file mode 100644 index 0000000..972cbbb --- /dev/null +++ b/src/main/java/com/ruoyi/device/config/DeviceCacheConfig.java @@ -0,0 +1,77 @@ +package com.ruoyi.device.config; + +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +/** + * Device模块缓存配置 + * 为Domain层提供分布式缓存支持 + * + * @author ruoyi + * @date 2026-01-30 + */ +@Configuration +@EnableCaching +public class DeviceCacheConfig { + + /** + * 缓存名称常量 + */ + public static final String DEVICE_CACHE = "device"; + public static final String DOCK_CACHE = "dock"; + public static final String AIRCRAFT_CACHE = "aircraft"; + public static final String PAYLOAD_CACHE = "payload"; + public static final String DOCK_AIRCRAFT_CACHE = "dockAircraft"; + public static final String AIRCRAFT_PAYLOAD_CACHE = "aircraftPayload"; + + /** + * 配置缓存管理器 + * 为不同的实体配置不同的过期时间 + */ + @Bean + public CacheManager deviceCacheManager(RedisConnectionFactory connectionFactory) { + // 默认缓存配置:30分钟过期 + RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofMinutes(30)) + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) + .disableCachingNullValues(); + + // 为不同实体配置不同的过期时间 + Map cacheConfigurations = new HashMap<>(); + + // 设备信息:30分钟(基础数据,变化较少) + cacheConfigurations.put(DEVICE_CACHE, defaultConfig.entryTtl(Duration.ofMinutes(30))); + + // 机场信息:30分钟(基础数据,变化较少) + cacheConfigurations.put(DOCK_CACHE, defaultConfig.entryTtl(Duration.ofMinutes(30))); + + // 无人机信息:30分钟(基础数据,变化较少) + cacheConfigurations.put(AIRCRAFT_CACHE, defaultConfig.entryTtl(Duration.ofMinutes(30))); + + // 挂载信息:30分钟(基础数据,变化较少) + cacheConfigurations.put(PAYLOAD_CACHE, defaultConfig.entryTtl(Duration.ofMinutes(30))); + + // 关联关系:15分钟(关联关系可能变化) + cacheConfigurations.put(DOCK_AIRCRAFT_CACHE, defaultConfig.entryTtl(Duration.ofMinutes(15))); + cacheConfigurations.put(AIRCRAFT_PAYLOAD_CACHE, defaultConfig.entryTtl(Duration.ofMinutes(15))); + + return RedisCacheManager.builder(connectionFactory) + .cacheDefaults(defaultConfig) + .withInitialCacheConfigurations(cacheConfigurations) + .transactionAware() + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/ruoyi/device/domain/impl/AircraftDomainImpl.java b/src/main/java/com/ruoyi/device/domain/impl/AircraftDomainImpl.java index 13cb3da..699d322 100644 --- a/src/main/java/com/ruoyi/device/domain/impl/AircraftDomainImpl.java +++ b/src/main/java/com/ruoyi/device/domain/impl/AircraftDomainImpl.java @@ -1,10 +1,14 @@ package com.ruoyi.device.domain.impl; +import com.ruoyi.device.config.DeviceCacheConfig; import com.ruoyi.device.domain.api.IAircraftDomain; import com.ruoyi.device.domain.convert.AircraftConvert; import com.ruoyi.device.domain.model.Aircraft; import com.ruoyi.device.mapper.AircraftMapper; import com.ruoyi.device.mapper.entity.AircraftEntity; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Component; import java.util.List; @@ -34,6 +38,7 @@ public class AircraftDomainImpl implements IAircraftDomain } @Override + @Cacheable(value = DeviceCacheConfig.AIRCRAFT_CACHE, key = "'id:' + #aircraftId", unless = "#result == null") public Aircraft selectAircraftByAircraftId(Long aircraftId) { AircraftEntity entity = aircraftMapper.selectAircraftByAircraftId(aircraftId); @@ -41,6 +46,7 @@ public class AircraftDomainImpl implements IAircraftDomain } @Override + @Cacheable(value = DeviceCacheConfig.AIRCRAFT_CACHE, key = "'deviceId:' + #deviceId", unless = "#result == null") public Aircraft selectAircraftByDeviceId(Long deviceId) { AircraftEntity entity = aircraftMapper.selectAircraftByDeviceId(deviceId); @@ -58,6 +64,10 @@ public class AircraftDomainImpl implements IAircraftDomain } @Override + @Caching(evict = { + @CacheEvict(value = DeviceCacheConfig.AIRCRAFT_CACHE, key = "'id:' + #aircraft.aircraftId"), + @CacheEvict(value = DeviceCacheConfig.AIRCRAFT_CACHE, key = "'deviceId:' + #aircraft.deviceId") + }) public int updateAircraft(Aircraft aircraft) { AircraftEntity entity = AircraftConvert.to(aircraft); @@ -65,12 +75,14 @@ public class AircraftDomainImpl implements IAircraftDomain } @Override + @CacheEvict(value = DeviceCacheConfig.AIRCRAFT_CACHE, allEntries = true) public int deleteAircraftByAircraftId(Long aircraftId) { return aircraftMapper.deleteAircraftByAircraftId(aircraftId); } @Override + @CacheEvict(value = DeviceCacheConfig.AIRCRAFT_CACHE, allEntries = true) public int deleteAircraftByAircraftIds(Long[] aircraftIds) { return aircraftMapper.deleteAircraftByAircraftIds(aircraftIds); diff --git a/src/main/java/com/ruoyi/device/domain/impl/AircraftPayloadDomainImpl.java b/src/main/java/com/ruoyi/device/domain/impl/AircraftPayloadDomainImpl.java index 4c654e7..5133dfa 100644 --- a/src/main/java/com/ruoyi/device/domain/impl/AircraftPayloadDomainImpl.java +++ b/src/main/java/com/ruoyi/device/domain/impl/AircraftPayloadDomainImpl.java @@ -1,10 +1,14 @@ package com.ruoyi.device.domain.impl; +import com.ruoyi.device.config.DeviceCacheConfig; import com.ruoyi.device.domain.api.IAircraftPayloadDomain; import com.ruoyi.device.domain.convert.AircraftPayloadConvert; import com.ruoyi.device.domain.model.AircraftPayload; import com.ruoyi.device.mapper.AircraftPayloadMapper; import com.ruoyi.device.mapper.entity.AircraftPayloadEntity; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Component; import java.util.List; @@ -34,6 +38,7 @@ public class AircraftPayloadDomainImpl implements IAircraftPayloadDomain } @Override + @Cacheable(value = DeviceCacheConfig.AIRCRAFT_PAYLOAD_CACHE, key = "'id:' + #id", unless = "#result == null") public AircraftPayload selectAircraftPayloadById(Long id) { AircraftPayloadEntity entity = aircraftPayloadMapper.selectAircraftPayloadById(id); @@ -41,6 +46,7 @@ public class AircraftPayloadDomainImpl implements IAircraftPayloadDomain } @Override + @Cacheable(value = DeviceCacheConfig.AIRCRAFT_PAYLOAD_CACHE, key = "'aircraftId:' + #aircraftId", unless = "#result == null") public List selectAircraftPayloadByAircraftId(Long aircraftId) { List entityList = aircraftPayloadMapper.selectAircraftPayloadListByAircraftId(aircraftId); @@ -48,6 +54,7 @@ public class AircraftPayloadDomainImpl implements IAircraftPayloadDomain } @Override + @Cacheable(value = DeviceCacheConfig.AIRCRAFT_PAYLOAD_CACHE, key = "'payloadId:' + #payloadId", unless = "#result == null") public List selectAircraftPayloadByPayloadId(Long payloadId) { List entityList = aircraftPayloadMapper.selectAircraftPayloadListByPayloadId(payloadId); @@ -55,6 +62,7 @@ public class AircraftPayloadDomainImpl implements IAircraftPayloadDomain } @Override + @Cacheable(value = DeviceCacheConfig.AIRCRAFT_PAYLOAD_CACHE, key = "'dockId:' + #dockId", unless = "#result == null") public List selectAircraftPayloadByDockId(Long dockId) { List entityList = aircraftPayloadMapper.selectAircraftPayloadListByDockId(dockId); @@ -72,6 +80,7 @@ public class AircraftPayloadDomainImpl implements IAircraftPayloadDomain } @Override + @CacheEvict(value = DeviceCacheConfig.AIRCRAFT_PAYLOAD_CACHE, allEntries = true) public int updateAircraftPayload(AircraftPayload aircraftPayload) { AircraftPayloadEntity entity = AircraftPayloadConvert.to(aircraftPayload); @@ -79,12 +88,14 @@ public class AircraftPayloadDomainImpl implements IAircraftPayloadDomain } @Override + @CacheEvict(value = DeviceCacheConfig.AIRCRAFT_PAYLOAD_CACHE, allEntries = true) public int deleteAircraftPayloadById(Long id) { return aircraftPayloadMapper.deleteAircraftPayloadById(id); } @Override + @CacheEvict(value = DeviceCacheConfig.AIRCRAFT_PAYLOAD_CACHE, allEntries = true) public int deleteAircraftPayloadByIds(Long[] ids) { return aircraftPayloadMapper.deleteAircraftPayloadByIds(ids); diff --git a/src/main/java/com/ruoyi/device/domain/impl/DeviceDomainImpl.java b/src/main/java/com/ruoyi/device/domain/impl/DeviceDomainImpl.java index d5d1da8..98d0f44 100644 --- a/src/main/java/com/ruoyi/device/domain/impl/DeviceDomainImpl.java +++ b/src/main/java/com/ruoyi/device/domain/impl/DeviceDomainImpl.java @@ -1,10 +1,14 @@ package com.ruoyi.device.domain.impl; +import com.ruoyi.device.config.DeviceCacheConfig; import com.ruoyi.device.domain.api.IDeviceDomain; import com.ruoyi.device.domain.convert.DeviceConvert; import com.ruoyi.device.domain.model.Device; import com.ruoyi.device.mapper.DeviceMapper; import com.ruoyi.device.mapper.entity.DeviceEntity; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Component; import java.util.List; @@ -34,6 +38,7 @@ public class DeviceDomainImpl implements IDeviceDomain } @Override + @Cacheable(value = DeviceCacheConfig.DEVICE_CACHE, key = "'id:' + #deviceId", unless = "#result == null") public Device selectDeviceByDeviceId(Long deviceId) { DeviceEntity entity = deviceMapper.selectDeviceByDeviceId(deviceId); @@ -41,6 +46,7 @@ public class DeviceDomainImpl implements IDeviceDomain } @Override + @Cacheable(value = DeviceCacheConfig.DEVICE_CACHE, key = "'iotId:' + #iotDeviceId", unless = "#result == null") public Device selectDeviceByIotDeviceId(String iotDeviceId) { DeviceEntity entity = deviceMapper.selectDeviceByIotDeviceId(iotDeviceId); @@ -48,6 +54,7 @@ public class DeviceDomainImpl implements IDeviceDomain } @Override + @Cacheable(value = DeviceCacheConfig.DEVICE_CACHE, key = "'sn:' + #deviceSn", unless = "#result == null") public Device selectDeviceByDeviceSn(String deviceSn) { DeviceEntity entity = deviceMapper.selectDeviceByDeviceSn(deviceSn); @@ -65,6 +72,11 @@ public class DeviceDomainImpl implements IDeviceDomain } @Override + @Caching(evict = { + @CacheEvict(value = DeviceCacheConfig.DEVICE_CACHE, key = "'id:' + #device.deviceId"), + @CacheEvict(value = DeviceCacheConfig.DEVICE_CACHE, key = "'iotId:' + #device.iotDeviceId"), + @CacheEvict(value = DeviceCacheConfig.DEVICE_CACHE, key = "'sn:' + #device.deviceSn") + }) public int updateDevice(Device device) { DeviceEntity entity = DeviceConvert.to(device); @@ -72,12 +84,14 @@ public class DeviceDomainImpl implements IDeviceDomain } @Override + @CacheEvict(value = DeviceCacheConfig.DEVICE_CACHE, allEntries = true) public int deleteDeviceByDeviceId(Long deviceId) { return deviceMapper.deleteDeviceByDeviceId(deviceId); } @Override + @CacheEvict(value = DeviceCacheConfig.DEVICE_CACHE, allEntries = true) public int deleteDeviceByDeviceIds(Long[] deviceIds) { return deviceMapper.deleteDeviceByDeviceIds(deviceIds); diff --git a/src/main/java/com/ruoyi/device/domain/impl/DockAircraftDomainImpl.java b/src/main/java/com/ruoyi/device/domain/impl/DockAircraftDomainImpl.java index d4a649f..ba5aaed 100644 --- a/src/main/java/com/ruoyi/device/domain/impl/DockAircraftDomainImpl.java +++ b/src/main/java/com/ruoyi/device/domain/impl/DockAircraftDomainImpl.java @@ -1,10 +1,14 @@ package com.ruoyi.device.domain.impl; +import com.ruoyi.device.config.DeviceCacheConfig; import com.ruoyi.device.domain.api.IDockAircraftDomain; import com.ruoyi.device.domain.convert.DockAircraftConvert; import com.ruoyi.device.domain.model.DockAircraft; import com.ruoyi.device.mapper.DockAircraftMapper; import com.ruoyi.device.mapper.entity.DockAircraftEntity; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Component; import java.util.List; @@ -34,6 +38,7 @@ public class DockAircraftDomainImpl implements IDockAircraftDomain } @Override + @Cacheable(value = DeviceCacheConfig.DOCK_AIRCRAFT_CACHE, key = "'id:' + #id", unless = "#result == null") public DockAircraft selectDockAircraftById(Long id) { DockAircraftEntity entity = dockAircraftMapper.selectDockAircraftById(id); @@ -41,6 +46,7 @@ public class DockAircraftDomainImpl implements IDockAircraftDomain } @Override + @Cacheable(value = DeviceCacheConfig.DOCK_AIRCRAFT_CACHE, key = "'dockId:' + #dockId", unless = "#result == null") public List selectDockAircraftByDockId(Long dockId) { List entityList = dockAircraftMapper.selectDockAircraftListByDockId(dockId); @@ -48,6 +54,7 @@ public class DockAircraftDomainImpl implements IDockAircraftDomain } @Override + @Cacheable(value = DeviceCacheConfig.DOCK_AIRCRAFT_CACHE, key = "'aircraftId:' + #aircraftId", unless = "#result == null") public List selectDockAircraftByAircraftId(Long aircraftId) { List entityList = dockAircraftMapper.selectDockAircraftListByAircraftId(aircraftId); @@ -65,6 +72,11 @@ public class DockAircraftDomainImpl implements IDockAircraftDomain } @Override + @Caching(evict = { + @CacheEvict(value = DeviceCacheConfig.DOCK_AIRCRAFT_CACHE, key = "'id:' + #dockAircraft.id"), + @CacheEvict(value = DeviceCacheConfig.DOCK_AIRCRAFT_CACHE, key = "'dockId:' + #dockAircraft.dockId"), + @CacheEvict(value = DeviceCacheConfig.DOCK_AIRCRAFT_CACHE, key = "'aircraftId:' + #dockAircraft.aircraftId") + }) public int updateDockAircraft(DockAircraft dockAircraft) { DockAircraftEntity entity = DockAircraftConvert.to(dockAircraft); @@ -72,12 +84,14 @@ public class DockAircraftDomainImpl implements IDockAircraftDomain } @Override + @CacheEvict(value = DeviceCacheConfig.DOCK_AIRCRAFT_CACHE, allEntries = true) public int deleteDockAircraftById(Long id) { return dockAircraftMapper.deleteDockAircraftById(id); } @Override + @CacheEvict(value = DeviceCacheConfig.DOCK_AIRCRAFT_CACHE, allEntries = true) public int deleteDockAircraftByIds(Long[] ids) { return dockAircraftMapper.deleteDockAircraftByIds(ids); diff --git a/src/main/java/com/ruoyi/device/domain/impl/DockDomainImpl.java b/src/main/java/com/ruoyi/device/domain/impl/DockDomainImpl.java index 246be03..7bb3d37 100644 --- a/src/main/java/com/ruoyi/device/domain/impl/DockDomainImpl.java +++ b/src/main/java/com/ruoyi/device/domain/impl/DockDomainImpl.java @@ -1,10 +1,14 @@ package com.ruoyi.device.domain.impl; +import com.ruoyi.device.config.DeviceCacheConfig; import com.ruoyi.device.domain.api.IDockDomain; import com.ruoyi.device.domain.convert.DockConvert; import com.ruoyi.device.domain.model.Dock; import com.ruoyi.device.mapper.DockMapper; import com.ruoyi.device.mapper.entity.DockEntity; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Component; import java.util.List; @@ -34,6 +38,7 @@ public class DockDomainImpl implements IDockDomain } @Override + @Cacheable(value = DeviceCacheConfig.DOCK_CACHE, key = "'id:' + #dockId", unless = "#result == null") public Dock selectDockByDockId(Long dockId) { DockEntity entity = dockMapper.selectDockByDockId(dockId); @@ -41,6 +46,7 @@ public class DockDomainImpl implements IDockDomain } @Override + @Cacheable(value = DeviceCacheConfig.DOCK_CACHE, key = "'deviceId:' + #deviceId", unless = "#result == null") public Dock selectDockByDeviceId(Long deviceId) { DockEntity entity = dockMapper.selectDockByDeviceId(deviceId); @@ -58,6 +64,10 @@ public class DockDomainImpl implements IDockDomain } @Override + @Caching(evict = { + @CacheEvict(value = DeviceCacheConfig.DOCK_CACHE, key = "'id:' + #dock.dockId"), + @CacheEvict(value = DeviceCacheConfig.DOCK_CACHE, key = "'deviceId:' + #dock.deviceId") + }) public int updateDock(Dock dock) { DockEntity entity = DockConvert.to(dock); @@ -65,12 +75,14 @@ public class DockDomainImpl implements IDockDomain } @Override + @CacheEvict(value = DeviceCacheConfig.DOCK_CACHE, allEntries = true) public int deleteDockByDockId(Long dockId) { return dockMapper.deleteDockByDockId(dockId); } @Override + @CacheEvict(value = DeviceCacheConfig.DOCK_CACHE, allEntries = true) public int deleteDockByDockIds(Long[] dockIds) { return dockMapper.deleteDockByDockIds(dockIds); diff --git a/src/main/java/com/ruoyi/device/domain/impl/PayloadDomainImpl.java b/src/main/java/com/ruoyi/device/domain/impl/PayloadDomainImpl.java index cf81a8f..4e97b1d 100644 --- a/src/main/java/com/ruoyi/device/domain/impl/PayloadDomainImpl.java +++ b/src/main/java/com/ruoyi/device/domain/impl/PayloadDomainImpl.java @@ -1,10 +1,13 @@ package com.ruoyi.device.domain.impl; +import com.ruoyi.device.config.DeviceCacheConfig; import com.ruoyi.device.domain.api.IPayloadDomain; import com.ruoyi.device.domain.convert.PayloadConvert; import com.ruoyi.device.domain.model.Payload; import com.ruoyi.device.mapper.PayloadMapper; import com.ruoyi.device.mapper.entity.PayloadEntity; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Component; import java.util.List; @@ -34,6 +37,7 @@ public class PayloadDomainImpl implements IPayloadDomain } @Override + @Cacheable(value = DeviceCacheConfig.PAYLOAD_CACHE, key = "'id:' + #payloadId", unless = "#result == null") public Payload selectPayloadByPayloadId(Long payloadId) { PayloadEntity entity = payloadMapper.selectPayloadByPayloadId(payloadId); @@ -51,6 +55,7 @@ public class PayloadDomainImpl implements IPayloadDomain } @Override + @CacheEvict(value = DeviceCacheConfig.PAYLOAD_CACHE, key = "'id:' + #payload.payloadId") public int updatePayload(Payload payload) { PayloadEntity entity = PayloadConvert.to(payload); @@ -58,12 +63,14 @@ public class PayloadDomainImpl implements IPayloadDomain } @Override + @CacheEvict(value = DeviceCacheConfig.PAYLOAD_CACHE, allEntries = true) public int deletePayloadByPayloadId(Long payloadId) { return payloadMapper.deletePayloadByPayloadId(payloadId); } @Override + @CacheEvict(value = DeviceCacheConfig.PAYLOAD_CACHE, allEntries = true) public int deletePayloadByPayloadIds(Long[] payloadIds) { return payloadMapper.deletePayloadByPayloadIds(payloadIds);