Redisのアプリケーション - Javaと春にRedisのを使用して

A、Javaの使用のRedis

1.輸入依存のRedis

依存ポンポンファイルにJedis(JavaのRedisの)を追加します(実際のユースケースに基づいて特定のバージョンがあることがあります)

<dependency>
     <groupId>redis.clients</groupId>
     <artifactId>jedis</artifactId>
     <version>2.6.0</version>
 </dependency>

また、手動でプロジェクトにjarファイルのパッケージをダウンロードすることができますhttps://mvnrepository.com/artifact/redis.clients
ここに画像を挿入説明

2、テストクラスのRedisを書きます

@Test
public void redisTester() {
    Jedis jedis = new Jedis("localhost", 6379, 100000);
    int i = 0;
    try {
        long start = System.currentTimeMillis();// 开始毫秒数
        while (true) {
            long end = System.currentTimeMillis();
            if (end - start >= 1000) {// 当大于等于1000毫秒(相当于1秒)时,结束操作
                break;
            }
            i++;
            jedis.set("test" + i, i + "");
        }
    } finally {// 关闭连接
        jedis.close();
    }
    // 打印1秒内对Redis的操作次数
    System.out.println("redis每秒操作:" + i + "次");
}
-----------测试结果-----------
redis每秒操作:10365

同時に、Jedisもredis.clients.jedis.JedisPool接続プールRedisのオブジェクトを作成するために使用するクラスを提供します。
このオブジェクトクラスでは、接続プールの設定が必要ですredis.clients.jedis.JedisPoolConfig

//先创建Redis配置对象
JedisPoolConfig poolCfg = new JedisPoolConfig();
//最大空闲数
poolCfg.setMaxIdle(50);
//最大连接数
poolCfg.setMaxTotal(100);
//最大等待毫秒数
poolCfg.setMaxWaitMillis(20000);
//使用配置对象创建连接池对象
JedisPool pool = new JedisPool (poolCfg, "localhost");
//从连接池中获取单个连接
Jedis jedis = pool.getResource();
//如果需密码
//jedis.auth("password");

ためのRedisのみ文字列ベースの提供することができ、それがベースのJavaクラスオブジェクト内に使用しながら、動作を、Redisの列変換とJavaオブジェクトを格納する必要があります。

あなたが独自のルールを記述する場合、ワークロードは、操作の対象となるよう、使用Redisのは非常に困難であり、そのような役割を対象として、我々は直接のRedis、さらに変換が必要にターゲットに方法はありません、非常に大きいです。

幸いなことに、これらのバネは、カプセル化され、設計フレームワーククラスの配列の一部の配列を提供するサポート、および使用後にRedisのを格納することができるように、Javaオブジェクトを変換することによってシリアル化することができます。

そして読み出し時に、その後のJavaの配列は、文字列を介してオブジェクトによって形質転換されたので、Java環境Redisのよりシンプルでその使用RedisTemplateスプリングはRedisの使用を使用して機構を提供するかもしれないので、より多くの時間

二、春使用のRedis

春のRedisでの使用は、jedis.jarに加えて、だけでなく、ダウンロードする必要があり春データ-redis.jarのことをここで注目に値する、ジャーパッケージと春バージョンの互換性の問題は、ジャーパッケージのバージョンを使用するには、1.8.1の試験で、春のバージョンを使用すると、異常が生じ、他のバージョンを使用する場合は、互換性の問題がある可能性があり、5.0.4です。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.8.1.RELEASE</version>
</dependency>

JARパッケージをダウンロード:https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis
ここに画像を挿入説明
あなたは春が提供する使用できるように、エンジニアリング環境にインポートしたjarパッケージ、RedisTemplate操作するのRedisをダウンロードすると、使用直前に、解決策は、春にはそれらをよりよく利用するためには、提供するために探求する必要があります。

ほとんどの場合、我々は、第1の目的は、JedisPoolConfigスプリングで構成されているので、この構成は、比較的簡単であり、接続プールを使用する、オブジェクトコードJedisPoolConfig Spring構成を以下に示します。

