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 操作),很好地适配智能家居业务场景下可能出现的变化。
  • 应用场景
    • 智能家居系统:用于管理家庭内不同房间分组(如客厅分组、卧室分组)下的各类智能设备(智能音箱、智能灯具等),可以快速查询设备状态、控制设备,也能方便地进行设备在不同房间分组间的迁移等操作。
相关推荐
真实的菜22 分钟前
【无标题】Redis 从入门到精通(七):缓存设计与最佳实践 —— 穿透、击穿、雪崩与一致性终极指南
数据库·redis·缓存
念何架构之路23 分钟前
存储技术Redis
数据库·redis·缓存
Trouvaille ~2 小时前
【Redis篇】Redis 主从复制:数据同步的原理与实现
数据库·redis·缓存·中间件·高可用·主从复制·后端开发
真实的菜2 小时前
Redis 从入门到精通(五):哨兵模式(Sentinel)—— 自动故障转移的完整原理与实战
数据库·redis·sentinel
Solis程序员2 小时前
缓存三剑客预防策略
java·spring·缓存
是小王同学啊~2 小时前
Redis 面试通关笔记:高频八股 + 生产实战 + 追问链路(下)
redis·面试题
zfoo-framework3 小时前
通过redis-cli+lua脚本查询redis数据
数据库·redis·lua
岳读3 小时前
Redis Windows 7.2.3 使用教程解压启动与测试步骤
redis
shmily麻瓜小菜鸡3 小时前
Bootstrap 4 常用工具类速查表
前端·javascript·bootstrap
我是大猴子4 小时前
Redis为什么不适合做持久化和DB的区别在哪里
数据库·redis·缓存