本片將介紹 Redis 在 Java 中的基本使用
文章目錄
- 1、使用jedis操作redis
- 1.1、Jedis簡介
- 1.2、引入jedis的Maven依賴
- 1.2、獲取連接
- 1.3、使用實例
- 2、對于JedisPooled的使用
- 2.1、使用JedisPooled
- 2.2、關于連接池
- 3、SpringBoot下使用Redis
- 3.1、引入Maven依賴
- 3.2、配置Redis連接
- 3.3、創建RedisTemplate
- 3.4、使用RedisTemplate
1、使用jedis操作redis
1.1、Jedis簡介
Jedis 是 Java 語言開發的 Redis 客戶端工具包,用于 Java 語言與 Redis 數據進行交互。
Jedis 在 github 官網地址:https://github.com/redis/jedis#readme
Jedis 只是對 Redis 命令的封裝,掌握 Redis 命令便可輕易上手 Jedis。
Jedis 遵循 RESP 協議規范開發,具有良好的通用性與可讀性。
1.2、引入jedis的Maven依賴
<!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.4.3</version></dependency>
1.2、獲取連接
對于許多應用程序,需要連接到 Redis 時。最好使用連接池。可以像這樣實例化一個 Jedis 連接池:
JedisPool pool = new JedisPool("localhost", 6379);
對于 JedisPool 實例,可以使用 try-With-resources 塊獲得連接并運行 Redis 命令(這種方式無須自己手動 close)。
try (Jedis jedis = pool.getResource()) {// 運行單個 SET 命令jedis.set("clientName", "Jedis");
}
1.3、使用實例
編寫以下代碼:
public static void main(String[] args) {// Redis服務端IP和端口號JedisPool pool = new JedisPool("127.0.0.1", 6379);try (Jedis jedis = pool.getResource()) {// 使用相關Redis的命令// 選擇第0個數據庫進行操作jedis.select(0);// 向0號數據庫寫入,字符串數據jedis.set("Java", "best");jedis.set("PHP", "good");// 查詢是否寫入System.out.println(jedis.get("Java"));System.out.println(jedis.get("PHP"));}}
運行測試用例:
Jedis 實例實現了大多數 Redis 命令,這些命令可以在 https://www.javadoc.io/doc/redis.clients/jedis/latest/redis/clients/jedis/Jedis.htmlApI 中查詢命令對應的方法。
2、對于JedisPooled的使用
2.1、使用JedisPooled
對每個命令使用 try-with-resources 塊可能比較麻煩,因此我們可以考慮使用 JedisPooled。
JedisPooled jedis = new JedisPooled("localhost", 6379);
詳細代碼:
public static void main(String[] args) {JedisPooled pool = new JedisPooled("127.0.0.1", 6379, null, null);pool.set("Java", "best");pool.set("PHP", "good");System.out.println(pool.get("Java"));System.out.println(pool.get("PHP"));}
運行效果:
2.2、關于連接池
使用鏈接池是官方推薦的使用方式,通過連接池可以更好的使用 Jedis 的,我們可以通過 GenericObjectPoolConfig 對連接池進行相關配置,GenericObjectPoolConfig API 文檔:https://commons.apache.org/proper/commons-pool/apidocs/org/apache/commons/pool2/impl/GenericObjectPoolConfig.html
通過 GenericObjectPoolConfig 對象對連接池進行配置,具體代碼如下:
public static void main(String[] args) {GenericObjectPoolConfig config = new JedisPoolConfig();// 設置連接池中最多允許放100個Jedis對象config.setMaxTotal(100);// 設置連接池中最大允許空閑連接config.setMaxIdle(100);// 設置連接池中最小允許的連接數config.setMinIdle(10);// 借出連接的時候是否測試有效性,推薦falseconfig.setTestOnBorrow(false);// 歸還時是否測試,推薦falseconfig.setTestOnReturn(false);// 創建時是否測試有效 開發的時候設置為false,實踐運行的時候設置為trueconfig.setTestOnCreate(false);// 當連接池內jedis無可用資源時,是否等待資源,trueconfig.setBlockWhenExhausted(true);// 沒有獲取資源時最長等待1秒,1秒后沒有還沒有的話就報錯config.setMaxWaitMillis(1000);JedisPool pool = new JedisPool(config, "127.0.0.1", 6379);try (Jedis jedis = pool.getResource()) {// 使用相關Redis的命令// 選擇第0個數據庫進行操作jedis.select(0);// 向0號數據庫寫入,字符串數據jedis.set("Java", "best");jedis.set("PHP", "good");// 查詢是否寫入System.out.println(jedis.get("Java"));System.out.println(jedis.get("PHP"));}}
運行效果:
3、SpringBoot下使用Redis
3.1、引入Maven依賴
首先,需要在 pom.xml 文件中添加 Redis 依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
這個依賴包含了 Spring Data Redis,以及 Jedis 和 Lettuce 這兩種 Redis 客戶端的實現。
3.2、配置Redis連接
在 SpringBoot 項目中,可以通過在 application.properties 或 application.yml 文件中配置 Redis 連接信息。以下是一個示例:
spring:data:redis:timeout: 3000database: 0password: passwordport: 6379host: localhost
其中,host 和 port 分別是 Redis 服務器的地址和端口號,password 是 Redis的密碼(如果沒有密碼,可以不填),timeout 是 Redis 連接超時時間,jedis.pool 是連接池的相關設置。
3.3、創建RedisTemplate
使用 Spring Data Redis 操作 Redis,通常會使用 RedisTemplate 類。為了方便起見,我們可以創建一個工具類來管理 RedisTemplate 的創建和使用。以下是一個示例:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.Set;
import java.util.concurrent.TimeUnit;@Component
public class RedisUtils {/*** 如果使用 @Autowired 注解完成自動裝配 那么* RedisTemplate要么不指定泛型,要么泛型 為<Stirng,String> 或者<Object,Object>* 如果你使用其他類型的 比如RedisTemplate<String,Object>* 那么請使用 @Resource 注解* */@Resourceprivate RedisTemplate<String,Object> redisTemplate;private Logger logger = LoggerFactory.getLogger(this.getClass());/*** 緩存value** @param key -* @param value -* @param time -* @return -*/public boolean cacheValue(String key, Object value, long time) {try {ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();valueOperations.set(key, value);if (time > 0) {// 如果有設置超時時間的話redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Throwable e) {logger.error("緩存[" + key + "]失敗, value[" + value + "] " + e.getMessage());}return false;}/*** 緩存value,沒有設置超時時間** @param key -* @param value -* @return -*/public boolean cacheValue(String key, Object value) {return cacheValue(key, value, -1);}/*** 判斷緩存是否存在** @param key* @return*/public boolean containsKey(String key) {try {return redisTemplate.hasKey(key);} catch (Throwable e) {logger.error("判斷緩存是否存在時失敗key[" + key + "]", "err[" + e.getMessage() + "]");}return false;}/*** 根據key,獲取緩存** @param key -* @return -*/public Object getValue(String key) {try {ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();return valueOperations.get(key);} catch (Throwable e) {logger.error("獲取緩存時失敗key[" + key + "]", "err[" + e.getMessage() + "]");}return null;}/*** 移除緩存** @param key -* @return -*/public boolean removeValue(String key) {try {redisTemplate.delete(key);return true;} catch (Throwable e) {logger.error("移除緩存時失敗key[" + key + "]", "err[" + e.getMessage() + "]");}return false;}/*** 根據前綴移除所有以傳入前綴開頭的key-value** @param pattern -* @return -*/public boolean removeKeys(String pattern) {try {Set<String> keySet = redisTemplate.keys(pattern + "*");redisTemplate.delete(keySet);return true;} catch (Throwable e) {logger.error("移除key[" + pattern + "]前綴的緩存時失敗", "err[" + e.getMessage() + "]");}return false;}}
在這個示例中,我們使用 @Resource
注解自動注入了一個 RedisTemplate<String, Object>
對象。然后,我們提供了三個方法來對 Redis 進行操作:cacheValue 方法用于緩存數據,getValue 方法用于獲取緩存數據,removeValue 方法用于刪除緩存數據。這些方法都是通過 redisTemplate 對象來實現的。
需要注意的是,在使用 RedisTemplate 時,需要指定鍵值對的類型。在這個示例中,我們指定了鍵的類型為 String,值的類型為 Object。
3.4、使用RedisTemplate
在上面的示例中,我們已經創建了一個 RedisTemplate 對象,并提供了一些方法來對 Redis 進行操作。現在,我們可以在 SpringBoot 項目中的任何地方使用這個工具類來進行緩存操作。以下是一個示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Autowiredprivate RedisUtils redisUtils;@Autowiredprivate UserService userService;@GetMapping("/users/{id}")public User getUserById(@PathVariable Long id) {String key = "user_" + id;User user = (User) redisUtils.getValue(key);if (user == null) {user = userService.getUserById(id);redisUtils.cacheValue(key, user);}return user;}
}
在這個示例中,我們創建了一個 UserController 類,用于處理 HTTP 請求。在 getUserById 方法中,我們首先構造了一個緩存的 key,然后使用 redisUtils.getValue
方法從 Redis 中獲取緩存數據。如果緩存中沒有數據,我們調用 userService.getUserById
方法從數據庫中獲取數據,并使用 redisUtils.cacheValue
方法將數據存入Redis緩存中。最后,返回獲取到的數據。
通過這個示例,我們可以看到,在S pringBoot 項目中使用 Redis 作為緩存的流程。我們首先需要添加 Redis 依賴,然后在配置文件中配置 Redis 連接信息。接著,我們創建了一個 RedisUtil s工具類來管理 RedisTemplate 的創建和使用。最后,我們在控制器中使用 RedisUtils 來對 Redis 進行緩存操作。