目录
1.3、Hash 类型(类似 Java 的 Map / 对象)
先导入必要的类(确保你的项目引入了 Spring Boot Redis 依赖)
一、什么是 Redis?
Redis(Remote Dictionary Server) 是一个开源的、、基于内存的 NoSQL 数据库,据存储在内存中,读取和写入都非常快。是 Key-Value 数据存储系统,常用于缓存、消息队列、排行榜、会话存储等场景。
二、Redis 的特点
特点 | 说明 |
---|---|
内存存储 | 所有数据存储在内存中,访问速度极快(可达微秒级) |
多数据结构 | 支持多种数据类型:String、List、Set、Hash、ZSet(有序集合)等 |
持久化支持 | 可将内存中的数据异步保存到磁盘(RDB 快照、AOF 日志) |
高并发性能 | 单线程模型,但通过非阻塞 I/O 和高效的数据结构实现高性能 |
发布订阅 | 支持 Pub/Sub(发布订阅)功能,可以用作消息中间件 |
分布式支持 | 支持主从复制、哨兵机制、Redis Cluster 实现高可用和扩展性 |
三、Redis 常见的数据类型
数据类型 | 描述 |
---|---|
String | 最基本的数据类型,可以是字符串、数字、JSON 等 |
List | 有序列表,可以从两端插入/弹出(队列、栈) |
Hash | 类似于 Map,用于存储对象 |
Set | 无序集合,不重复元素 |
ZSet | 有序集合,每个元素关联一个分数,按分数排序 |
四、Redis 的典型应用场景
场景 | 示例说明 |
---|---|
缓存 | 缓存数据库查询结果、热点数据等 |
排行榜系统 | 利用 ZSet 存储并排序用户积分等 |
分布式锁 | 利用 SETNX 实现简单的分布式锁 |
消息队列 | 使用 List + 阻塞操作实现任务队列 |
会话管理 | 存储用户 session,快速访问和过期控制 |
限流 | 利用计数器 + 过期时间控制 API 请求频率 |
五、redis-cli
(命令行工具)练习命令
1.1、String 类型(最基本的数据类型)
# 设置键值
SET mykey "hello"
# 获取键值
GET mykey
# 自增(常用于计数器)
SET counter 100
INCR counter # 自增1
DECR counter # 自减1
INCRBY counter 10 # 自增10
1.2、List 类型(链表结构,支持队列/栈)
# 从左边插入元素(栈/队列)
LPUSH mylist "a"
LPUSH mylist "b"
LPUSH mylist "c" # 此时列表为 [c, b, a]
# 查看所有元素
LRANGE mylist 0 -1 # 从索引0到最后(-1)
# 弹出左边第一个元素(出栈/出队)
LPOP mylist
# 弹出右边第一个元素
RPOP mylist
# 获取长度
LLEN mylist
1.3、Hash 类型(类似 Java 的 Map / 对象)
# 设置一个哈希字段
HSET user:1 name "张三"
HSET user:1 age 25
# 获取某个字段
HGET user:1 name
# 获取所有字段
HGETALL user:1
# 判断字段是否存在
HEXISTS user:1 age
# 删除字段
HDEL user:1 age
1.4、Set 类型(无序集合,元素唯一)
# 添加元素
SADD myset "a"
SADD myset "b"
SADD myset "c"
SADD myset "a" # 重复元素不会添加
# 获取所有元素
SMEMBERS myset
# 判断是否存在
SISMEMBER myset "a"
# 删除元素
SREM myset "b"
# 获取集合大小
SCARD myset
1.5、ZSet 类型(有序集合,score 决定排序)
# 添加元素(带分数)
ZADD myzset 100 "Tom"
ZADD myzset 200 "Jerry"
ZADD myzset 150 "Alice"
# 获取从低到高的排名
ZRANGE myzset 0 -1 WITHSCORES
# 获取某个元素的分数
ZSCORE myzset "Alice"
# 获取某个元素的排名
ZRANK myzset "Alice" # 从 0 开始的索引
# 删除成员
ZREM myzset "Tom"
🔄 附加:清除和查看所有键
# 查看所有 key
KEYS *
# 删除 key
DEL mykey
# 清空当前数据库(慎用)
FLUSHDB
六、Java程序中练习命令
先导入必要的类(确保你的项目引入了 Spring Boot Redis 依赖)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
完整的代码实现(包含五种类型的完整操作)
import org.springframework.data.redis.core.*;
import java.util.*;
import java.util.concurrent.TimeUnit;
public class TestRedis {
private final StringRedisTemplate redisTemplate;
public TestRedis(StringRedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void testAllTypes() {
long expireSeconds = 3600; // 设置过期时间:1小时
// 1️⃣ String 类型
String stringKey = "string:key";
redisTemplate.opsForValue().set(stringKey, "hello", expireSeconds, TimeUnit.SECONDS);
System.out.println("读取 String: " + redisTemplate.opsForValue().get(stringKey));
System.out.println("是否存在: " + Boolean.TRUE.equals(redisTemplate.hasKey(stringKey)));
redisTemplate.delete(stringKey);
// 2️⃣ List 类型
String listKey = "list:key";
ListOperations<String, String> listOps = redisTemplate.opsForList();
listOps.leftPushAll(listKey, "a", "b", "c");
redisTemplate.expire(listKey, expireSeconds, TimeUnit.SECONDS);
System.out.println("读取 List: " + listOps.range(listKey, 0, -1));
System.out.println("是否存在: " + Boolean.TRUE.equals(redisTemplate.hasKey(listKey)));
redisTemplate.delete(listKey);
// 3️⃣ Hash 类型
String hashKey = "hash:key";
HashOperations<String, String, String> hashOps = redisTemplate.opsForHash();
Map<String, String> map = new HashMap<>();
map.put("name", "张三");
map.put("age", "25");
hashOps.putAll(hashKey, map);
redisTemplate.expire(hashKey, expireSeconds, TimeUnit.SECONDS);
System.out.println("读取 Hash: " + hashOps.entries(hashKey));
System.out.println("是否存在: " + Boolean.TRUE.equals(redisTemplate.hasKey(hashKey)));
redisTemplate.delete(hashKey);
// 4️⃣ Set 类型
String setKey = "set:key";
SetOperations<String, String> setOps = redisTemplate.opsForSet();
setOps.add(setKey, "a", "b", "c");
redisTemplate.expire(setKey, expireSeconds, TimeUnit.SECONDS);
System.out.println("读取 Set: " + setOps.members(setKey));
System.out.println("是否存在: " + Boolean.TRUE.equals(redisTemplate.hasKey(setKey)));
redisTemplate.delete(setKey);
// 5️⃣ ZSet(Sorted Set)类型
String zsetKey = "zset:key";
ZSetOperations<String, String> zSetOps = redisTemplate.opsForZSet();
zSetOps.add(zsetKey, "Tom", 100);
zSetOps.add(zsetKey, "Jerry", 200);
zSetOps.add(zsetKey, "Alice", 150);
redisTemplate.expire(zsetKey, expireSeconds, TimeUnit.SECONDS);
System.out.println("读取 ZSet: " + zSetOps.rangeWithScores(zsetKey, 0, -1));
System.out.println("是否存在: " + Boolean.TRUE.equals(redisTemplate.hasKey(zsetKey)));
redisTemplate.delete(zsetKey);
}
}
✅ 控制台输出示例(你运行后将看到):
读取 String: hello
是否存在: true
读取 List: [c, b, a]
是否存在: true
读取 Hash: {name=张三, age=25}
是否存在: true
读取 Set: [a, b, c]
是否存在: true
读取 ZSet: [TypedTuple{value='Tom', score=100.0}, ...]
是否存在: true
✅ 说明
操作 | 方法 |
---|---|
读取数据 | get() 、range() 、entries() 、members() 、rangeWithScores() |
判断是否存在 | hasKey(key) |
删除键 | delete(key) |
设置过期时间 | expire(key, time, TimeUnit.SECONDS) |