目錄
0 環境
- 系統環境: win10
- 編輯器: IDEA
- maven
1 前言
redis不支持遠程連接 需手啟
- 修改地方(找到config)
- 把bind:127.0.0.1注釋掉
- 密碼校驗開啟(去掉requirepass注解 在vim搜索:/requirepass)
- ok后 保存退出啟動redis
2 Jedis(maven篇)基本使用
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簡介
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中線程不安全的問題 封裝的更凶) 並且支持同步 異步 響應調用 多個線程共享一個實例