javascript
Spring-RedisTemplate原理
????無論是mysql數(shù)據(jù)庫、redis數(shù)據(jù)庫、activeMq,我們都需要創(chuàng)建客戶端連接、根據(jù)業(yè)務(wù)邏輯進行增刪改查、關(guān)閉客戶端連接等操作。在Spring中為例簡化這一系列的操作。提供了模板類。
????將數(shù)據(jù)訪問中的固定和變化部分分開,將相同的數(shù)據(jù)訪問流程固話到模板類中,變化的部分通過回調(diào)接口開放出來,用于具體定義數(shù)據(jù)訪問和結(jié)果返回的操作,同時保證模板類是線程安全的,以便多個數(shù)據(jù)訪問線程共享同一個模板實例。
?
在S平日那個中有很多模板類,比如HibernateTemplate、JdbcTemplate、RedisTemplate等等。本文將以RedisTemplate、JdbcTemplate為例,講解創(chuàng)建連接、執(zhí)行操作、釋放連接這一系列操作;
一、RedisTemplate
對于單個使用線程池的jedis操作步驟請看java操作redis的章節(jié),對于spring整合redis也請看前面章節(jié)。本章主要講解源碼!
List<String>?list=new?ArrayList<String>(); list.add("value1"); list.add("value2"); ListOperations<String,?String>?listOperations=redisTemplate.opsForList(); listOperations.rightPushAll("listCol",?list);上面的代碼是一段向隊列中添加List的操作。我們以此為例講解:
1)首先涉及到的類有:
DefaultListOperation //主要用于封裝對List的操作,主要是調(diào)用RedisTemplate中的execute方法
StringRedisSerializer //key的序列化和反序列化的工具類
JdkSerializationRedisSerializer //value的序列化和反序列化的工具類
RedisCallback //回調(diào)接口,具體定義數(shù)據(jù)訪問和結(jié)果返回的操作
RedisTemplate //redis操作模板類,用于封裝redis的操作數(shù)據(jù)流程
RedisConnectionUtils //用于管理redis客戶端連接
TransactionSynchronizationManager //線程同步管理
JedisConnectionFactory //創(chuàng)建Jedis的工廠類
Jedis //redis的客戶端連接對象
JedisConnection //用于封裝真正的Jedis連接對象
2)分析上面代碼的源碼
redisTemplate.opsForList();//會創(chuàng)建DefaultListOperation 對象,該對象中封裝了RedisTemplate。
listOperations.rightPushAll("listCol", list);//具體方法代碼如下圖
/***** **DefaultListOperation類中主要的調(diào)用 ***主要成員變量:RedisTemplate ******/ @Override public?Long?rightPushAll(K?key,?Collection<V>?values)?{//序列化對象key、value //調(diào)用RedisTemplate的keySerializer、valueSerializer的serialize() final?byte[]?rawKey?=?rawKey(key); final?byte[][]?rawValues?=?rawValues(values);//調(diào)用RedisTemplate的方法execute,實現(xiàn)對Redis操作 return?execute(new?RedisCallback<Long>(){?//實現(xiàn)回調(diào)接口public?Long?doInRedis(RedisConnection?connection)?{return?connection.rPush(rawKey,?rawValues);}},?true);?//參數(shù)exposeConnection(公開連接):true }@SuppressWarnings("unchecked") byte[]?rawKey(Object?key)?{Assert.notNull(key,?"non?null?key?required");if?(keySerializer()?==?null?&&?key?instanceof?byte[])?{return?(byte[])?key;}//實際調(diào)用RedisTemplate來序列化keyreturn?keySerializer().serialize(key); }//調(diào)用RedisTemplate的方法 RedisSerializer?keySerializer()?{return?template.getKeySerializer(); }//調(diào)用RedisTemplate的方法 <T>?T?execute(RedisCallback<T>?callback,?boolean?b)?{return?template.execute(callback,?b); }/***** **RedisTemplate類中主要的調(diào)用 ***主要成員變量:JedisConnectionFactory ******/ public?<T>?T?execute(RedisCallback<T>?action,?boolean?exposeConnection,?boolean?pipeline)?{//redis連接工廠,用于創(chuàng)建、關(guān)閉redis連接RedisConnectionFactory?factory?=?getConnectionFactory();//內(nèi)部封裝真正的redis連接,用于實現(xiàn)各種操作RedisConnection?conn?=?null;try?{//默認(rèn)不啟動事務(wù),redis連接是通過RedisConnectionUtils獲得的if?(enableTransactionSupport)?{//?only?bind?resources?in?case?of?potential?transaction?synchronizationconn?=?RedisConnectionUtils.bindConnection(factory,?enableTransactionSupport);}?else?{conn?=?RedisConnectionUtils.getConnection(factory);}//是否和當(dāng)事務(wù)同步管理器程綁定boolean?existingConnection?=?TransactionSynchronizationManager.hasResource(factory);//RedisConnection?connToUse?=?preProcessConnection(conn,?existingConnection);//管道狀態(tài):用于批量操作boolean?pipelineStatus?=?connToUse.isPipelined();if?(pipeline?&&?!pipelineStatus)?{connToUse.openPipeline();}//是否為jedisConnection,創(chuàng)建動態(tài)代理對象(jdk動態(tài)代理技術(shù))RedisConnection?connToExpose?=?(exposeConnection???connToUse?:?createRedisConnectionProxy(connToUse));//調(diào)用回調(diào)函數(shù),執(zhí)行數(shù)據(jù)庫操作,之部分是動態(tài)的,可以由用戶自己指定操作T?result?=?action.doInRedis(connToExpose);//?close?pipelineif?(pipeline?&&?!pipelineStatus)?{connToUse.closePipeline();}//?TODO:?any?other?connection?processing?return?postProce***esult(result,?connToUse,?existingConnection);}?finally?{//非事務(wù)操作,釋放連接if?(!enableTransactionSupport)?{RedisConnectionUtils.releaseConnection(conn,?factory);}} }轉(zhuǎn)載于:https://blog.51cto.com/wlan2014/1899047
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Spring-RedisTemplate原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 八大排序算法图文讲解
- 下一篇: javascript基础 (2)