← ReJava · 学习目录

REJAVA / LEARNING NOTES

第16课速查:Redis(内存数据存储)数据类型

随时回查术语、规则和示例;完整解释见对应课程。

Java 17 / 21更新于 2026.10.12约 4 分钟阅读

根据课程材料整理

本次更新说明
  • 整理为公开学习笔记,保留要点、对照表与练习入口。

完整课件 · 课程目录 · 双语术语 · 官方来源

五种类型怎么选

类型值的样子办件系统例子与命令
String(字符串类型)一个值,最大512 MB详情缓存 SET case:detail:20 json EX 600;60秒限发 SET sms:limit:手机号 1 NX EX 60;计数 INCR(原子)
Hash(哈希)字段→值经办人三项计数 HINCRBY stat:staff:7:日期 accepted 1;常单独改字段时选它
List(列表)按放入顺序的链表,头尾增删快最近浏览10件 LPUSH → LTRIM 0 9 → LRANGE 0 9
Set(集合)不重复、无顺序已阅去重 SADD/SISMEMBER/SCARD;角色交集 SINTER(Java intersect)
Sorted Set(有序集合)成员带分数,按分数排;跳表+哈希表超期办件 ZRANGE case:deadline 0 现在时间戳 BYSCORE;前10名 ZRANGE 键 0 9 REV;再次ZADD更新分数,ZINCRBY 加分

存对象:整体读写用String(字符串类型)存JSON;经常改单个字段用Hash(JavaGuide的取舍)。

过期时间的三条规矩

  1. SET带EX,或对已有键执行EXPIRE;TTL(剩余存活时间) 返回 −1=没有过期时间,−2=键不存在。
  2. 重新SET会丢弃旧的过期时间 ;DEL、SET、GETSET会清掉,INCR、追加等只改内容的命令会保留。Java里每次 set 都传 Duration。
  3. 过期删除有被动(访问时发现)和主动(定期随机抽查)两种,过期键可能短暂占内存。

计数加过期:INCR 返回1时再 EXPIRE,后续只INCR、不再EXPIRE,窗口不会被延长。两条命令之间应用崩溃会留下无过期的键,正式实现用Lua脚本把两步合成一条(官方INCR页)。覆盖值又想保留过期时间:SET 的 KEEPTTL(6.0起)。

单线程:指什么、代价是什么

  • 官方:基本是单线程,一个线程按顺序处理所有请求,用多路复用照看连接;后台另有线程做慢I/O。
  • 快:数据在内存、单个请求短、不阻塞在系统调用上;瓶颈通常是内存或网络。
  • 代价:一条慢命令,所有客户端排队。生产不用 KEYS(O(N),N是整个库的键数,带前缀也一样慢);大集合不用 SMEMBERS/HGETALL 一次取全部,用SCAN系列(SCAN、SSCAN、HSCAN、ZSCAN)按游标分批,游标回到0才结束(某批返回空不代表结束),可能返回重复;总工作量没变少,只是拆小。
  • 6.0起可选I/O线程(默认关闭)处理网络读写和协议解析,命令仍由一个线程执行。
  • 一条命令是原子的,但“GET判断再SET”两条命令之间可能被插入,能用一条命令(NX、INCR)就用一条。

Java对照:Spring Data Redis(Spring 的内存数据存储访问模块)

命令StringRedisTemplate 调用
SET … EXopsForValue().set(k, v, Duration)
SET … NX EXopsForValue().setIfAbsent(k, v, Duration)
INCRopsForValue().increment(k)
HINCRBYopsForHash().increment(k, field, 1)
LPUSH/LTRIM/LRANGEopsForList().leftPush/trim/range
SADD/SISMEMBERopsForSet().add/isMember
ZADD/按分数取/倒序取opsForZSet().add/rangeByScore/reverseRange

一分钟表达

Redis(内存数据存储)是放在内存里的数据结构存储,常放在MySQL(关系型数据库)前面做缓存。常用五种类型:String(字符串类型)存单个值,做缓存、验证码限发和原子计数;Hash(哈希)存字段到值,适合经常单独改字段的对象;List(列表)按插入顺序,适合最近N条;Set(集合)不重复,适合去重和求交集;Sorted Set(有序集合)按分数排序,底层是跳表加哈希表,适合排行榜和按期限取任务。缓存每次写入都要带过期时间,重新SET会丢掉旧的过期时间。Redis(内存数据存储)基本是单线程按顺序执行命令,快在内存操作、请求短、不阻塞系统调用;代价是慢命令会让所有请求排队,所以生产不用KEYS,大集合用SCAN系列分批取。

回到应用题说明具体过程。命令按官方文档核对,没有实际运行Redis(内存数据存储);速查表只用于复习,读懂它不等于已经能独立讲清。