<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!-- 最大空闲数 -->
    <property name="maxIdle" value="50" />
    <!-- 最大连接数 -->
    <property name="maxTotal" value="100" />
    <!-- 最大等待时间 -->
    <property name="maxWaitMillis" value="20000" />
</bean>

接続プールの設定をバックアップし、このセットは、コンフィギュレーションをダウン続けます。

RedisTemplateスプリングを使用する前に、春、プラントモデル4を提供するスプリングデータRedisの実施形態によって提供される接続ファクトリを提供するために設定が必要です。
JredisConnectionFactory。
JedisConnectionFactory。
LettuceConnectionFactory。
SrpConnectionFactory。

虽然使用哪种实现工厂都是可以的,但是要根据环境进行测试,以验证使用哪个方案的性能是最佳的。无论如何它们都是接口 RedisConnectionFactory 的实现类,更多的时候我们都是通过接口定义去理解它们,所以它们是具有接口适用性特性的。本教程将以使用最为广泛的 JedisConnectionFactory 为例进行讲解。

例如,在 Spring 中配置一个 JedisConnectionFactory 对象,配置 JedisConnectionFactory 代码如下所示。

<bean id="connectionFactory"
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="hostName" value="localhost" />
    <property name="port" value="6379" />
    <!--<property name="password" value="password"/> -->
    <property name="poolConfig" ref="poolConfig" />
</bean>

解释一下它的属性配置。
hostName,代表的是服务器,默认值是 localhost,所以如果是本机可以不配置它。
port,代表的是接口端口,默认值是 6379,所以可以使用默认的 Redis 端口,也可以不配置它。
password,代表的是密码,在需要密码连接 Redis 的场合需要配置它。
poolConfig,是连接池配置对象,可以设置连接池的属性。

这样就完成了一个 Redis 连接工厂的配置。这里配置的是 JedisConnectionFactory,如果需要的是 LettuceConnectionFactory,可以把使用 Spring 配置 JedisPoolConfig 对象代码中的 Bean 元素的 class 属性修改为 org.springframework.data.redis.connection.lettuce.LettuceConnectionFactor 即可,这取决于项目的需要和特殊性。有了 RedisConnectionFactory 工厂,就可以使用 RedisTemplate 了。

普通的连接使用没有办法把 Java 对象直接存入 Redis,而需要我们自己提供方案,这时往往就是将对象序列化,然后使用 Redis 进行存储,而取回序列化的内容后,在通过转换转变为 Java 对象,Spring 模板中提供了封装的方案,在它内部提供了 RedisSerializer 接口(org.springframework.data.redis.serializer.RedisSerializer)和一些实现类,其原理如下图所示:
ここに画像を挿入説明
可以选择 Spring 提供的方案去处理序列化,当然也可以去实现在 spring data redis 中定义的 RedisSerializer 接口,在 Spring 中提供了以下几种实现 RedisSerializer 接口的序列化器。
GenericJackson2JsonRedisSerializer,通用的使用 Json2.jar 的包,将 Redis 对象的序列化器。
Jackson2JsonRedisSerializer,通过 Jackson2.jar 包提供的序列化进行转换(由于版本太旧,Spring 不推荐使用)。
JdkSerializationRedisSerializer,使用 JDK 的序列化器进行转化。
OxmSerializer,使用 Spring O/X 对象 Object 和 XML 相互转换。
StringRedisSerializer,使用字符串进行序列化。
GenericToStringSerializer,通过通用的字符串序列化进行相互转换。

使用它们就能够帮助我们把对象通过序列化存储到 Redis 中,也可以把 Redis 存储的内容转换为 Java 对象,为此 Spring 提供的 RedisTemplate 还有两个属性。
keySerializer——键序列器。
valueSerializer——值序列器。

有了上面的了解,就可以配置 RedisTemplate 了。假设选用 StringRedisSerializer 作为 Redis 的 key 的序列化器,而使用 JdkSerializationRedisSerializer 作为其 value 的序列化器,则可以以下代码的方法来配置 RedisTemplate。

