首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 整合 Redis 實戰指南:Jedis 連接池與五大數據類型操作

     編輯:Java 綜合教學

Redis 核心數據類型與應用場景

類型底層結構典型命令應用場景
StringSDS 動態字符串SET/GET/INCR/DECR/MGET緩存、計數器、分佈式鎖
HashHashMap/ZipmapHSET/HGET/HGETALL對象存儲(用戶信息),避免序列化開銷
List雙向鏈表LPUSH/RPUSH/LPOP/RPOP/LRANGE消息隊列、關注列表、最新評論
SetHashMap(value=null)SADD/SPOP/SMEMBERS/SUNION標籤系統、共同好友、去重集合
Sorted SetHashMap + SkipListZADD/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 拆分,防止阻塞主線程
  • 合理設置過期時間,配合隨機值防止雪崩
  • 監控慢日誌、內存碎片率、命中率
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved