亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Spring-data-redis操作redis cluster的示例代碼

2024-07-14 08:42:30
字體:
來源:轉載
供稿:網友

Redis 3.X版本引入了集群的新特性,為了保證所開發系統的高可用性項目組決定引用Redis的集群特性。對于Redis數據訪問的支持,目前主要有二種方式:一、以直接調用jedis來實現;二、使用spring-data-redis,通過spring的封裝來調用。下面分別對這二種方式如何操作Redis進行說明。

一、利用Jedis來實現

通過Jedis操作Redis Cluster的模型可以參考Redis官網,具體如下:

    Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();     //Jedis Cluster will attempt to discover cluster nodes automatically     jedisClusterNodes.add(new HostAndPort("10.96.5.183",9001));     jedisClusterNodes.add(new HostAndPort("10.96.5.183",9002));     jedisClusterNodes.add(new HostAndPort("10.96.5.183",9003));    JedisCluster jc = new JedisCluster(jedisClusterNodes);    jc.set("foo","bar");    jc.get("foo");

二、利用spring-data-redis來實現

目前spring-data-redis已發布的主干版本都不能很好的支持Redis Cluster的新特性。為了解決此問題spring-data-redis開源項目組單獨拉了一個315分支,但截止到目前尚未發布。下面在分析spring-data-redis源碼的基礎上配置spring實現操作Redis Cluster.下面分別針對XML和注入的方式進行說明。

315分支gitHub下載路徑如下:https://github.com/spring-projects/spring-data-redis

315分支源碼下載路徑:http://maven.springframework.org/snapshot/org/springframework/data/spring-data-redis/1.7.0.DATAREDIS-315-SNAPSHOT/

(1)采用setClusterNodes屬性方式構造RedisClusterConfiguration

代碼目錄結構如下所示:

     src       com.example.bean        com.example.repo       com.example.repo.impl       resources

A.在resources目錄下增加spring-config.xml配置,配置如下:

   <!--通過構造方法注入RedisNode-->   <bean id="clusterRedisNodes1"  class="org.springframework.data.redis.connection.RedisNode">       <constructor-arg value="10.96.5.183" />      <constructor-arg value="9002" type="int" />   </bean>   ....  <!--setter方式注入-->  <bean id="redisClusterConfiguration"  class="org.springframework.data.redis.connection.RedisClusterConfiguration">    <property name="clusterNodes">        <set>            <ref bean="clusterRedisNodes1"/>            <ref bean="clusterRedisNodes2"/>            <ref bean="clusterRedisNodes3"/>       </set>    </property>   <!--紅色所示部分在從gitHub上獲取的jar包中無對應setter方法,因此需要修改其對應的源碼。

另外,如果不設置clusterTimeOut值,源碼中默認為2S。當集群服務器與客戶端不在同一服務器上時,容易報:Could not get a resource from the Cluster;

如果不設置maxRedirects值,源碼中默認為5。一般當此值設置過大時,容易報:Too many Cluster redirections -->

    <property name="clusterTimeOut" value="10000" />    <property name="maxRedirects"  value="5" />  </bean> <!--setter方式注入,對應的屬性需存在setterXXX方法-->  <bean id="jedisPoolConfig"  class="redis.clients.jedis.JedisPoolConfig">      <property name="maxToal" value="1000" />      <property name="maxIdle" value="1000" />      <property name="maxWaitMillis" value="1000" />  </bean> <bean id="jedisConnFactory"  class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true">      <constructor-arg ref="redisClusterConfiguration" />      <constructor-arg ref="jedisPoolConfig" /> </bean> <bean id="redisTemplate"  class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory" /><!--setter方式注入PersonRepoImpl--><bean id="personRepo" class="com.example.repo.impl.PersonRepoImpl">    <property name="redisTemplate" ref="redisTemplate" /></bean>

注:加載lua文件

<bean id ="XXX" class="org.springframework.data.redis.core.script.DefaultRedisScript">  <property name="location" value="./redis/XXX.lua" /> <property name="resultType" value="java.lang.Void" /></bean>

在com.example.repo.impl下增加PersonRepoImpl,主要包括屬性private RedisTemplate<String,Bean>  redisTemplate(該屬性存在setterXXX方法,對應property屬性);

利用redisTemplate.opsForHash().put()即可完成對Redis Cluster的操作。

 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new ClassPathResource("resources/spring-config.xml").getPath()); Repo repo =(Repo)context.getBean("personRepo");

(2)采用RedisClusterConfiguration(PropertySource<?> propertySource)方式構造RedisClusterConfiguration

  代碼目錄結構如下所示:

     src       com.redis.cluster.support.config            MonitorConfig       resources           spring-config.xml            redis.properties

