日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring-data-redis:特性与实例--转载

發(fā)布時(shí)間:2025/4/5 javascript 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring-data-redis:特性与实例--转载 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文地址:http://shift-alt-ctrl.iteye.com/blog/1886831

Spring-data-redis為spring-data模塊中對(duì)redis的支持部分,簡稱為“SDR”,提供了基于jedis客戶端API的高度封裝以及與spring容器的整合,事實(shí)上jedis客戶端已經(jīng)足夠簡單和輕量級(jí),而spring-data-redis反而具有“過度設(shè)計(jì)”的嫌疑。

??? jedis客戶端在編程實(shí)施方面存在如下不足:

??? 1) connection管理缺乏自動(dòng)化,connection-pool的設(shè)計(jì)缺少必要的容器支持。

??? 2) 數(shù)據(jù)操作需要關(guān)注“序列化”/“反序列化”,因?yàn)閖edis的客戶端API接受的數(shù)據(jù)類型為string和byte,對(duì)結(jié)構(gòu)化數(shù)據(jù)(json,xml,pojo等)操作需要額外的支持。

??? 3) 事務(wù)操作純粹為硬編碼

??? 4) pub/sub功能,缺乏必要的設(shè)計(jì)模式支持,對(duì)于開發(fā)者而言需要關(guān)注的太多。

??? 不過jedis與spring整合,也是非常的簡單,參見“jedis連接池實(shí)例”.

?

一.? spring-data-redis針對(duì)jedis提供了如下功能

????1. 連接池自動(dòng)管理,提供了一個(gè)高度封裝的“RedisTemplate”類

????2. 針對(duì)jedis客戶端中大量api進(jìn)行了歸類封裝,將同一類型操作封裝為operation接口

  • ValueOperations:簡單K-V操作
  • SetOperations:set類型數(shù)據(jù)操作
  • ZSetOperations:zset類型數(shù)據(jù)操作
  • HashOperations:針對(duì)map類型的數(shù)據(jù)操作
  • ListOperations:針對(duì)list類型的數(shù)據(jù)操作

? ??3. 提供了對(duì)key的“bound”(綁定)便捷化操作API,可以通過bound封裝指定的key,然后進(jìn)行一系列的操作而無須“顯式”的再次指定Key,即BoundKeyOperations:

  • BoundValueOperations
  • BoundSetOperations
  • BoundListOperations
  • BoundSetOperations
  • BoundHashOperations

??

??? 4. 將事務(wù)操作封裝,有容器控制。

????5. 針對(duì)數(shù)據(jù)的“序列化/反序列化”,提供了多種可選擇策略(RedisSerializer)

  • JdkSerializationRedisSerializer:POJO對(duì)象的存取場景,使用JDK本身序列化機(jī)制,將pojo類通過ObjectInputStream/ObjectOutputStream進(jìn)行序列化操作,最終redis-server中將存儲(chǔ)字節(jié)序列。是目前最常用的序列化策略。
  • StringRedisSerializer:Key或者value為字符串的場景,根據(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類型,因此此策略封裝起來稍微復(fù)雜。【需要jackson-mapper-asl工具支持】
  • OxmSerializer:提供了將javabean與xml之間的轉(zhuǎn)換能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存儲(chǔ)的數(shù)據(jù)將是xml工具。不過使用此策略,編程將會(huì)有些難度,而且效率最低;不建議使用。【需要spring-oxm模塊的支持】

??? 針對(duì)“序列化和發(fā)序列化”中JdkSerializationRedisSerializer和StringRedisSerializer是最基礎(chǔ)的策略,原則上,我們可以將數(shù)據(jù)存儲(chǔ)為任何格式以便應(yīng)用程序存取和解析(其中應(yīng)用包括app,hadoop等其他工具),不過在設(shè)計(jì)時(shí)仍然不推薦直接使用“JacksonJsonRedisSerializer”和“OxmSerializer”,因?yàn)闊o論是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)參見下文實(shí)例。

?

????6. 基于設(shè)計(jì)模式,和JMS開發(fā)思路,將pub/sub的API設(shè)計(jì)進(jìn)行了封裝,使開發(fā)更加便捷。

????7.spring-data-redis中,并沒有對(duì)sharding提供良好的封裝,如果你的架構(gòu)是基于sharding,那么你需要自己去實(shí)現(xiàn),這也是sdr和jedis相比,唯一缺少的特性。

?

二.簡單實(shí)例:

??? 1) spring配置:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName"><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"><property name="maxActive" value="32"></property><property name="maxIdle" value="6"></property><property name="maxWait" value="15000"></property><property name="minEvictableIdleTimeMillis" value="300000"></property><property name="numTestsPerEvictionRun" value="3"></property><property name="timeBetweenEvictionRunsMillis" value="60000"></property><property name="whenExhaustedAction" value="1"></property></bean><bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy"><property name="poolConfig" ref="jedisPoolConfig"></property><property name="hostName" value="127.0.0.1"></property><property name="port" value="6379"></property><property name="password" value="0123456"></property><property name="timeout" value="15000"></property><property name="usePool" value="true"></property></bean><bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate"><property name="connectionFactory" ref="jedisConnectionFactory"></property><property name="keySerializer"><bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/></property><property name="valueSerializer"><bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/></property></bean> </beans>

?2) 程序?qū)嵗?#xff1a;

public class SpringDataRedisTestMain {/*** @param args*/public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-redis-beans.xml");RedisTemplate redisTemplate = (RedisTemplate)context.getBean("jedisTemplate");//其中key采取了StringRedisSerializer//其中value采取JdkSerializationRedisSerializerValueOperations<String, User> valueOper = redisTemplate.opsForValue();User u1 = new User("zhangsan",12);User u2 = new User("lisi",25);valueOper.set("u:u1", u1);valueOper.set("u:u2", u2);System.out.println(valueOper.get("u:u1").getName());System.out.println(valueOper.get("u:u2").getName());}/*** 如果使用jdk序列化方式,bean必須實(shí)現(xiàn)Serializable,且提供getter/setter方法* @author qing**/static class User implements Serializable{/*** */private static final long serialVersionUID = -3766780183428993793L;private String name;private Date created;private int age;public User(){}public User(String name,int age){this.name = name;this.age = age;this.created = new Date();}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getCreated() {return created;}public void setCreated(Date created) {this.created = created;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}}

? ? 3) RedisTemplate:

??? 如果你使用過jedisPool連接池,在數(shù)據(jù)操作之前,你需要pool.getResource()即從連接池中獲取“鏈接資源”(Jedis),在操作之后,你需要(必須)調(diào)用pool.returnResource()將資源歸還個(gè)連接池。但是,spring-data-redis中,我們似乎并沒有直接操作pool,那么spring是如何做到pool管理的呢??一句話:spring的“看門絕技”--callback。

  • ?public <T> T execute(RedisCallback<T> action):這個(gè)方法是redisTemplate中執(zhí)行操作的底層方法,任何基于redisTemplate之上的調(diào)用(比如,valueOperations)最終都會(huì)被封裝成RedisCallback,redisTemplate在execute方法中將會(huì)直接使用jedis客戶端API進(jìn)行與server通信,而且在如果使用了連接池,則會(huì)在操作之后執(zhí)行returnSource。

其他實(shí)例請(qǐng)參考如下鏈接:

1)?serializer實(shí)例

2)?operation實(shí)例

3)?pub/sub實(shí)例

?

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/4915109.html

總結(jié)

以上是生活随笔為你收集整理的Spring-data-redis:特性与实例--转载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。