<bean id="jdkSerializationRedisSerializer"
    class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
<bean id="stringRedisSerializer"
    class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="keySerializer" ref="stringRedisSerializer" />
    <property name="valueSerializer" ref="jdkSerializationRedisSerializer" />
</bean>

这样就配置了一个 RedisTemplate 的对象,并且 spring data redis 知道会用对应的序列化器去转换 Redis 的键值。

举个例子,新建一个角色对象,使用 Redis 保存它的对象,使用 Redis 保存角色类对象如下所示。

package com.pojo;
import java.io.Serializable;
public class Role implements Serializable {
    /**
     * 注意,对象要可序列化,需要实现Serializable接口,往往要重写serialVersionUID
     */
    private static final long serialVersionUID = 3447499459461375642L;
    private long id;
    private String roleName;
    private String note;
    //省略setter和getter方法
}

因为要序列化对象,所以需要实现 Serializable 接口,表明它能够序列化,而 serialVersionUID 代表的是序列化的版本编号。

接下来就可以测试保存这个 Role 对象了,测试代码如下所示。

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class);
Role role = new Role();
role.setId(1L);
role.setRoleName("role_name_1");
role.setNote ("note_l");
redisTemplate.opsForValue().set("role_1", role);
Role role1 = (Role) redisTemplate.opsForValue().get ("role_1");
System.out.println(role1.getRoleName());

在 System.out.println(role1.getRoleName()) ;这行打下断点,可以看到如下图所示的测试结果。
ここに画像を挿入説明
显然这里已经成功保存和获取了一个 Java 对象,这段代码演示的是如何使用 StringRedisSerializer 序列化 Redis 的 key,而使用 JdkSerializationRedisSerializer 序列化 Redis 的value,当然也可以根据需要去选择,甚至是自定义序列化器。

以上の動作に基づいてRedisTemplate、接続プールの使用に基づいていることに注意してくださいは、換言すれば、毎回の操作は、上記のコードのコードの次の2行として接続、同じRedisTemplateのRedisであることを保証するものではありません。セット方法のルックスを簡単に取得し、それはRedisのRedisの接続プールとの別の接続から来るかもしれません。

同じ接続からすべての操作を行うために、以上の時間がこのインターフェースを介して、このインターフェイスを使用SessionCallbackであろうように、非常に友好的ではない使用して、SessionCallback RedisCallbackを2つのインターフェイスを使用し、比較的低RedisCallbackパッケージであることができます主に上記のコードの機能を実現することになり、次のコードに示すように、複数のコマンドは、実行するのRedisに関連して配置することができます。

package redisDemo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;
import com.pojo.Role;
public class Test {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        RedisTemplate<String, Role> redisTemplate = applicationContext.getBean(RedisTemplate.class);
        Role role = new Role();
        role.setId(1L);
        role.setRoleName("role_name_1");
        role.setNote("role_note_1");
        SessionCallback callBack = new SessionCallback<Role>() {
            @Override
            public Role execute(RedisOperations ops) throws DataAccessException {
                ops.boundValueOps("role_1").set(role);
                return (Role) ops.boundValueOps("role_1").get();
            }
        };
        Role savedRole = (Role) redisTemplate.execute(callBack);
        System.out.println(savedRole.getId());
    }
}

このようなセットと、ここで読者に提示接続プールは、匿名クラスを使用することで、JavaのJDKのバージョン8あれば、実際に、あなたはまた、ラムダ式を使用できるコマンドはRedisのに関連して、同じ保証を操作することができます取得SessionCallback書き込みビジネスロジックは、このロジックは、より明確になります。そのため、接続の複数のコマンドを動作させるのRedisを使用するか、またはトランザクションを使用するときに、リソース消費のために、それは頻繁に使用される比較的小さく、前と使用後の同じです。

リリース5元の記事 ウォンの賞賛2 ビュー591

おすすめ

転載: blog.csdn.net/qq_42230770/article/details/104116665
おすすめ