Redis 数据类型总览
Redis 是 Key-Value 数据库,但 value 可以是多种结构。常用 5 种如下:
1. String(字符串)
最基础,一个 key 对应一个 value。
key: "captcha:abc123" → value: "42"
key: "login_tokens:xxx" → value: LoginUser对象(序列化后)
| 特点 | 说明 |
|---|---|
| 存什么 | 字符串、数字、序列化后的 Java 对象 |
| 常用命令 | SET、GET、INCR、EXPIRE |
| 你们项目 | setCacheObject / getCacheObject |
典型场景:验证码、登录 Token、单个配置、计数器
2. Hash(哈希 / 字典)
一个 key 下挂 多个 field-value,类似 Java 的
Map<String, T>。key: "alarmRecordCache"
├── field: "TEMP_001" → AlarmRecordCacheDTO
├── field: "PRESS_002" → AlarmRecordCacheDTO
└── field: "FLOW_003" → AlarmRecordCacheDTO
| 特点 | 说明 |
|---|---|
| 两层 key | 外层 Redis Key + 内层 field |
| 常用命令 | HSET、HGET、HGETALL、HDEL |
| 你们项目 | setCacheMap、getCacheMap、setCacheMapValue、getCacheMapValue |
典型场景:一批同类数据按 ID 索引(报警记录、质检单预加载缓存)
3. List(列表)
有序、可重复,双向链表。
key: "message:queue"
→ "msg1", "msg2", "msg3" (左边进/右边出,或反过来)
| 特点 | 说明 |
|---|---|
| 有序 | 有先后顺序 |
| 可重复 | 同一元素可出现多次 |
| 常用命令 | LPUSH、RPUSH、LPOP、LRANGE |
| 你们项目 | setCacheList / getCacheList(框架有,业务里较少用) |
典型场景:消息队列、最新 N 条记录、时间线
4. Set(集合)
无序、不重复。
key: "users:online"
→ {"alice", "bob", "charlie"} (无序,且唯一)
| 特点 | 说明 |
|---|---|
| 无序 | 没有先后顺序 |
| 唯一 | 同一 member 只存一份 |
| 常用命令 | SADD、SMEMBERS、SISMEMBER、SINTER(交集) |
| 你们项目 | setCacheSet / getCacheSet(框架有,业务里未用) |
典型场景:在线用户、标签、共同好友、去重
5. Sorted Set / ZSet(有序集合)
带 score(分数) 的 Set,按 score 排序。
key: "leaderboard"
→ bob:2300, alice:1500, charlie:900 (按分数排序)
| 特点 | 说明 |
|---|---|
| 唯一 + 有序 | member 唯一,按 score 排序 |
| 常用命令 | ZADD、ZRANGE、ZRANK、ZSCORE |
| 你们项目 | RedisCache 未封装,需直接用 RedisTemplate.opsForZSet() |
典型场景:排行榜、延时队列、范围查询
6. 其他类型(了解即可)
| 类型 | 作用 | 常用命令 |
|---|---|---|
| Bitmap | 位操作,省空间 | SETBIT、GETBIT |
| HyperLogLog | 基数统计(UV 等) | PFADD、PFCOUNT |
| Geo | 地理位置 | GEOADD、GEORADIUS |
| Stream | 消息流(新版队列) | XADD、XREAD |
日常业务里,前 5 种最常用。
一张对照表(Redis ↔ Java ↔ 你们 RedisCache)
| Redis 类型 | Java 对应 | RedisCache 方法 | 你们项目是否用到 |
|---|---|---|---|
| String | 任意对象 / String | setCacheObject / getCacheObject |
✅ 常用 |
| Hash | Map<String, T> |
setCacheMap / getCacheMap / setCacheMapValue |
✅ 常用 |
| List | List<T> |
setCacheList / getCacheList |
❌ 框架有,业务少用 |
| Set | Set<T> |
setCacheSet / getCacheSet |
❌ 框架有,业务未用 |
| ZSet | Set<ZSetEntry> 等 |
无封装 | ❌ 需直接用 RedisTemplate |
怎么选类型(简单记法)
存 1 个东西 → String setCacheObject
存 一组,有子 key → Hash setCacheMap / setCacheMapValue
存 一组,要顺序 → List setCacheList
存 一组,要去重 → Set setCacheSet
存 一组,要排序/分数 → ZSet 直接用 opsForZSet
和你们项目的对应关系
| 业务 | Redis 类型 | 方法 |
|---|---|---|
| 验证码、登录 Token | String | setCacheObject |
| 区域/客户列表缓存 | String(整个 List 序列化) | setCacheObject |
| 报警记录、质检预加载 | Hash | setCacheMap / setCacheMapValue |
| 打印模板 | String | setCacheObject |
说明:区域列表虽然逻辑上是 List,但用的是 String 存整个 List 对象,不是 Redis List 类型。Hash 才是「一个 key 下多个 field」的结构。
结构对比图
String: key ──────────────────→ value
Hash: key ──┬── field1 → value1
├── field2 → value2
└── field3 → value3
List: key ──→ v1, v2, v3 (有序,可重复)
Set: key ──→ {a, b, c} (无序,不重复)
ZSet: key ──→ {a:10, b:20, c:5} (不重复,按分数排序)
方式 1:String(整包存)"all_login_users" → user1, user2, user3 (一个序列化对象)
改 user2 要:取出整个 List → 改 → 整包写回
方式 2:Hash(按 ID 存,推荐)
"login_users"
├── "user_001" → LoginUser1
├── "user_002" → LoginUser2
└── "user_003" → LoginUser3
改 user2 要:只 HSET "user_002" 新对象
方式 3:List(按顺序存)
"login_user_list" → user1, user2, user3
适合「最近登录顺序」,不适合按 ID 快速查找
方式 4:Set(只存 ID)
"online_user_ids" → { "user_001", "user_002" }
只关心「谁在线」,不存完整对象
方式 5:ZSet(带时间/分数)
"login_time_rank"
├── user_001 → 1718700000 (登录时间戳)
├── user_002 → 1718700100
└── user_003 → 1718700050
适合「最近登录排行」

com.code365.core 的 RedisCache工具类的5种set方法
String:public <T> void setCacheObject(String key, T value)
List:public <T> long setCacheList(String key, List<T> dataList)
Set:public <T> BoundSetOperations<String, T> setCacheSet(String key, Set<T> dataSet)
Hash:public <T> void setCacheMap(String key, Map<String, T> dataMap)
Hash:public <T> void setCacheMapValue(String key, String hKey, T value)