記事ディレクトリ
Java と Redis の統合
Redis は、永続層データに MySQL を使用するのと同じように、主にプロジェクト内のキャッシュに使用されます。Redis クライアントには 2 つの実装があります。
1 つは、Java が JDBC を使用してデータベースを操作する方法と同様に、Jedis を直接呼び出して実装する方法です。
2 つ目は、Spring のパッケージを通じて呼び出される Spring-Data-Redis を使用する方法です。
1. ジェダイ
Jedis は Redis が公式に推奨する Java 接続開発ツールであり、Jedis は Java バージョンの Redis のクライアント実装です。
Java が JDBC テクノロジーを通じて MySQL データベースを操作するのと同様に、Java は Jedis を通じて Redis サービスを操作します。
Jedis は、メソッド名のほとんどが対応するコマンドと基本的に同じであるため、Redis の一般的なデータ型のコマンド操作を通じて簡単に使用できます。Redis の共通データ型コマンドについては、以前の記事「Redis の共通データ型コマンド」を参照してください。
Jedis の簡単な使用法は次のとおりです。
まず、Jedis の Maven 依存関係を紹介します。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.0</version>
</dependency>
テストコードは次のとおりです。
public class JedisTest {
Jedis jedis;
/**
* 初始化Jedis实例
*/
@Before
public void init() {
//指定Redis服务器的IP地址和端口号
jedis = new Jedis("192.168.43.100", 6379);
}
@Test
public void redisJedisTest() {
//操作字符串
//方法名与操作原生redis的命令一致
jedis.set("dec", "hello");
String dec = jedis.get("dec");
System.out.println(dec);
//操作list
jedis.lpush("data", "v1", "v2", "v3");
jedis.rpush("data", "v4", "v5", "v6");
List<String> data = jedis.lrange("data", 0, -1);
for (String s : data) {
System.out.print(s + " ");
}
System.out.println();
//操作hash
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("id", "1");
hashMap.put("name", "huhai");
hashMap.put("age", "24");
jedis.hset("object", hashMap);
Map<String, String> object = jedis.hgetAll("object");
object.forEach((key, value) -> System.out.print(key + "=" + value + " "));
}
/**
* 关闭Jedis连接
*/
@After
public void close() {
jedis.close();
}
}
端末の出力は次のとおりです。
hello
v3 v2 v1 v4 v5 v6
name=huhai age=24 id=1
JedisPool を使用して以下を操作することもできます。
//声明Linux服务器IP地址
String host = "192.168.43.100";
//声明Redis端口号
int port = Protocol.DEFAULT_PORT;
//创建连接池对象
JedisPool jedisPool = new JedisPool(host, port);
//获取Jedis对象连接Redis
Jedis jedis = jedisPool.getResource();
//执行具体操作
String ping = jedis.ping();
System.out.println(ping);//pong
//关闭连接
jedisPool.close();
二、Spring-Data-Redis
Spring-Data-Redis は Spring ファミリーの一部です。シンプルな構成を通じて Redis サービスにアクセスし、Redis の基盤となる開発キット (Jedis、JRedis、RJC) を高度にカプセル化します。RedisTemplate は、Redis のさまざまな操作、例外処理、シーケンスを提供します。そして購読してください。
Redisテンプレート
Spring は RedisTemplate オブジェクトをカプセル化して Redis 上でさまざまな操作を実行し、すべての Redis ネイティブ API をサポートします。
org.springframework.data.redis.core.RedisTemplate<K, V>
RedisTemplate は5 つの基本データ構造に対する操作を定義します
redisTemplate.opsForValue();//操作String字符串
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForZSet();//操作有序set
StringRedisTemplate と RedisTemplate
-
2 つの関係は、StringRedisTemplate が RedisTemplate を継承するということです。
-
2 つのデータは共通ではありません。つまり、StringRedisTemplate は StringRedisTemplate のデータのみを管理でき、RedisTemplate は RedisTemplate のデータのみを管理できます。
-
SDR がデフォルトで採用するシリアル化戦略は 2 つあり、1 つは String のシリアル化戦略、もう 1 つは JDK のシリアル化戦略です。
-
StringRedisTemplate はデフォルトで String のシリアル化戦略を採用し、保存されたキーと値はこの戦略を使用してシリアル化および保存されます。
-
RedisTemplate はデフォルトで JDK のシリアル化戦略を採用しており、保存されたキーと値はこの戦略を使用してシリアル化および保存されます。
Spring-Data-Redis を使用したデモは次のとおりです。
1. まず依存関係を導入します。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- lombok依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2. 構成ファイルを追加し、Redis の構成を実行します。
spring:
redis:
#redis服务器连接地址
host: 192.168.43.100
#端口号
port: 6379
#连接超时时间(毫秒)
timeout: 10000
#使用的redis库
database: 0
jedis:
pool:
#连接池最大连接数
max-active: 10
#连接池中的最大空闲连接
max-idle: 10
#连接池中的最小空闲连接
min-idle: 2
#连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: 10000
3. Redis 構成クラスを追加し、シリアル化メカニズムを定義します。
/**
* Description: Redis 基础配置类
*/
public class BaseRedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory, RedisSerializer<Object> redisSerializer) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(redisSerializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(redisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public RedisSerializer<Object> redisSerializer() {
//创建JSON序列化器
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//必须设置,否则无法将JSON转化为对象,会转化成Map类型
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(objectMapper);
return serializer;
}
@Bean
public IRedisService redisService(RedisTemplate<String, Object> redisTemplate) {
return new RedisServiceImpl(redisTemplate);
}
}
/**
* Description: Redis配置类
*/
@Configuration
public class RedisConfig extends BaseRedisConfig{
}
4. IRedisServiceインターフェースとRedisServiceImpl実装クラスを作成する
基本的な使用方法をいくつか書いただけです。必要に応じて、引き続き追加したり、他のクラスに注入して使用することができます~
/**
* Description: Redis操作Service
*/
public interface IRedisService {
/**
* 保存属性
*
* @param key key
* @param value value
* @param time 超时时间(秒)
*/
void set(String key, Object value, long time);
/**
* 保存属性,无过期时间
*
* @param key key
* @param value value
*/
void set(String key, Object value);
/**
* 获取属性
*
* @param key key
* @return value
*/
Object get(String key);
/**
* 设置过期时间
*
* @param key key
* @param time 超时时间(秒)
* @return 是否设置成功
*/
Boolean expire(String key, long time);
/**
* 删除key
* @param key key
* @return 是否设置成功
*/
Boolean delete(String key);
}
/**
* Description: Redis操作实现类
*/
@RequiredArgsConstructor
@Service
public class RedisServiceImpl implements IRedisService {
private final RedisTemplate<String, Object> redisTemplate;
@Override
public void set(String key, Object value, long time) {
redisTemplate.opsForValue().set(key, value, time);
}
@Override
public void set(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
@Override
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
@Override
public Boolean expire(String key, long time) {
return redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
@Override
public Boolean delete(String key) {
return redisTemplate.delete(key);
}
}
5. Junit テストの実施
@SpringBootTest
class SpringDataRedisDemoApplicationTests {
@Resource
private IRedisService redisService;
@Test
void contextLoads() {
redisService.set("name", "xiaobai");
System.out.println(redisService.get("name"));//xiaobai
}
}
Redis 文字列の一般的な操作の一部のみを示しています。他の操作がある場合は、対応するメソッドを IRedisService に追加し、それを RedisServiceImpl に実装して、必要に応じて呼び出すことができます。