このフィルムでは、Java での Redis の基本的な使用法を紹介します。
記事ディレクトリ
1. jedisを使用してredisを操作する
1.1 Jedis の概要
Jedis は、Java 言語で開発された Redis クライアント ツールキットであり、Java 言語で Redis データを操作するために使用されます。
github 上の Jedis 公式 Web サイトのアドレス: 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 コマンドを実行できます (これにより、手動で閉じる必要がなくなります)。
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-プール/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);
// 借出连接的时候是否测试有效性,推荐false
config.setTestOnBorrow(false);
// 归还时是否测试,推荐false
config.setTestOnReturn(false);
// 创建时是否测试有效 开发的时候设置为false,实践运行的时候设置为true
config.setTestOnCreate(false);
// 当连接池内jedis无可用资源时,是否等待资源,true
config.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 依存関係の導入
まず、Redis の依存関係を pom.xml ファイルに追加する必要があります。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
この依存関係には、Spring Data Redis と 2 つの Redis クライアント (Jedis と Lettuce) の実装が含まれます。
3.2. Redis 接続の設定
SpringBoot プロジェクトでは、application.properties または application.yml ファイルで Redis 接続情報を構成できます。以下に例を示します。
spring:
data:
redis:
timeout: 3000
database: 0
password: password
port: 6379
host: 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 注解
* */
@Resource
private 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 上で操作する 3 つのメソッドを提供します。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 {
@Autowired
private RedisUtils redisUtils;
@Autowired
private 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;
}
}
この例では、HTTP リクエストを処理する UserController クラスを作成します。getUserById メソッドでは、まずキャッシュされたキーを構築し、次にredisUtils.getValue
そのメソッドを使用して Redis からキャッシュされたデータを取得します。キャッシュにデータがない場合は、userService.getUserById
メソッドを呼び出してデータベースからデータを取得し、redisUtils.cacheValue
そのメソッドを使用してデータを Redis キャッシュに保存します。最後に取得したデータを返却します。
この例では、SpringBoot プロジェクトで Redis をキャッシュとして使用するプロセスを確認できます。まず Redis の依存関係を追加し、次に構成ファイルで Redis 接続情報を構成する必要があります。次に、RedisTemplate の作成と使用を管理するための RedisUtil ツール クラスを作成しました。最後に、コントローラーで RedisUtils を使用して Redis をキャッシュします。