這篇文章給大家介紹怎么在spring中利用redis操作key-value,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
十多年的陽(yáng)曲網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整陽(yáng)曲建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“陽(yáng)曲網(wǎng)站設(shè)計(jì)”,“陽(yáng)曲網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
連接到 Redis
Redis 連接工廠會(huì)生成到 Redis 數(shù)據(jù)庫(kù)服務(wù)器的連接。Spring Data Redis 為四種 Redis 客戶(hù)端實(shí)現(xiàn)提供了連接工廠:
JedisConnectionFactory
JredisConnectionFactory
LettuceConnectionFactory
SrpConnectionFactory
具體選擇哪一個(gè)取決于你。我建議你自行測(cè)試并建立基準(zhǔn),進(jìn)而確定哪一種 Redis 客戶(hù)端和連接工廠最適合你的需求。從 Spring Data Redis 的角度來(lái)看,這些連接工廠在適用性上都是相同的。
在做出決策之后,我們就可以將連接工廠配置為 Spring 中的 bean。例如,如下展示了如何配置 JedisConnectionFactory bean:
package cn.com.sm.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.StringRedisTemplate; @Configuration public class RedisConfig { //通過(guò)默認(rèn)構(gòu)造器創(chuàng)建的連接工廠會(huì)向 localhost 上的 6379 端口創(chuàng)建連接,并且沒(méi)有密碼。 @Bean public RedisConnectionFactory redisCF() { return new JedisConnectionFactory(); } //如果你所使用的 value 和 key 都是 String 類(lèi)型,那么可以考慮使用 StringRedisTemplate 來(lái)代替 RedisTemplate: @Bean public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf) { return new StringRedisTemplate(cf); } }
假如你配置redis服務(wù)器需要用戶(hù)認(rèn)證、運(yùn)行在其他的主機(jī)或端口上:
@Bean public RedisConnectionFactory redisCF() { JedisConnectionFactory cf = new JedisConnectionFactory(); cf.setHostName("redis-server"); cf.setPort(7379); cf.setPassword("foobared"); return cf; }
Spring Data Redis 以模板的形式提供了較高等級(jí)的數(shù)據(jù)訪問(wèn)方案。實(shí)際上,Spring Data Redis 提供了兩個(gè)模板:
RedisTemplate
StringRedisTemplate
RedisTemplate 可以極大地簡(jiǎn)化 Redis 數(shù)據(jù)訪問(wèn),能夠讓我們持久化各種類(lèi)型的 key 和 value,并不局限于字節(jié)數(shù)組。在認(rèn)識(shí)到 key 和 value 通常是 String 類(lèi)型之后,StringRedisTemplate 擴(kuò)展了 RedisTemplate,只關(guān)注 String 類(lèi)型。
可以按照如下方式來(lái)構(gòu)建StringRedisTemplate:
ApplicationContext ctx = new AnnotationConfigApplicationContext(RedisConfig.class); RedisConnectionFactory cf = (RedisConnectionFactory) ctx.getBean("redisCF"); RedisTemplate redis = new StringRedisTemplate(); redis.setConnectionFactory(cf);
也可以按照如下方式構(gòu)建RedisTemplate:
//我這里創(chuàng)建了一個(gè)Product的java對(duì)象 RedisTemplate<String, Product> redis = new RedisTemplate<String, Product>(); redis.setConnectionFactory(cf);
盡管這并非必須的,但是如果你經(jīng)常使用 RedisTemplate 或 StringRedisTemplate 的話(huà),你可以考慮將其配置為 bean,然后注入到需要的地方。如下就是一個(gè)聲明 RedisTemplate 的簡(jiǎn)單 @Bean 方法:
@Bean public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf) { return new StringRedisTemplate(cf); }
有了 RedisTemplate(或 StringRedisTemplate)之后,我們就可以開(kāi)始保存、獲取以及刪除 key-value 條目了。
使用簡(jiǎn)單的值
//設(shè)置值 redis.opsForValue().set("key1","value1"); //獲取值 redis.opsForValue().get("key1");
使用 List 類(lèi)型的值
例如,我們可以在一個(gè) List 類(lèi)型的條目尾部添加一個(gè)值:
redis.opsForList().rightPush("cart", product);
而 leftPush() 則會(huì)在列表的頭部添加一個(gè)值:
redis.opsForList().leftPush("cart", product);
可以通過(guò) leftPop() 或 rightPop() 方法從列表中彈出一個(gè)元素:
Product first = redis.opsForList().leftPop("cart"); Product last = redis.opsForList().rightPop("cart");
除了從列表中獲取值以外,這兩個(gè)方法還有一個(gè)副作用就是從列表中移除所彈出的元素。如果你只是想獲取值的話(huà)(甚至可能要在列表的中間獲取),那么可以使用 range() 方法:
range() 方法不會(huì)從列表中移除任何元素,但是它會(huì)根據(jù)指定的 key 和索引范圍,獲取范圍內(nèi)的一個(gè)或多個(gè)值。前面的樣例中,會(huì)獲取 11 個(gè)元素,從索引為 2 的元素到索引為 12 的元素(不包含)。如果范圍超出了列表的邊界,那么只會(huì)返回索引在范圍內(nèi)的元素。如果該索引范圍內(nèi)沒(méi)有元素的話(huà),將會(huì)返回一個(gè)空的列表。
List<Product> products = redis.opsForList().range("cart", 2, 12);
在 Set 上執(zhí)行操作
添加一個(gè)元素:
redis.opsForSet().add("cart", product);
綁定到某個(gè) key 上
BoundListOperations<String, Product> cart = redis.boundListOps("cart"); Product popped = cart.rightPop(); Product product1 = null; cart.rightPush(product1); Product product2 = null; cart.rightPush(product2); Product product3 = null; cart.rightPush(product3);
我們只在一個(gè)地方使用了條目的 key,也就是調(diào)用 boundListOps() 的時(shí)候。對(duì)返回的 BoundListOperations 執(zhí)行的所有操作都會(huì)應(yīng)用到這個(gè) key 上。
使用 key 和 value 的序列化器
當(dāng)某個(gè)條目保存到 Redis key-value 存儲(chǔ)的時(shí)候,key 和 value 都會(huì)使用 Redis 的序列化器(serializer)進(jìn)行序列化。Spring Data Redis 提供了多個(gè)這樣的序列化器,包括:
GenericToStringSerializer:使用 Spring 轉(zhuǎn)換服務(wù)進(jìn)行序列化;
JacksonJsonRedisSerializer:使用 Jackson 1,將對(duì)象序列化為 JSON;
Jackson2JsonRedisSerializer:使用 Jackson 2,將對(duì)象序列化為JSON;
JdkSerializationRedisSerializer:使用 Java 序列化;
OxmSerializer:使用 Spring O/X 映射的編排器和解排器 (marshaler 和 unmarshaler)實(shí)現(xiàn)序列化,用于 XML 序列化;
StringRedisSerializer:序列化 String 類(lèi)型的 key 和 value。
這些序列化器都實(shí)現(xiàn)了 RedisSerializer 接口,如果其中沒(méi)有符合需求的序列化器,那么你還可以自行創(chuàng)建。
例如,假設(shè)當(dāng)使用 RedisTemplate 的時(shí)候,我們希望將 Product 類(lèi)型的 value 序列化為 JSON,而 key 是 String 類(lèi)型。RedisTemplate 的 setKeySerializer() 和 setValueSerializer() 方法就需要如下所示:
@Bean public RedisTemplate<String, Product> redisTemplate(RedisConnectionFactory cf) { RedisTemplate<String, Product> redis = new RedisTemplate<String, Product>(); redis.setConnectionFactory(cf); redis.setKeySerializer(new StringRedisSerializer()); redis.setValueSerializer(new Jackson2JsonRedisSerializer<Product>(Product.class)); return redis; }
關(guān)于怎么在spring中利用redis操作key-value就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
本文標(biāo)題:怎么在spring中利用redis操作key-value
網(wǎng)頁(yè)URL:http://www.chinadenli.net/article12/jcoegc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、搜索引擎優(yōu)化、微信小程序、域名注冊(cè)、Google、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)