這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Redis怎么與Spring結(jié)合使用,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
婁底ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話(huà)聯(lián)系或者加微信:18980820575(備注:SSL證書(shū)合作)期待與您的合作!Spring-data-redis是spring大家族的一部分,提供了在srping應(yīng)用中通過(guò)簡(jiǎn)單的配置訪(fǎng)問(wèn)redis服務(wù),對(duì)reids底層開(kāi)發(fā)包(Jedis, JRedis, and RJC)進(jìn)行了高度封裝,RedisTemplate提供了redis各種操作、異常處理及序列化,支持發(fā)布訂閱,并對(duì)spring 3.1 cache進(jìn)行了實(shí)現(xiàn)。
一、spring-data-redis功能介紹
jedis客戶(hù)端在編程實(shí)施方面存在如下不足:
1)connection管理缺乏自動(dòng)化,connection-pool的設(shè)計(jì)缺少必要的容器支持。
2)數(shù)據(jù)操作需要關(guān)注“序列化”/“反序列化”,因?yàn)閖edis的客戶(hù)端API接受的數(shù)據(jù)類(lèi)型為string和byte,對(duì)結(jié)構(gòu)化數(shù)據(jù)(json,xml,pojo等)操作需要額外的支持。
3)事務(wù)操作純粹為硬編碼。
4)pub/sub功能,缺乏必要的設(shè)計(jì)模式支持,對(duì)于開(kāi)發(fā)者而言需要關(guān)注的太多。
spring-data-redis針對(duì)jedis提供了如下功能:
1.連接池自動(dòng)管理,提供了一個(gè)高度封裝的“RedisTemplate”類(lèi)
2.針對(duì)jedis客戶(hù)端中大量api進(jìn)行了歸類(lèi)封裝,將同一類(lèi)型操作封裝為operation接口
3.提供了對(duì)key的“bound”(綁定)便捷化操作API,可以通過(guò)bound封裝指定的key,然后進(jìn)行一系列的操作而無(wú)須“顯式”的再次指定Key,即BoundKeyOperations:
4.將事務(wù)操作封裝,有容器控制。
5.針對(duì)數(shù)據(jù)的“序列化/反序列化”,提供了多種可選擇策略(RedisSerializer)
JdkSerializationRedisSerializer:POJO對(duì)象的存取場(chǎng)景,使用JDK本身序列化機(jī)制,將pojo類(lèi)通過(guò)ObjectInputStream/ObjectOutputStream進(jìn)行序列化操作,最終redis-server中將存儲(chǔ)字節(jié)序列。是目前最常用的序列化策略。
StringRedisSerializer:Key或者value為字符串的場(chǎng)景,根據(jù)指定的charset對(duì)數(shù)據(jù)的字節(jié)序列編碼成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封裝。是最輕量級(jí)和高效的策略。
JacksonJsonRedisSerializer:jackson-json工具提供了javabean與json之間的轉(zhuǎn)換能力,可以將pojo實(shí)例序列化成json格式存儲(chǔ)在redis中,也可以將json格式的數(shù)據(jù)轉(zhuǎn)換成pojo實(shí)例。因?yàn)閖ackson工具在序列化和反序列化時(shí),需要明確指定Class類(lèi)型,因此此策略封裝起來(lái)稍微復(fù)雜?!拘枰猨ackson-mapper-asl工具支持】
OxmSerializer:提供了將javabean與xml之間的轉(zhuǎn)換能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存儲(chǔ)的數(shù)據(jù)將是xml工具。不過(guò)使用此策略,編程將會(huì)有些難度,而且效率最低;不建議使用?!拘枰猻pring-oxm模塊的支持】
針對(duì)“序列化和發(fā)序列化”中JdkSerializationRedisSerializer和StringRedisSerializer是最基礎(chǔ)的策略,原則上,我們可以將數(shù)據(jù)存儲(chǔ)為任何格式以便應(yīng)用程序存取和解析(其中應(yīng)用包括app,hadoop等其他工具),不過(guò)在設(shè)計(jì)時(shí)仍然不推薦直接使用“JacksonJsonRedisSerializer”和“OxmSerializer”,因?yàn)闊o(wú)論是json還是xml,他們本身仍然是String。如果你的數(shù)據(jù)需要被第三方工具解析,那么數(shù)據(jù)應(yīng)該使用StringRedisSerializer而不是JdkSerializationRedisSerializer。如果你的數(shù)據(jù)格式必須為json或者xml,那么在編程級(jí)別,在redisTemplate配置中仍然使用StringRedisSerializer,在存儲(chǔ)之前或者讀取之后,使用“SerializationUtils”工具轉(zhuǎn)換轉(zhuǎn)換成json或者xml,請(qǐng)參見(jiàn)下文實(shí)例。
6.基于設(shè)計(jì)模式,和JMS開(kāi)發(fā)思路,將pub/sub的API設(shè)計(jì)進(jìn)行了封裝,使開(kāi)發(fā)更加便捷。
7.spring-data-redis中,并沒(méi)有對(duì)sharding提供良好的封裝,如果你的架構(gòu)是基于sharding,那么你需要自己去實(shí)現(xiàn),這也是sdr和jedis相比,唯一缺少的特性。
二、serializer策略
spring-data-redis提供了多種serializer策略,這對(duì)使用jedis的開(kāi)發(fā)者而言,實(shí)在是非常便捷。sdr提供了4種內(nèi)置的serializer:
JdkSerializationRedisSerializer:使用JDK的序列化手段(serializable接口,ObjectInputStrean,ObjectOutputStream),數(shù)據(jù)以字節(jié)流存儲(chǔ)
StringRedisSerializer:字符串編碼,數(shù)據(jù)以string存儲(chǔ)
JacksonJsonRedisSerializer:json格式存儲(chǔ)
OxmSerializer:xml格式存儲(chǔ)
其中JdkSerializationRedisSerializer和StringRedisSerializer是最基礎(chǔ)的序列化策略,其中“JacksonJsonRedisSerializer”與“OxmSerializer”都是基于stirng存儲(chǔ),因此它們是較為“高級(jí)”的序列化(最終還是使用string解析以及構(gòu)建java對(duì)象)。
RedisTemplate中需要聲明4種serializer,默認(rèn)為“JdkSerializationRedisSerializer”:
1) keySerializer :對(duì)于普通K-V操作時(shí),key采取的序列化策略
2) valueSerializer:value采取的序列化策略
3) hashKeySerializer: 在hash數(shù)據(jù)結(jié)構(gòu)中,hash-key的序列化策略
4) hashValueSerializer:hash-value的序列化策略
無(wú)論如何,建議key/hashKey采用StringRedisSerializer。
三、使用實(shí)例
1.添加jar依賴(lài)
redis.clients jedis 2.3.1 org.springframework.data spring-data-redis 1.5.0.RELEASE org.slf4j slf4j-log4j12 1.7.10