Spring Redisの使用を深く理解する(一)、Spring Redisの基本使用

15819 ワード

spring redisフレームワークの使用については,ネット上の例が多い.しかし、自分の最近の使用の中で、これらのチュートリアルはすべて入門チュートリアルであることを発見して、多くの使用方法を含んで、spring redisの豊富なapiとは大きく異なって、本当にこのような優秀なフレームワークを浪費しました.ここでは,spring ormにおけるhibernateの使用と比較してspring redisの使用を理解する.(この文章ではredis基本コマンドの使用についての説明はしません)
1.Redis使用シーン
Redisは、ANSI C言語を使用して作成され、ネットワークをサポートし、メモリベースで持続可能なログ型、Key-Valueデータベースであり、複数の言語のAPIを提供しています.
日常的なアプリケーションでは、データベースのボトルネックが最も発生しやすいことはよく知られています.データ量が多すぎて頻繁なクエリーでは、ディスクIOのパフォーマンスの限界により、プロジェクトのパフォーマンスが低下しています.
この場合、メモリベースのキャッシュフレームワークは、多くの問題を解決します.例えばMemcache,Redisなど.頻繁に使用されるデータの一部をキャッシュに読み込み、データベースの負担を大幅に削減します.システムのパフォーマンスが向上しました.
実はhibernateの2次キャッシュについても、同じ理屈です.メモリの高速な読み書き速度を利用して、ハードディスク(HDD)のボトルネックを解決します.
 
2.redis使用の構成
まず、基本的なjarパッケージを導入する必要があります.mavenの基本的な参照は次のとおりです.
    <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.4.2.RELEASE</version>
        </dependency>

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

 
次に、アプリケーションContextで次のように構成します.
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="${redis.maxIdle}" />
        <property name="maxTotal" value="${redis.maxActive}" />
        <property name="maxWaitMillis" value="${redis.maxWait}" />
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />
    </bean>

    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}"
        p:pool-config-ref="poolConfig" />
    <bean id="stringSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    <!--     ,    transcational     -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="keySerializer" ref="stringSerializer" />
        <property name="enableTransactionSupport" value="true" />
    </bean>

 
hibernateの構成では、最初のpoolconfigは接続プールの構成であることがわかります.最大接続数、キュー数、生存時間、最大待機時間など、追加の構成もありますので、JedisPoolConfigクラスのソースコードを直接クリックして確認してください.
これらの配置の意味が分からなければ、スレッドプールをよく勉強しなければなりません.
 
最初の構成は接続工場であり、その名の通り、最も基本的な使用は接続の開閉に違いない.Redisサーバのアカウントパスワード、ポート番号を構成する必要があります.(ここではデータベースのindexも構成できますが、redisのデフォルトデータベース、つまり0番目を使用しています)
最後の構成は特に重要です.これはspringが提供するHibernateDaoSupportに似ています.
次に、すべての説明がこのクラスをめぐって展開されます.
 
3.RedisTemplateの使用
このクラスはテンプレートクラスとして、接続、トランザクションを自分で維持する必要がなく、redisを迅速に使用するapiを多く提供しています.
最初の頃、私が作成したBaseRedisDaoはこのクラスから継承されていました.継承の利点は、私のすべてのDaoでは、シーケンサを自由に制御することができます.自分がトランザクションを必要とするかどうかを自由に制御することができます.これは理解する必要はありません.私の現在の構成方法に従ってください.
 
templateは、valueOperation、HashOperation、ListOperation、SetOperationなどの一連のoperationを提供し、異なるデータ型のRedisを操作するために使用される.
さらに、RedisTemplateは対応する*OperationsEditorを提供し、RedisTemplateを介して対応するOperationを直接注入するために使用される.私たちはしばらくこれを話さない.
 
次のtest 1メソッドについては,しばらく考慮する必要はなく,まずRedisTemplateによるconnection操作Redisの使用について理解する.
Testコードは以下の通りです.
package cn.test.spjedis;


import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.cn.redis2.dao.IncrDao;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class TestRedis {
    @Resource(name = "redisTemplate")
    private RedisTemplate<String, String> template; // inject the template as ListOperations
    //           。    AbstractBeanFactory doGetBean
    //super.setValue(((RedisOperations) value).opsForValue());            editor
    @Resource(name = "redisTemplate")
    private ValueOperations<String, Object> vOps;
    
    public void testSet(){
        template.execute(new RedisCallback<Boolean>() {
            @Override
            public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
                byte [] key = "tempkey".getBytes();
                byte[] value = "tempvalue".getBytes();
                connection.set(key, value);
                return true;
            }
        });
    }
    
    public void testSet1(){
        vOps.set("tempkey", "tempvalue");
    }
    
    @Autowired
    private IncrDao incr;
    
    
    @Test
    public void addLink() {
        System.out.println(incr.incr(13));
        System.out.println(incr.get(13));
    }
    
}

 
これはStringタイプを挿入する2つのテストです.testメソッドでは,jedis connectionを用いてデータを操作するためにテンプレートクラスコミットコールバック(RedisCallBack)メソッドを用いた.この部分、かつて知り合ったようなことがありますか?
 
HibernateTemplateのHibernateCallback、およびHibernate SessionクラスのdoWorkおよびdoReturningWorkメソッドは、接続またはsessionの統一管理に便利なメカニズムを使用しています.
public int excuteHqlUpdate(final String hql,final Object ...params){
        return getHibernateTemplate().executeWithNativeSession(new HibernateCallback<Integer>() {
            @Override
            @SuppressWarnings("unchecked")
            public Integer doInHibernate(Session session) throws HibernateException {
                Query queryObject = session.createQuery(hql);
                if (params != null) {
                    for (int i = 0; i < params.length; i++) {
                        queryObject.setParameter(i, params[i]);
                    }
                }
                return queryObject.executeUpdate();
            }
        });
    }

 
4.まとめ
この節では,spring redisの構成使用,基本特性,およびRedisTemplateの使用の導入について述べる.以前のHibernateTemplateの対比を通じて、RedisTemplateの基本的な設計についても一定の理解を得たはずだ.次の節では、RedisTempalteについて深く学びます.