REJAVA / LEARNING NOTES
第16课速查:Redis(内存数据存储)数据类型
随时回查术语、规则和示例;完整解释见对应课程。
根据课程材料整理
本次更新说明
- 整理为公开学习笔记,保留要点、对照表与练习入口。
五种类型怎么选
| 类型 | 值的样子 | 办件系统例子与命令 |
|---|---|---|
| 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的取舍)。
过期时间的三条规矩
- SET带EX,或对已有键执行EXPIRE;
TTL(剩余存活时间) 返回 −1=没有过期时间,−2=键不存在。 - 重新SET会丢弃旧的过期时间 ;DEL、SET、GETSET会清掉,INCR、追加等只改内容的命令会保留。Java里每次
set都传Duration。 - 过期删除有被动(访问时发现)和主动(定期随机抽查)两种,过期键可能短暂占内存。
计数加过期: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 … EX | opsForValue().set(k, v, Duration) |
| SET … NX EX | opsForValue().setIfAbsent(k, v, Duration) |
| INCR | opsForValue().increment(k) |
| HINCRBY | opsForHash().increment(k, field, 1) |
| LPUSH/LTRIM/LRANGE | opsForList().leftPush/trim/range |
| SADD/SISMEMBER | opsForSet().add/isMember |
| ZADD/按分数取/倒序取 | opsForZSet().add/rangeByScore/reverseRange |
一分钟表达
Redis(内存数据存储)是放在内存里的数据结构存储,常放在MySQL(关系型数据库)前面做缓存。常用五种类型:String(字符串类型)存单个值,做缓存、验证码限发和原子计数;Hash(哈希)存字段到值,适合经常单独改字段的对象;List(列表)按插入顺序,适合最近N条;Set(集合)不重复,适合去重和求交集;Sorted Set(有序集合)按分数排序,底层是跳表加哈希表,适合排行榜和按期限取任务。缓存每次写入都要带过期时间,重新SET会丢掉旧的过期时间。Redis(内存数据存储)基本是单线程按顺序执行命令,快在内存操作、请求短、不阻塞系统调用;代价是慢命令会让所有请求排队,所以生产不用KEYS,大集合用SCAN系列分批取。
回到应用题说明具体过程。命令按官方文档核对,没有实际运行Redis(内存数据存储);速查表只用于复习,读懂它不等于已经能独立讲清。