redis的规范化使用

发布于:2025-07-03 ⋅ 阅读:(22) ⋅ 点赞:(0)

目录

redis数据类型的适用场景

一、redis每个类型的使用详细说明

1. 适用场景

2. 规范化命名

3. 取值方法

Java实现示例(Jedis)

2.List类型

1. 适用场景

2. 规范化命名

3. 取值方法

Java实现示例

3.Set类型

1. 适用场景

2. 规范化命名

3. 取值方法

Java实现示例

4.ZSet(有序集合)类型

1. 适用场景

2. 规范化命名

3. 取值方法

二、规范化命名总结


redis数据类型的适用场景

  1. String类型
    • 适用场景:简单键值对、计数器、分布式锁。
    • 命名规范:使用明确的前缀,如SHOP:DEVICE:{deviceId}:STATUS
    • 取值方法:直接使用GETSET命令。
  2. List类型
    • 适用场景:消息队列、最新消息列表。
    • 命名规范:使用描述性前缀,如SHOP:DEVICE:{deviceId}:EVENTS
    • 取值方法:使用LPUSHLRANGE等命令。
  3. Set类型
    • 适用场景:标签系统、去重集合。
    • 命名规范:使用集合类型前缀,如SHOP:DEVICE:{deviceId}:TAGS
    • 取值方法:使用SADDSMEMBERS等命令。
  4. ZSet类型
    • 适用场景:排行榜、延迟队列。
    • 命名规范:使用有序集合前缀,如SHOP:DEVICE:{deviceId}:PRIORITY_QUEUE
    • 取值方法:使用ZADDZRANGE等命令。

一、redis每个类型的使用详细说明

        1.String类型

1. 适用场景
  • 简单键值对存储(如配置信息、计数器)
  • 分布式锁
  • 序列化对象存储(如JSON字符串)
2. 规范化命名
  • 格式[业务名]:[数据名]:[唯一标识]
  • 示例
    • SHOP:DEVICE:device123:STATUS(设备状态)
    • SHOP:CONFIG:MAX_CONNECTIONS(全局配置)
3. 取值方法
  • 写入SET key value
  • 读取GET key
  • 原子操作INCR/DECR(计数器)
Java实现示例(Jedis)
import redis.clients.jedis.Jedis;

public class RedisStringExample {
    private Jedis jedis = new Jedis("localhost", 6379);

    // 写入设备状态
    public void setDeviceStatus(String deviceId, String status) {
        String key = "IOT:DEVICE:" + deviceId + ":STATUS";
        jedis.set(key, status);
    }

    // 读取设备状态
    public String getDeviceStatus(String deviceId) {
        String key = "IOT:DEVICE:" + deviceId + ":STATUS";
        return jedis.get(key);
    }

    // 原子计数器(如连接数)
    public long incrementConnectionCount() {
        return jedis.incr("IOT:CONFIG:CONNECTION_COUNT");
    }
}

2.List类型

1. 适用场景
  • 消息队列(如事件流)
  • 最新消息列表(如设备日志)
2. 规范化命名
  • 格式[业务名]:[数据名]:[唯一标识]:LIST
  • 示例
    • IOT:DEVICE:device123:EVENTS:LIST(设备事件队列)
3. 取值方法
  • 左侧插入LPUSH key value
  • 右侧插入RPUSH key value
  • 范围读取LRANGE key start end
Java实现示例
import redis.clients.jedis.Jedis;

public class RedisListExample {
    private Jedis jedis = new Jedis("localhost", 6379);

    // 向设备事件队列添加事件(左侧插入)
    public void addDeviceEvent(String deviceId, String event) {
        String key = "IOT:DEVICE:" + deviceId + ":EVENTS:LIST";
        jedis.lpush(key, event);
    }

    // 获取最新N条设备事件
    public List<String> getLatestEvents(String deviceId, int count) {
        String key = "IOT:DEVICE:" + deviceId + ":EVENTS:LIST";
        return jedis.lrange(key, 0, count - 1);
    }
}

3.Set类型

1. 适用场景
  • 标签系统(如设备标签)
  • 去重集合(如唯一用户ID)
2. 规范化命名
  • 格式[业务名]:[数据名]:[唯一标识]:SET
  • 示例
    • SHOP:DEVICE:device123:TAGS:SET(设备标签集合)
3. 取值方法
  • 添加元素SADD key member
  • 获取所有元素SMEMBERS key
  • 随机获取元素SRANDMEMBER key
Java实现示例
import redis.clients.jedis.Jedis;

public class RedisSetExample {
    private Jedis jedis = new Jedis("localhost", 6379);

    // 为设备添加标签
    public void addDeviceTag(String deviceId, String tag) {
        String key = "IOT:DEVICE:" + deviceId + ":TAGS:SET";
        jedis.sadd(key, tag);
    }

    // 获取设备所有标签
    public Set<String> getDeviceTags(String deviceId) {
        String key = "SHOP:DEVICE:" + deviceId + ":TAGS:SET";
        return jedis.smembers(key);
    }
}

4.ZSet(有序集合)类型

1. 适用场景
  • 排行榜(如设备性能评分)
  • 延迟队列(按时间戳排序的任务)
2. 规范化命名
  • 格式[业务名]:[数据名]:[唯一标识]:ZSET
  • 示例
    • IOT:DEVICE:device123:PRIORITY_QUEUE:ZSET(设备优先级队列)
3. 取值方法
  • 添加元素ZADD key score member
  • 按分数范围获取元素ZRANGEBYSCORE key min max
  • 获取最高优先级元素ZREVRANGE key 0 0 WITHSCORES
import redis.clients.jedis.Jedis;

public class RedisZSetExample {
    private Jedis jedis = new Jedis("localhost", 6379);

    // 向优先级队列添加任务(分数为优先级)
    public void addTaskToPriorityQueue(String queueKey, double priority, String taskId) {
        String key = "IOT:TASK:" + queueKey + ":ZSET";
        jedis.zadd(key, priority, taskId);
    }

    // 获取最高优先级任务
    public String getHighestPriorityTask(String queueKey) {
        String key = "IOT:TASK:" + queueKey + ":ZSET";
        return jedis.zrevrange(key, 0, 0).get(0);
    }
}

二、规范化命名总结

数据类型 命名格式 示例
String [业务名]:[数据名]:[唯一标识] IOT:DEVICE:device123:STATUS
List [业务名]:[数据名]:[唯一标识]:LIST IOT:DEVICE:device123:EVENTS:LIST
Set [业务名]:[数据名]:[唯一标识]:SET IOT:DEVICE:device123:TAGS:SET
ZSet [业务名]:[数据名]:[唯一标识]:ZSET IOT:TASK:priority_queue:ZSET
  1. 前缀隔离:通过业务前缀(如IOT:)避免键冲突。
  2. 类型后缀:在键名中明确数据类型(如:LIST:SET),提升可读性。
  3. 唯一标识:使用设备ID、任务ID等唯一标识符。
  4. 内存优化:避免过长键名(建议控制在44字节以内)。