Redis 核心數據類型與應用場景
| 類型 | 底層結構 | 典型命令 | 應用場景 |
| String | SDS 動態字符串 | SET/GET/INCR/DECR/MGET | 緩存、計數器、分佈式鎖 |
| Hash | HashMap/Zipmap | HSET/HGET/HGETALL | 對象存儲(用戶信息),避免序列化開銷 |
| List | 雙向鏈表 | LPUSH/RPUSH/LPOP/RPOP/LRANGE | 消息隊列、關注列表、最新評論 |
| Set | HashMap(value=null) | SADD/SPOP/SMEMBERS/SUNION | 標籤系統、共同好友、去重集合 |
| Sorted Set | HashMap + SkipList | ZADD/ZRANGE/ZREM/ZCARD | 排行榜、延遲隊列、按權重排序 |
Jedis 連接池最佳實踐
Maven 依賴
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version> <!-- 建議使用較新版本 -->
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.11.1</version>
</dependency>
連接池配置類
public class RedisPool {
private static JedisPool pool;
public static JedisPool getPool() {
if (pool == null) {
JedisPoolConfig cfg = new JedisPoolConfig();
cfg.setMaxTotal(500); // 最大連接數
cfg.setMaxIdle(50); // 最大空閒
cfg.setMinIdle(10); // 最小空閒
cfg.setMaxWaitMillis(3000); // 獲取超時
cfg.setTestOnBorrow(true); // 借用前檢測可用性
pool = new JedisPool(cfg, "192.168.10.241", 6379);
}
return pool;
}
public static void close(Jedis jedis) {
if (jedis != null) jedis.close(); // 歸還連接池
}
}
安全操作模板
public String safeGet(String key) {
Jedis jedis = null;
try {
jedis = RedisPool.getPool().getResource();
return jedis.get(key);
} catch (Exception e) {
if (jedis != null) RedisPool.getPool().returnBrokenResource(jedis);
throw new RuntimeException("Redis get failed", e);
} finally {
RedisPool.close(jedis);
}
}
五大類型 Java 操作範例
String
jedis.set("token:1001", "abc123");
jedis.expire("token:1001", 3600); // 1小時過期
String val = jedis.get("token:1001");
Hash(用戶對象存儲)
// 寫入
jedis.hset("user:1001", "name", "張三");
jedis.hset("user:1001", "age", "28");
jedis.hset("user:1001", "city", "北京");
// 讀取單字段
String name = jedis.hget("user:1001", "name");
// 讀取全部
Map<String, String> user = jedis.hgetAll("user:1001");
List(簡易消息隊列)
// 生產者
jedis.lpush("queue:orders", "order_001");
// 消費者(阻塞式)
List<String> msg = jedis.brpop(5, "queue:orders"); // 5秒超時
// 查看範圍
List<String> recent = jedis.lrange("queue:orders", 0, 9);
Set(標籤/去重)
jedis.sadd("tags:article:1001", "java", "redis", "jedis");
boolean has = jedis.sismember("tags:article:1001", "redis");
Set<String> all = jedis.smembers("tags:article:1001");
Set<String> common = jedis.sinter("tags:a", "tags:b"); // 交集
Sorted Set(熱門排行榜)
// score 為點擊量
jedis.zadd("rank:daily", 100, "article_1");
jedis.zadd("rank:daily", 200, "article_2");
// 降序 Top 10
Set<Tuple> top10 = jedis.zrevrangeWithScores("rank:daily", 0, 9);
// 獲取排名
Long rank = jedis.zrevrank("rank:daily", "article_1");
Keys 模糊查詢(慎用生產環境)
Set<String> keys = jedis.keys("user:*"); // 全量掃描,阻塞主線程
// 生產環境建議使用 SCAN 迭代器
ScanParams params = new ScanParams().match("user:*").count(100);
String cursor = "0";
do {
ScanResult<String> result = jedis.scan(cursor, params);
cursor = result.getCursor();
process(result.getResult());
} while (!"0".equals(cursor));
Spring Boot 整合(現代項目推薦)
# application.yml
spring:
redis:
host: 192.168.10.241
port: 6379
lettuce:
pool:
max-active: 500
max-idle: 50
min-idle: 10
// 自動裝配 StringRedisTemplate / RedisTemplate
@Autowired StringRedisTemplate redisTemplate;
redisTemplate.opsForValue().set("key", "value");
性能優化建議
- 使用連接池,避免頻繁創建連接
- Pipeline 批量操作減少 RTT
- 大 Key 拆分,防止阻塞主線程
- 合理設置過期時間,配合隨機值防止雪崩
- 監控慢日誌、內存碎片率、命中率