核心技术栈:Spring Data Redis(StringRedisTemplate 是Spring对redis的封装工具),专为字符串类型数据设计的Redis操作模板,默认String序列化,可读性高
核心方法:opsforvalue()
1. 核心:String 类型(项目中用得最多)
对应 Redis 的
SET/GET/DEL/EXPIRE 等命令,是验证码、Token、店铺缓存等场景的核心。| 方法 | 作用 | 黑马点评实战示例 |
|---|---|---|
opsForValue().set(key, value) |
存储字符串键值对(无过期时间) | 临时存储用户登录态:opsForValue().set("login:token:1001", "xxx") |
opsForValue().set(key, value, timeout, unit) |
存储并设置过期时间 | 验证码存储:set("login:code:13800000000", "123456", 2, TimeUnit.MINUTES) |
opsForValue().setIfAbsent(key, value, timeout, unit) |
原子性设置(NX,键不存在才设置) | 防重复发送验证码:避免同一手机号并发存多个验证码 |
opsForValue().get(key) |
获取键对应的值 | 读取验证码:get("login:code:13800000000") |
opsForValue().getAndSet(key, newValue) |
获取旧值并设置新值 | 刷新 Token 有效期:获取旧 Token 同时设置新过期时间 |
delete(key) |
删除指定键 | 用户登出:delete("login:token:1001") |
expire(key, timeout, unit) |
给已存在的键设置过期时间 | 延长 Token 有效期:expire("login:token:1001", 30, TimeUnit.MINUTES) |
getExpire(key) |
获取键的剩余过期时间(秒) | 检查 Token 是否即将过期:getExpire("login:token:1001") |
2. Hash 类型(适合存储对象属性)
对应 Redis 的
HSET/HGET/HDEL 等命令,黑马点评中用于存储「用户信息、店铺详情」等结构化数据。| 方法 | 作用 | 黑马点评实战示例 |
|---|---|---|
opsForHash().put(key, hashKey, value) |
给 Hash 键设置单个属性 | 存储用户信息:opsForHash().put("user:1001", "name", "张三") |
opsForHash().putAll(key, map) |
批量设置 Hash 属性 | 批量存储店铺信息:putAll("shop:10", Map.of("name", "奶茶店", "typeId", 1)) |
opsForHash().get(key, hashKey) |
获取 Hash 中单个属性值 | 读取店铺名称:get("shop:10", "name") |
opsForHash().entries(key) |
获取 Hash 所有属性(返回 Map) | 读取完整用户信息:entries("user:1001") → 转 User 对象 |
opsForHash().delete(key, hashKeys) |
删除 Hash 中指定属性 | 删除用户无用属性:delete("user:1001", "age") |
3. List 类型(有序列表,适合队列 / 栈)
对应 Redis 的
LPUSH/RPUSH/LPOP/RPOP 等命令,黑马点评中用于「消息队列(简易版)、用户浏览记录」。| 方法 | 作用 | 黑马点评实战示例 |
|---|---|---|
opsForList().leftPush(key, value) |
从列表左侧添加元素(栈顶) | 存储用户浏览记录(最新的在最前):leftPush("history:1001", "shop:10") |
opsForList().range(key, start, end) |
获取列表指定范围元素 | 读取前 10 条浏览记录:range("history:1001", 0, 9) |
opsForList().rightPop(key) |
从列表右侧弹出元素(队列尾) | 简易消息队列消费:rightPop("queue:order") |
opsForList().trim(key, start, end) |
裁剪列表(只保留指定范围) | 限制浏览记录最多 10 条:trim("history:1001", 0, 9) |
4. Set 类型(无序不重复集合)
对应 Redis 的
SADD/SMEMBERS/SISMEMBER 等命令,黑马点评中用于「用户点赞、店铺标签」。| 方法 | 作用 | 黑马点评实战示例 |
|---|---|---|
opsForSet().add(key, values) |
向集合添加元素 | 给店铺打标签:add("shop:tag:10", "奶茶", "网红", "平价") |
opsForSet().isMember(key, value) |
判断元素是否在集合中 | 检查用户是否点赞:isMember("like:shop:10", "user:1001") |
opsForSet().members(key) |
获取集合所有元素 | 读取店铺所有标签:members("shop:tag:10") |
opsForSet().remove(key, values) |
移除集合中指定元素 | 取消用户点赞:remove("like:shop:10", "user:1001") |
5. ZSet 类型(有序不重复集合,核心是分值)
对应 Redis 的
ZADD/ZRANGE/ZSCORE 等命令,黑马点评中「GEO 地理查询(底层是 ZSet)、秒杀商品排序」都依赖它。| 方法 | 作用 | 黑马点评实战示例 |
|---|---|---|
opsForZSet().add(key, value, score) |
添加元素并指定分值(排序依据) | GEO 底层:add("shop:geo:1", "shop:10", 120.149993)(经纬度转分值) |
opsForZSet().rangeByScore(key, min, max) |
按分值范围获取元素 | 按距离排序查店铺:rangeByScore("shop:geo:1", 0, 1000) |
opsForZSet().score(key, value) |
获取元素的分值 | 读取店铺的经纬度分值:score("shop:geo:1", "shop:10") |
opsForZSet().incrementScore(key, value, delta) |
增加元素分值 | 秒杀商品热度加分:incrementScore("seckill:hot", "goods:1", 1) |
6. GEO 类型(地理空间,黑马点评核心)
虽无单独的
opsForGeo() 方法,但 StringRedisTemplate 可通过 opsForGeo() 操作 GEO(本质是 ZSet),对应你之前的「附近店铺查询」:| 方法 | 作用 | 黑马点评实战示例 |
|---|---|---|
opsForGeo().add(key, point, member) |
添加地理坐标 | 存储店铺经纬度:add("shop:geo:1", new Point(120.149993, 30.334229), "shop:10") |
opsForGeo().radius(key, circle, args) |
按半径查询附近元素 | 查附近店铺:radius("shop:geo:1", new Circle(new Point(x,y), 1000), args) |
浙公网安备 33010602011771号