標籤:ash 擷取 安全 orm tran 結構 類型 def 因此
前言Spring Data Redis project,應用了Spring概念來開發使用索引值形式的資料存放區的解決方案。我們(官方)提供了一個 "template" ,這是一個進階別的抽象,來發送和接收訊息。你會注意到它與Spring架構對JDBC的支援有些類似。為什麼選擇Spring Data Redis?Spring架構,是引領潮流的全棧Java/JEE應用程式框架。它提供了一個輕量級容器,一種非侵入式的編程模型 -- 這是由依賴注入、AOP、以及便攜的服務抽象開啟的。 SDR架構,使得利用RedisKVStore for Redis非常簡單,消除了繁複冗餘的任務和呆板的代碼(指擷取串連、釋放資源)。要求
- SDR 1.x要求JDK 6.0及以上,要求Spring架構4.3.9.RELEASE及以上。
- Redis 2.6.x及以上。在connectors方面,Spring Redis整合了Jedis
串連到Redis
使用Redis和Spring的第一步就是通過IoC容器串連到儲存。想要實現串連,一個java connector(或者binding)是必需的。無論選擇什麼庫,都只有一套SDR API,叫做 org.springframework.data.redis.connection package,以及RedisConnection和RedisConnectionFactory介面,來擷取到Redis的活動串連。
RedisConnection 和 RedisConnectionFactoryRedisConnection 為Redis通訊提供了構建模組,會處理與Redis後端的通訊。也會將底層串連庫的異常自動翻譯成Spring的一致的DAO異常層級,因此,使用者能夠自由切換connectors,而不必修改代碼。
注意:對於需要native庫API的情況,RedisConnection提供了專有方法getNativeConnection -- 會返回原生的、底層的用於通訊的對象。
活動的RedicConnection由RedisConnectionFactory建立。另外,該工廠還扮演了PersistenceExceptionTranslator,就是說,一旦聲明了,它們會允許使用者進行透明的異常翻譯。例如,通過使用@Repository和AOP的異常翻譯。更多資訊,見Spring架構的相關部分。
注意:依賴於底層的配置,工廠會返回一個新的串連 或者 一個現有的串連(使用pool或者shared native connection時)。
使用RedisConnectionFactory最簡單的方式,是通過IoC容器配置相應的connector,並將其注入使用類中。
重要:不幸的是,目前,不是所有的connector都支援所有的Redis功能。當調用底層庫不支援的API時,會拋出UnsupportedOperationException。這種情況在將來可能被解決,視不同的connector的成熟情況。
配置Jedis connector1.xml配置
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"/>
2.java代碼配置
@Beanpublic JedisConnectionFactory jedisConnectionFactory(){ return new JedisConnectionFactory();}Redis Sentinel支援為了處理高可用Redis,可以使用RedisSentinelConfiguration來支援Redis Sentinel。
注意:目前,只有Jedis和Lettuce支援Redis Sentinel。
/*** jedis*/@Beanpublic RedisConnectionFactory jedisConnectionFactory() { RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration().master("mymaster").sentinel("127.0.0.1", 26379) .sentinel("127.0.0.1", 26380); return new JedisConnectionFactory(sentinelConfig);}/*** lettuce*/@Beanpublic RedisConnectionFactory lettuceConnectionFactory() { RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration().master("mymaster").sentinel("127.0.0.1", 26379) .sentinel("127.0.0.1", 26380); return new LettuceConnectionFactory(sentinelConfig);}RedisSentinelConfiguration也可以通過PropertySource來定義。
- spring.redis.sentinel.master: master節點的名字
- spring.redis.sentinel.nodes: 以逗號間隔的host:port列表
有時候,需要直接與Sentinels中的某一個進行互動。使用RedisConnectionFactory.getSentinelConnection() 或者RedisConnection.getSentinelCommands(),可以讓你訪問第一個活動的Sentinel。
使用RedisTemplate操作Objects多數使用者會喜歡使用RedisTemplate和相應的包org.springframework.data.redis.core,該template是Redis模組的中心類 -- 由於豐富的功能集。該template為Redis互動提供了一個進階別的抽象。當RedisConnection提供了低層級的方法來接受和返還二進位值(byte arrays)時,該template負責了序列化和串連管理,將使用者從這裡細節中解放了出來。更多地,該template提供了操作視圖(following the grouping from Redis command reference) -- 提供了豐富的介面 來操作特定類型或特定key(通過KeyBound介面),如下:
Table 1. Operational views
| Interface |
Description |
Key Type Operations |
ValueOperations |
Redis string (or value) operations |
ListOperations |
Redis list operations |
SetOperations |
Redis set operations |
ZSetOperations |
Redis zset (or sorted set) operations |
HashOperations |
Redis hash operations |
HyperLogLogOperations |
Redis HyperLogLog operations like (pfadd, pfcount,…) |
GeoOperations |
Redis geospatial operations like GEOADD, GEORADIUS,…) |
Key Bound Operations |
BoundValueOperations |
Redis string (or value) key bound operations |
BoundListOperations |
Redis list key bound operations |
BoundSetOperations |
Redis set key bound operations |
BoundZSetOperations |
Redis zset (or sorted set) key bound operations |
BoundHashOperations |
Redis hash key bound operations |
BoundGeoOperations |
Redis key bound geospatial operations. |
一旦配置了,該template就是安全執行緒的,可被多個執行個體複用。開箱即用,RedisTemplate使用一個基於Java的序列化器 用於多數操作。這意味著,該template讀/寫的任意object會通過Java來序列化/還原序列化。該template的序列化機制可以輕鬆地修改,該Redis模組提供了幾個實現,在org.springframework.data.redis.serializer包中。你也可以不使用序列化器,直接讓RedisTemplate使用原生byte數組,只需要將enableDefaultSerializer設為false即可。注意,該template要求所有的key都不能是null,但value可以是null -- 只要底層的序列化器接受;更多內容,請查看每個序列化器的javadoc。當需要一個特定的template view時,將view聲明為依賴,並注入該template中即可:容器會自動執行轉換:
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/> <!-- redis template definition --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnectionFactory"/>
public class Example { // inject the actual template @Autowired private RedisTemplate<String, String> template; // inject the template as ListOperations -- 自動轉換 @Resource(name="redisTemplate") private ListOperations<String, String> listOps; public void addLink(String userId, URL url) { listOps.leftPush(userId, url.toExternalForm()); }}聚焦String的便捷類
鑒於使用java.lang.String來作為key/value 儲存到Redis中 非常常見,該Redis模組還提供了RedisConnection和RedisTemplate的兩個擴充:StringRedisConnection(以及其DefaultStringRedisConnection實現)和StringRedisTemplate。此外,該template和串連,底層使用了StringRedisSerializer。
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/> <bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate" p:connection-factory-ref="jedisConnectionFactory"/>
public class Example { @Autowired private StringRedisTemplate redisTemplate; public void addLink(String userId, URL url) { redisTemplate.opsForList().leftPush(userId, url.toExternalForm()); }}
如同其他的Spring template,RedisTemplate和StringRedisTemplate允許開發人員通過RedisCallback介面直接與Redis對話。這賦予了開發人員完整的控制,因為是直接與RedisConnection互動。注意,當使用StringRedisTemplate時,該callback接收的是一個StringRedisConnection執行個體。
public void useCallback() { redisTemplate.execute(new RedisCallback<Object>() { public Object doInRedis(RedisConnection connection) throws DataAccessException { Long size = connection.dbSize(); // Can cast to StringRedisConnection if using a StringRedisTemplate ((StringRedisConnection)connection).set("key", "value"); } });}序列化器 Serializers從架構角度來說,儲存在Redis中的資料都是bytes。然而,Redis本身支援不同的類型,更多時候這些是指data儲存的方式,而非其表現形式。由使用者來決定 資訊是否需要轉成String或者其他對象。SDR中,使用者的類型和原生類型之間的轉換,是通過RedisSerializer介面來實現的,如名所示,負責序列化過程。SDR提供了多個開箱即用的實現,其中的兩個已經在上面提到了:StringRedisSerializer和JdkSerializationRedisSerializer。然而,使用者也可以使用OxmSerializer來處理Object/XML映射 -- 通過Spring 3OXM支援;或者,使用JacksonJsonRedisSerializer、Jackson2JsonRedisSerializer、或者GenericJackson2JsonRedisSerializer 來實現JSON格式的儲存。
注意,儲存格式不僅限於值,它可以用於鍵、值、雜湊,沒有任何限制。Hash映射Redis中,資料可以使用不同的資料結構來儲存。你已經知道 Jackson2JsonRedisSerializer可以將objects轉成JSON格式。JSON可以使用字串來儲存。而通過使用Redis Hashes,可以實現一種更複雜的結構化對象的映射。SDR提供了不同的策略來將資料對應成hashes -- 取決於使用方式:
- 使用HashOperations和一個序列化器,直接映射。
- 使用Redis Repositories。
- 使用HashMapper和HashOperations。
spring data redis 理解