A.在resources目錄下增加spring-config.xml配置,配置如下:

  <!--配置文件加載-->   <context:property-placeholder location="resources/redis.properties"/>  <context:property-placeholder location="resources/xxx.properties"/>   <bean class="com.redis.cluster.support.config.MonitorConfig" />  <!--對靜態資源文件的訪問-->   <mvc:default-servlet-handler/>   <mvc:annotation-driven />   <context:component-scan base-package="com.redis.cluster"/>

B.添加redis.properties文件

spring.redis.cluster.nodes=10.48.193.201:7389,10.48.193.201:7388spring.redis.cluster.timeout=2000spring.redis.cluster.max-redirects=8

C.編寫初始化JedisConnectionFactory連接工廠的java類

  @Configuration  public class MonitorConfig {    @Value("${spring.redis.cluster.nodes}")    private String clusterNodes;    @Value("${spring.redis.cluster.timeout}")    private Long timeout;   @Value("${spring.redis.cluster.max-redirects}")    private int redirects;    @Bean    public RedisClusterConfiguration getClusterConfiguration() {      Map<String, Object> source = new HashMap<String, Object>();      source.put("spring.redis.cluster.nodes", clusterNodes);      source.put("spring.redis.cluster.timeout", timeout);      source.put("spring.redis.cluster.max-redirects", redirects);      return new RedisClusterConfiguration(new MapPropertySource("RedisClusterConfiguration", source));     }    @Bean    public JedisConnectionFactory getConnectionFactory() {      return new JedisConnectionFactory(getClusterConfiguration());     }   @Bean    public JedisClusterConnection getJedisClusterConnection() {      return (JedisClusterConnection) getConnectionFactory().getConnection();     }    @Bean    public RedisTemplate getRedisTemplate() {      RedisTemplate clusterTemplate = new RedisTemplate();      clusterTemplate.setConnectionFactory(getConnectionFactory());      clusterTemplate.setKeySerializer(new DefaultKeySerializer());      clusterTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());      return clusterTemplate;     }    }

D.通過注解方式使用JedisClusterConnection和RedisTemplate

    @Autowired    JedisClusterConnection clusterConnection;   @Autowired   RedisTemplate redisTemplate;

三、簡單集成Spring

自己編寫jedisCluster的工廠類JedisClusterFactory,然后通過Spring注入的方式獲取jedisCluster,實現客戶端使用Redis3.0版本的集群特性。

使用時,直接通過注解或者XML注入即可,如下所示:

   @Autowired   JedisCluster jedisCluster;

  或者

  <bean id="testRedis" class="com.test.TestRedis">    <property name="jedisCluster" ref="jedisClusterFactory" />  </bean>
 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new ClassPathResource("resources/spring-config.xml").getPath()); TestRedis testRedis=(TestRedis)context.getBean("testRedis");

四、Redis Cluster調試中常見錯誤

(1)當客戶端與集群服務器不在同一臺服務器上時,有如下錯誤Could not get a resource from the Cluster

一般當客戶端與集群服務器在同一臺服務器上時,操作Redis Cluster正常; 當二者不在同一臺服務器上時報如上錯誤,可能是clusterTimeOut時間設置過??;

(2)操作Redis時報Too many cluster redirections

初始化JedisCluster時,設定JedisCluster的maxRedirections.

JedisCluster(Set<HostAndPort> jedisClusterNode, int timeout, int maxRedirections) ;JedisCluster jc = new JedisCluster(jedisClusterNodes,5000,1000);

請參考:https://gitHub.com/xetorthio/jedis/issues/659

(3)Redis Cluster數據寫入慢

