Redis:分组与设备在 Redis 中缓存存储设计

一、缓存存储结构设计

  • 分组与设备的映射关系(使用 Set 结构)
    • 键格式 :采用 group:{groupId}:devices 的格式作为 Redis 中 Set 的键,例如 group:1:devices 就代表了分组 ID 为 1 的分组所关联的设备集合。
    • 值内容 :Set 中的元素为设备 ID,如 device001device002 等。这样的设计使得可以方便且高效地判断某个设备是否属于特定分组、快速添加或移除设备到分组中,利用了 Set 数据结构操作成员的高效性(时间复杂度为 O(1)),非常适合维护分组与设备之间多对多的映射关系。
  • 设备详细信息(使用 Hash 结构)
    • 键格式 :以 device:{deviceId} 作为键,像 device:device001 即对应设备 ID 为 device001 的设备详细信息存储位置。
    • 值内容 :Hash 内部存储设备的各项属性,例如 { "name": "设备名称", "status": "on", "type": "1" },通过不同的字段(field)存储设备名称、状态、类型等信息,便于后续根据设备 ID 精准查询和更新设备的某一项或多项属性,借助 Redis 的 HGETHSET 等命令能灵活操作这些属性值。

二、Spring Boot 中的实现示例

创建操作分组与设备缓存的服务类

java 复制代码
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Service
public class GroupDeviceCacheService {

    private final RedisTemplate<String, String> redisTemplate;

    public GroupDeviceCacheService(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    // 添加设备到分组的方法
    public void addDeviceToGroup(String groupId, String deviceId) {
        redisTemplate.opsForSet().add("group:" + groupId + ":devices", deviceId);
    }

    // 从分组移除设备的方法
    public void removeDeviceFromGroup(String groupId, String deviceId) {
        redisTemplate.opsForSet().remove("group:" + groupId + ":devices", deviceId);
    }

    // 获取分组下所有设备 ID 的方法
    public Set<String> getDevicesByGroup(String groupId) {
        return redisTemplate.opsForSet().members("group:" + groupId + ":devices");
    }

    // 获取设备详细信息的方法
    public Map<String, String> getDeviceInfo(String deviceId) {
        return redisTemplate.opsForHash().entries("device:" + deviceId);
    }

    // 更新设备某一属性的方法(以更新状态为例)
    public void updateDeviceStatus(String deviceId, String newStatus) {
        redisTemplate.opsForHash().put("device:" + deviceId, "status", newStatus);
    }

    // 设置分组与设备映射关系缓存过期时间的方法(可按需调用)
    public void setGroupDeviceMappingExpire(String groupId, long expireTime, TimeUnit timeUnit) {
        redisTemplate.expire("group:" + groupId + ":devices", expireTime, timeUnit);
    }
}

代码实现了如添加设备到分组、移除设备、查询分组下设备以及设备详细信息的获取和更新等核心功能,同时还可以设置缓存的过期时间来控制缓存数据的有效期。

三、优势与应用场景

  • 优势
    • 操作高效性:Set 结构用于分组与设备的映射,在添加、删除设备以及判断设备所属分组等操作上效率高;Hash 结构存储设备详细信息能快速查询和更新单个属性,整体提升了缓存数据的读写性能,满足频繁的设备管理操作需求。
    • 数据清晰性与可维护性:两种结构清晰地划分了分组与设备的关联以及设备自身的属性信息,逻辑上易于理解和维护,无论是新增、修改还是查询相关数据,代码的可读性和可扩展性都较好。
    • 灵活应对业务变化:可以方便地根据业务需求扩展设备属性(在 Hash 结构中添加新的 field),或者调整分组与设备的关联关系(通过 Set 操作),很好地适配智能家居业务场景下可能出现的变化。
  • 应用场景
    • 智能家居系统:用于管理家庭内不同房间分组(如客厅分组、卧室分组)下的各类智能设备(智能音箱、智能灯具等),可以快速查询设备状态、控制设备,也能方便地进行设备在不同房间分组间的迁移等操作。
相关推荐
用户30745969820713 小时前
Redis 延时队列详解
redis
烤代码的吐司君16 小时前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
leeyi3 天前
Checkpoint 机制:Agent 怎么在断电后接着跑
redis·aigc·agent
云技纵横4 天前
一个 @Async 让循环依赖暴雷:Spring 代理的暗坑
redis
犯困蛋挞yy5 天前
用Claude快速解决Redis代码报错反复无解的问题
redis
小七-七牛开发者6 天前
TokenPilot:让 LLM Agent 长会话成本降 60%+ 的上下文管理
缓存·agent·token·context·上下文·推理成本
用户31693538118311 天前
Java连接Redis
redis
小小工匠13 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
ofoxcoding13 天前
在AI API聚合平台配置DeepSeek V3.2提示词缓存实战:快速接入与成本优化指南
人工智能·spring·缓存·ai
NeilYuen13 天前
gRPC结合FAISS构建AI助手语义缓存模块(一):设计
人工智能·缓存·faiss