深入理解Spring Redis的使用 (二)、RedisTemplate事務支持、序列化


上一篇文章我們講解了RedisTemplate的基本使用,通過RedisCallback來獲得connection,然后去操作Redis。網上的教程,大部分也都是這樣的操作。

這個類似於HibernateTemplate里面提供的executeWithNativeSession方法,是Java中的一種同步回調機制。在方法的前后,系統替我們打開關閉連接,設置事務等。

 

RedisTemplate  api詳解

1. RedisTemplate的事務

    private boolean enableTransactionSupport = false;
    private boolean exposeConnection = false;
    private boolean initialized = false;
    private boolean enableDefaultSerializer = true;
    private RedisSerializer<?> defaultSerializer = new JdkSerializationRedisSerializer();

    private RedisSerializer keySerializer = null;
    private RedisSerializer valueSerializer = null;
    private RedisSerializer hashKeySerializer = null;
    private RedisSerializer hashValueSerializer = null;
    private RedisSerializer<String> stringSerializer = new StringRedisSerializer();

    private ScriptExecutor<K> scriptExecutor;

    // cache singleton objects (where possible)
    private ValueOperations<K, V> valueOps;
    private ListOperations<K, V> listOps;
    private SetOperations<K, V> setOps;
    private ZSetOperations<K, V> zSetOps;

enableTransactionSupport:是否啟用事務支持。我們在代碼中搜索下用到這個變量的地方,會看到,在調用RedisCallback之前,有一行代碼是如果啟用事務支持,那么conn = RedisConnectionUtils.bindConnection(factory, enableTransactionSupport),也就是說,系統自動幫我們拿到了事務中綁定的連接。可以在一個方法的多次對Redis增刪該查中,始終使用同一個連接。但是,即使使用了同樣的連接,沒有進行connection.multi()和connection.exec(),依然是無法啟用事務的。

我沒有仔細的查閱代碼,但是可以知道的是,Spring已經對這個,給了我們一個更好的支持:@Transactional 

在調用RedisTempalte中的execute()方法的地方,加入這個注解(是spring包下面提供的,不要引用成rt包下的注解),能讓這個方法中的所有execute,自動加入multi()以及異常的回滾或者是正常運行時候的提交!

 

2. RedisTempalte的Serializer

用過jedis操作的都知道,所有connection的操作方法,都是傳入字節數組。那么,將一個對象和字節相互轉換,就需要通過序列化和反序列化。

模版方法中,Spring提供了默認的StringSerializer和JdkSerializer,第一個很簡單,就是通過String.getBytes()來實現的。而且在Redis中,所有存儲的值都是字符串類型的。所以這種方法保存后,通過Redis-cli控制台,是可以清楚的查看到我們保存了什么key,value是什么。但是對於JdkSerializationRedisSerializer來說,這個序列化方法就是Jdk提供的了。首先要求我們要被序列化的類繼承自Serializeable接口,然后通過,然后通過Jdk對象序列化的方法保存。(注:這個序列化保存的對象,即使是個String類型的,在redis控制台,也是看不出來的,因為它保存了一些對象的類型什么的額外信息,)

 

這么一長串,其實就是一個int類型的123。

 

keySerializer:這個是對key的默認序列化器。默認值是StringSerializer。

valueSerializer:這個是對value的默認序列化器,默認值是取自DefaultSerializer的JdkSerializationRedisSerializer。

hashKeySerializer:對hash結構數據的hashkey序列化器,默認值是取自DefaultSerializer的JdkSerializationRedisSerializer。

hashValueSerializer:對hash結構數據的hashvalue序列化器,默認值是取自DefaultSerializer的JdkSerializationRedisSerializer。

 

除此之外,我們在該類中,還發現了valueOps和hashOps等操作類,這是spring給我們提供的可以直接使用來操作Redis的類,非常方便。下一篇我們將講解這些類。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM