Redis 入门指南
2026/1/14大约 4 分钟
Redis 入门指南
本文为 Java 开发者提供一份全面的 Redis 入门指南,涵盖核心概念、安装配置、Jedis 客户端使用,以及五大数据类型实战。
一、为什么需要 Redis?
在高并发、高性能的互联网应用中,传统关系型数据库容易成为性能瓶颈。Redis 作为高效的缓存中间件,能有效分担数据库压力。
Redis(Remote Dictionary Server) 是一个开源的、基于内存的键值对存储系统,读写速度可达 10万次/秒以上。
核心应用场景
| 场景 | 说明 |
|---|---|
| 缓存 | 加速数据访问,减轻数据库压力 |
| 会话缓存 | 分布式系统中存储用户会话信息 |
| 排行榜/计数器 | 利用有序集合实现实时排行榜 |
| 消息队列 | 利用列表的阻塞操作实现简单队列 |
| 分布式锁 | 在集群环境下实现跨 JVM 的互斥锁 |
二、Redis 安装
Windows 系统
下载地址:https://github.com/microsoftarchive/redis/releases
下载 Redis-x64-*.msi 安装包直接安装,服务会自动启动。
Linux 系统(Ubuntu)
sudo apt update
sudo apt install redis-server
# 服务管理
sudo systemctl start redis # 启动
sudo systemctl status redis # 状态
sudo systemctl stop redis # 停止Docker(推荐)
docker run --name some-redis -d -p 6379:6379 redis验证安装:终端输入 redis-cli,出现 127.0.0.1:6379> 提示符即成功。
三、Java 连接 Redis:Jedis 客户端
1. Maven 依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.4.3</version>
</dependency>2. 基本连接示例
import redis.clients.jedis.Jedis;
public class RedisFirstDemo {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
try {
// PING 测试
String response = jedis.ping();
System.out.println("服务器响应: " + response); // PONG
// 基本操作
jedis.set("company", "CSDN");
String value = jedis.get("company");
System.out.println("获取到的值: " + value);
} finally {
jedis.close();
}
}
}3. 使用连接池(生产环境必备)
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisPoolDemo {
private static JedisPool jedisPool;
static {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(10); // 最大连接数
poolConfig.setMaxIdle(5); // 最大空闲连接
poolConfig.setMinIdle(1); // 最小空闲连接
jedisPool = new JedisPool(poolConfig, "localhost", 6379, 2000);
}
public static void main(String[] args) {
try (Jedis jedis = jedisPool.getResource()) {
jedis.set("author", "XXXX");
System.out.println("作者: " + jedis.get("author"));
}
jedisPool.close();
}
}四、五大核心数据类型
1. String(字符串)
最基础的类型,可存储字符串、整数或浮点数。
应用场景:缓存、计数器、分布式锁
try (Jedis jedis = jedisPool.getResource()) {
// 增/改
jedis.set("page:visits", "1000");
// 查
String visits = jedis.get("page:visits");
// 删
jedis.del("page:visits");
// 自增(原子操作,适合计数器)
Long newVisits = jedis.incr("page:visits");
jedis.incrBy("page:visits", 50);
}2. Hash(哈希)
类似 Java 的 Map<String, String>,适合存储对象。
应用场景:存储用户信息、商品信息
try (Jedis jedis = jedisPool.getResource()) {
String userKey = "user:1001";
// 设置多个字段
Map<String, String> userMap = new HashMap<>();
userMap.put("name", "ZhangSan");
userMap.put("age", "28");
userMap.put("city", "Beijing");
jedis.hset(userKey, userMap);
// 获取单个字段
String name = jedis.hget(userKey, "name");
// 获取所有字段
Map<String, String> fullUser = jedis.hgetAll(userKey);
// 删除某个字段
jedis.hdel(userKey, "age");
}3. List(列表)
有序字符串列表,支持两端操作。
应用场景:消息队列、最新消息排行、朋友圈时间线
try (Jedis jedis = jedisPool.getResource()) {
String listKey = "task:queue";
// 从左边插入
jedis.lpush(listKey, "task1", "task2", "task3");
// 从右边插入
jedis.rpush(listKey, "task4");
// 从左边弹出
String firstTask = jedis.lpop(listKey);
// 从右边弹出
String lastTask = jedis.rpop(listKey);
// 获取列表片段
List<String> tasks = jedis.lrange(listKey, 0, -1);
}4. Set(集合)
无序集合,元素不重复。
应用场景:共同好友(交集)、点赞用户、随机推荐
try (Jedis jedis = jedisPool.getResource()) {
String setKey1 = "user:1001:follow";
String setKey2 = "user:1002:follow";
// 添加元素
jedis.sadd(setKey1, "user:2001", "user:2002", "user:2003");
jedis.sadd(setKey2, "user:2002", "user:2003", "user:2004");
// 判断元素是否存在
Boolean isMember = jedis.sismember(setKey1, "user:2001");
// 求交集(共同关注)
Set<String> commonFollow = jedis.sinter(setKey1, setKey2);
}5. Sorted Set(有序集合)
带分数的有序集合,按分数排序。
应用场景:排行榜、带权重的消息队列
try (Jedis jedis = jedisPool.getResource()) {
String rankKey = "leaderboard";
// 添加元素(分数-成员)
jedis.zadd(rankKey, 95.5, "PlayerA");
jedis.zadd(rankKey, 87.0, "PlayerB");
jedis.zadd(rankKey, 100.0, "PlayerC");
// 按分数降序获取(排行榜)
Set<String> top2 = jedis.zrevrange(rankKey, 0, 1);
// 获取排名(从0开始)
Long rank = jedis.zrevrank(rankKey, "PlayerA");
// 获取分数
Double score = jedis.zscore(rankKey, "PlayerA");
}五、实战:文章点赞功能
利用 Set 的去重特性实现"一人一赞"。
public class ArticleLikeService {
private JedisPool jedisPool;
public ArticleLikeService(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
// 点赞
public boolean likeArticle(String articleId, String userId) {
String key = "article:like:" + articleId;
try (Jedis jedis = jedisPool.getResource()) {
return jedis.sadd(key, userId) == 1;
}
}
// 取消点赞
public boolean unlikeArticle(String articleId, String userId) {
String key = "article:like:" + articleId;
try (Jedis jedis = jedisPool.getResource()) {
return jedis.srem(key, userId) == 1;
}
}
// 获取点赞数
public long getLikeCount(String articleId) {
String key = "article:like:" + articleId;
try (Jedis jedis = jedisPool.getResource()) {
return jedis.scard(key);
}
}
// 判断是否点赞
public boolean isUserLiked(String articleId, String userId) {
String key = "article:like:" + articleId;
try (Jedis jedis = jedisPool.getResource()) {
return jedis.sismember(key, userId);
}
}
}六、进阶知识
持久化
- RDB(快照):定时生成数据快照,性能好但可能丢失最后一次快照后的数据
- AOF(追加日志):记录每次写操作,数据更安全但文件更大
过期时间
jedis.set("temp:data", "someValue");
jedis.expire("temp:data", 60); // 60秒后过期
// 或一步到位
jedis.setex("temp:data", 3600, "value"); // 1小时后过期事务
Transaction tx = jedis.multi();
tx.set("key1", "value1");
tx.set("key2", "value2");
tx.exec();参考资料
参考文章:CSDN - a58769