spring data redis 理解

來源:互聯網
上載者:User

標籤: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 GEOADDGEORADIUS,…)

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 -- 取決於使用方式:
  1. 使用HashOperations和一個序列化器,直接映射。
  2. 使用Redis Repositories。
  3. 使用HashMapper和HashOperations。

spring data redis 理解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.