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 操作),很好地适配智能家居业务场景下可能出现的变化。
  • 应用场景
    • 智能家居系统:用于管理家庭内不同房间分组(如客厅分组、卧室分组)下的各类智能设备(智能音箱、智能灯具等),可以快速查询设备状态、控制设备,也能方便地进行设备在不同房间分组间的迁移等操作。
相关推荐
二宝哥18 小时前
CentOS 7.9 系统下 Redis 5.0.4 单机安装与源码编译安装指南
redis·centos
时空无限1 天前
vllm 缓存对模型启动时间的影响
缓存·vllm
ShiXZ2131 天前
Redis docker-compose 部署指南
redis·docker·eureka
耀耀_很无聊1 天前
13_Spring Boot 3.5.8 + Redisson 3.45.1 导致 Sa-Token 登录 StackOverflowError
spring boot·后端·bootstrap
青山木1 天前
Redis 缓存一致性全解:从 Cache Aside 到延迟双删、Canal+MQ 的进阶之路
java·数据库·redis·后端·缓存
YDS8291 天前
大营销平台 —— 活动SKU库存扣减业务及其一致性处理
java·spring boot·redis·rabbitmq·ddd
咏方舟【长江支流】1 天前
【开源】跨语言·跨平台·跨数据库(6) ——一种ORM缓存的接口实现和容错处理
数据库·缓存·开源·咏方舟-长江支流·用宝框架
爬也要爬着前进2 天前
redis主从搭建
数据库·redis·缓存
用户095367515832 天前
在系统的学习 redis 前的疑惑
redis·go
吴声子夜歌2 天前
Redis 3.x——集群故障转移
java·数据库·redis·集群