Redis 数据类型

Redis 数据类型总览

Redis 是 Key-Value 数据库,但 value 可以是多种结构。常用 5 种如下:


1. String(字符串)

最基础,一个 key 对应一个 value。

key: "captcha:abc123" → value: "42"

key: "login_tokens:xxx" → value: LoginUser对象(序列化后)

特点 说明
存什么 字符串、数字、序列化后的 Java 对象
常用命令 SETGETINCREXPIRE
你们项目 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
常用命令 HSETHGETHGETALLHDEL
你们项目 setCacheMapgetCacheMapsetCacheMapValuegetCacheMapValue

典型场景:一批同类数据按 ID 索引(报警记录、质检单预加载缓存)


3. List(列表)

有序、可重复,双向链表。

key: "message:queue"

"msg1", "msg2", "msg3" (左边进/右边出,或反过来)

特点 说明
有序 有先后顺序
可重复 同一元素可出现多次
常用命令 LPUSHRPUSHLPOPLRANGE
你们项目 setCacheList / getCacheList(框架有,业务里较少用)

典型场景:消息队列、最新 N 条记录、时间线


4. Set(集合)

无序、不重复。

key: "users:online"

→ {"alice", "bob", "charlie"} (无序,且唯一)

特点 说明
无序 没有先后顺序
唯一 同一 member 只存一份
常用命令 SADDSMEMBERSSISMEMBERSINTER(交集)
你们项目 setCacheSet / getCacheSet(框架有,业务里未用)

典型场景:在线用户、标签、共同好友、去重


5. Sorted Set / ZSet(有序集合)

带 score(分数) 的 Set,按 score 排序。

key: "leaderboard"

→ bob:2300, alice:1500, charlie:900 (按分数排序)

特点 说明
唯一 + 有序 member 唯一,按 score 排序
常用命令 ZADDZRANGEZRANKZSCORE
你们项目 RedisCache 未封装,需直接用 RedisTemplate.opsForZSet()

典型场景:排行榜、延时队列、范围查询


6. 其他类型(了解即可)

类型 作用 常用命令
Bitmap 位操作,省空间 SETBITGETBIT
HyperLogLog 基数统计(UV 等) PFADDPFCOUNT
Geo 地理位置 GEOADDGEORADIUS
Stream 消息流(新版队列) XADDXREAD

日常业务里,前 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)