檢查在通過./redis-trib命令建立集群時,如果是通過127.0.0.1的方式建立的集群,那么在往Redis Cluster中寫入數據時寫入速度比較慢??梢酝ㄟ^配置真實的IP來規避此問題。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品一区二区三区国产精品| 狠狠色狠狠色综合日日五| 久热精品视频在线免费观看| 亚洲精品久久久一区二区三区| 欧美激情一区二区三区久久久| 黑人巨大精品欧美一区免费视频| 成人a在线视频| 欧美日韩亚洲一区二区| 777777777亚洲妇女| 日韩在线免费av| 亚洲无亚洲人成网站77777| 91国产高清在线| 色在人av网站天堂精品| 日韩精品999| 精品国偷自产在线视频| 久久手机精品视频| 亚洲一区精品电影| 成年无码av片在线| 亚洲一区二区免费| 欧美日韩综合视频| 欧美重口另类videos人妖| 欧美日韩一区二区免费视频| 国产成人精品综合久久久| 18久久久久久| 国产日韩在线观看av| 亚洲国产91色在线| 在线播放日韩av| 国产日韩综合一区二区性色av| 久久成人综合视频| xxxx性欧美| 欧美亚洲伦理www| 日韩电影免费观看在线观看| 欧美乱妇40p| 萌白酱国产一区二区| 黄色一区二区三区| 久久97精品久久久久久久不卡| 日韩精品极品在线观看播放免费视频| 国产精品久久久久久久久久尿| 亚洲系列中文字幕| 国产午夜精品视频| 国产精品成人一区二区| 国产精品99久久久久久白浆小说| 九九热精品视频| 欧美激情亚洲自拍| 日韩av电影中文字幕| 国产99久久精品一区二区 夜夜躁日日躁| 国产精品视频网站| 成人在线一区二区| 美女扒开尿口让男人操亚洲视频网站| 欧美在线视频免费观看| 国产精品爱久久久久久久| 色樱桃影院亚洲精品影院| 国产精品视频一区二区三区四| 有码中文亚洲精品| 日韩福利伦理影院免费| 91久久国产综合久久91精品网站| 久久精品成人一区二区三区| www高清在线视频日韩欧美| 亚洲国产精品成人av| 欧美极品美女电影一区| 日韩欧美在线国产| 91麻豆国产精品| 久久99热精品| 欧美性xxxx极品hd欧美风情| 97超级碰碰碰| 日韩精品视频三区| 欧美孕妇与黑人孕交| 亚洲欧美成人精品| 亚洲国产精品va在线观看黑人| 亚洲精品一区中文字幕乱码| 久久精品在线视频| 国产精品第一视频| 国产精品久久久久久久久借妻| 久久综合久久八八| 欧美自拍视频在线| 一本色道久久综合狠狠躁篇的优点| 高清欧美一区二区三区| 亚洲国产精品女人久久久| 欧美激情一级精品国产| 国产美女久久精品香蕉69| 精品久久久久久亚洲国产300| 国产日韩欧美中文| 亚洲国产日韩欧美在线99| 久久777国产线看观看精品| 欧美一级电影免费在线观看| 98精品国产自产在线观看| 精品久久久久久| 亚洲第一天堂无码专区| 亚洲国产精品国自产拍av秋霞| 精品欧美aⅴ在线网站| 国产精品视频中文字幕91| 欧美亚洲国产视频小说| 在线观看免费高清视频97| 久久伊人色综合| 欧美激情一级二级| 中文字幕视频在线免费欧美日韩综合在线看| 欧美日韩一区免费| 丰满岳妇乱一区二区三区| 久久免费在线观看| 欧美日韩午夜视频在线观看| 爱福利视频一区| 亚洲国产成人精品久久| 一区二区中文字幕| 日本久久久久亚洲中字幕| 亚洲国产精品va| 欧美日韩在线看| 国产精品影片在线观看| 高清视频欧美一级| 国产+人+亚洲| 91精品国产成人| 久久久精品一区二区| 美日韩精品视频免费看| 91亚洲永久免费精品| 欧美一级黄色网| 久久久久久久久爱| 91精品在线观看视频| 日韩中文综合网| 国产精品免费一区二区三区都可以| 国产日韩精品入口| 亚洲精品久久久久久久久久久久| 国产精品久久久91| 国产精品欧美日韩一区二区| 欧美自拍视频在线观看| 欧美大片免费观看在线观看网站推荐| 国产精品视频久久久久| 91视频88av| 97在线视频国产| 日韩免费在线电影| 国产精品久久久亚洲| 国产亚洲精品久久久优势| 欧美成人h版在线观看| 国产精品观看在线亚洲人成网| 亚洲性av网站| 国产91成人video| 亚洲欧洲成视频免费观看| 国产成人精品999| 国产精品黄色av| 亚洲图中文字幕| 国产精品久久久久久久久借妻| 久久视频免费在线播放| 日韩中文在线中文网在线观看| 欧美国产视频日韩| 按摩亚洲人久久| 国产在线播放91| 久久久国产精彩视频美女艺术照福利| 欧美激情精品久久久久久大尺度| 成人啪啪免费看| 国产欧美精品xxxx另类| 欧美激情第6页| 国产一区二中文字幕在线看| 亚洲精品美女在线观看| 亚洲精品中文字幕有码专区| 欧美视频在线免费| 欧美日韩一区二区在线播放| 亚洲片国产一区一级在线观看| 国产日韩欧美一二三区| 成人国产精品色哟哟| 亚洲视频电影图片偷拍一区| 国产成+人+综合+亚洲欧洲| 欧美在线播放视频| 日韩欧美亚洲国产一区| 国产一区二区丝袜| 亚洲天堂视频在线观看| 亚洲国产女人aaa毛片在线|