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 操作),很好地适配智能家居业务场景下可能出现的变化。
  • 应用场景
    • 智能家居系统:用于管理家庭内不同房间分组(如客厅分组、卧室分组)下的各类智能设备(智能音箱、智能灯具等),可以快速查询设备状态、控制设备,也能方便地进行设备在不同房间分组间的迁移等操作。
相关推荐
信仰_2739932431 天前
Redis红锁
数据库·redis·缓存
爬山算法1 天前
Redis(120)Redis的常见错误如何处理?
数据库·redis·缓存
野生技术架构师1 天前
盘一盘Redis的底层数据结构
数据结构·数据库·redis
Feng.Lee1 天前
聊聊缓存测试用例设计方案
缓存·测试用例
R.lin1 天前
memcached 的核心工作机制、优缺点、适用场景以及常见问题的处理方式
数据库·缓存·memcached
bug总结1 天前
更新原生小程序封装(新增缓存订阅)完美解决
前端·缓存·小程序
笃行客从不躺平1 天前
CPU 缓存 高并发探索
缓存
freedom_1024_1 天前
LRU缓存淘汰算法详解与C++实现
c++·算法·缓存
羊锦磊1 天前
[ 项目开发 1.0 ] 新闻网站的开发流程和注意事项
java·数据库·spring boot·redis·spring·oracle·json
wddblog1 天前
多级缓存体系与热点对抗术--速度是用户体验的王道,而缓存是提升速度的银弹
缓存·ux