目录
redis数据类型的适用场景
- String类型:
- 适用场景:简单键值对、计数器、分布式锁。
- 命名规范:使用明确的前缀,如
SHOP:DEVICE:{deviceId}:STATUS
。 - 取值方法:直接使用
GET
和SET
命令。
- List类型:
- 适用场景:消息队列、最新消息列表。
- 命名规范:使用描述性前缀,如
SHOP:DEVICE:{deviceId}:EVENTS
。 - 取值方法:使用
LPUSH
、LRANGE
等命令。
- Set类型:
- 适用场景:标签系统、去重集合。
- 命名规范:使用集合类型前缀,如
SHOP:DEVICE:{deviceId}:TAGS
。 - 取值方法:使用
SADD
、SMEMBERS
等命令。
- ZSet类型:
- 适用场景:排行榜、延迟队列。
- 命名规范:使用有序集合前缀,如
SHOP:DEVICE:{deviceId}:PRIORITY_QUEUE
。 - 取值方法:使用
ZADD
、ZRANGE
等命令。
一、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 |
- 前缀隔离:通过业务前缀(如
IOT:
)避免键冲突。 - 类型后缀:在键名中明确数据类型(如
:LIST
、:SET
),提升可读性。 - 唯一标识:使用设备ID、任务ID等唯一标识符。
- 内存优化:避免过长键名(建议控制在44字节以内)。