redis-java客戶端學習筆記


0 環境

  • 系統環境: win10
  • 編輯器: IDEA
  • maven

1 前言

redis不支持遠程連接 需手啟

  • 修改地方(找到config)
    • 把bind:127.0.0.1注釋掉
    • 密碼校驗開啟(去掉requirepass注解 在vim搜索:/requirepass)
  • ok后 保存退出啟動redis

2 Jedis(maven篇)基本使用

jedis參考

1 創建maven項目 添加依賴

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.2.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

2 創建測試方法

// 一旦連接了 API方法和redis命令很相似 即學即用
public class MyJdis {
    public static void main(String[] args) {
        // 1 new一個jedis對象 默認6379
        Jedis jedis = new Jedis("你的host");
        // 2 密碼認證
        jedis.auth("123456");
        // 3 測試是否連通
        String ping = jedis.ping();
        // 4 返回PONG 說明連接成功
        System.out.println(ping);

    }
}

3 啟動

3 Jedis(maven篇)升級

1 連接池簡介

一般是使用連接池 首先jedis對象非線程安全 使用jedis對象時 通過連接池獲取jedis 用完歸還給連接池

2 連接池改進

public class JedisPoolDemo {
    public static void main(String[] args) {
        // v1版
//        test();
        // v2版 添加異常(解決v1版 拋出異常時 無法執行的情況)
//        test1();
        // v3版 語法糖(jdk1.7 try-with-resource) 可在target目錄找到相對應的xx.class查看發現還是那套
        test2();



    }

    private static void test2() {
        // 1 創建一個連接池
        JedisPool jedisPool = new JedisPool("xxx", 6379);
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.auth("123456");
            // 3 jedis操作
            String ping = jedis.ping();
            System.out.println(ping);
        }
    }

    // 添加異常 確保關閉連接
    private static void test1() {
        // 1 創建一個連接池
        JedisPool jedisPool = new JedisPool("xxx", 6379);
        // 2 從連接池中獲取一個Jedis
        Jedis jedis = jedisPool.getResource();
        jedis.auth("123456");
        try {
            // 3 jedis操作
            String ping = jedis.ping();
            System.out.println(ping);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 4 關閉連接
            if (jedis != null) {
                jedis.close();
            }
        }
    }
  
    // 簡化代碼量
    private static void test() {
        // 1 創建一個連接池
        JedisPool jedisPool = new JedisPool("xxx", 6379);
        // 2 從連接池中獲取一個Jedis
        Jedis jedis = jedisPool.getResource();
        jedis.auth("123456");

        // 3 jedis操作
        String ping = jedis.ping();
        System.out.println(ping);
        // 4 關閉連接
        jedis.close();
    }
}

3 對連接池強約束

public interface CallWithJedis {
    void call(Jedis jedis);
}

public class CallRedisDemo {
    private JedisPool jedisPool;

    // 配置
    public CallRedisDemo() {
        GenericObjectPoolConfig config = new GenericObjectPoolConfig();
        // 連接池最大空閑數
        config.setMaxIdle(300);
        // 最大連接數
        config.setMaxTotal(1000);
        // 連接最大等待時間 若是-1 則無限制
        config.setMaxWaitMillis(200000);
        // 在空閑時檢查有效性
        config.setTestOnBorrow(true);

        /*
        * GenericObjectPoolConfig poolConfig, String host, int port, int timeout, String password
        * 1 redis地址
        * 2 redis端口
        * 3 連接超時時間
        * 4 密碼
        * */
        jedisPool = new JedisPool(config, "xxxx", 6379, 20000, "123456");

    }

    // 執行
    // 執行失敗 --> 請求重試(這樣語法糖就不能用了 試太多也沒意思 估計有問題)
    public void execute(CallWithJedis callWithJedis){
        try (Jedis jedis = jedisPool.getResource()){
            callWithJedis.call(jedis);
        }
    }


}

// 測試是否連接
public class CallWithJedisDemo {
    public static void main(String[] args) {
        CallRedisDemo redisDemo = new CallRedisDemo();
        redisDemo.execute(jedis -> {
            System.out.println(jedis.ping());
        });
    }
}

4 啟動

4 lettuce簡介

lettuce參考

1 創建maven項目 添加其依賴

<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

2 測試

public class LettuceTest {
    public static void main(String[] args) {
        // 密碼和host直接寫在一起
        RedisClient redisClient = RedisClient.create("redis://密碼@你的host");
        StatefulRedisConnection<String, String> connect = redisClient.connect();
        RedisCommands<String, String> sync = connect.sync();
        sync.set("name", "kitty");
        String name = sync.get("name");
        System.out.println(name);
    }
}

3 啟動

5 小結

jedis -> 連接池的改進 添加異常 添加語法糖 強約束 通過接口
jedis和lettuce對比

  • jedis直接連接redis 線程不安全 多個線程間共享一個jedis實例 想多線程 得加連接池 保證每個線程都有自己的jedis實例
  • lettuce由netty nio構建(解決jedis中線程不安全的問題 封裝的更凶) 並且支持同步 異步 響應調用 多個線程共享一個實例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM