配色: 字号:
Java Spring mvc 操作 Redis 及 Redis 集群
2017-01-13 | 阅:  转:  |  分享 
  
JavaSpringmvc操作Redis及Redis集群

Redis是什么,能做什么

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过RedisSentinel提供高可用,通过RedisCluster提供自动分区。(摘自Redis官网)



作为内存数据库,在现代互联网web系统中,还是主要将Redis作为缓存使用。大型互联网Web系统对性能要求很高,而在前端和数据层之间增加数据缓存已成为必不可少的手段之一,当前比较流行的两个技术就是Redis和Memcached,至于两者有什么区别,不是本文要说的内容。本文主要讲Javaweb如何操作Redis及Redis集群。



一般Java程序操作Redis



Redis提供了多种语言的客户端,在Java中最流行的是Jedis。访问可查看源码及使用方式。目前Jedis最新版本是2.9.0。无论是单机还是集群,Jedis都有很详细的说明和实例代码,这里只做简单说明。如果用Maven做包管理,需要引用jedis包,本例使用最新的2.9.0版本,如下:





redis.clients

jedis

2.9.0



操作Redis单机



+ViewCode

操作redis集群



+ViewCode

Springmvc操作Redis



在Springmvc中操作Redis,首先当然要搭好Springmvc框架了。以下是在假设Springmvc环境已经架好的情况下。本例中Spring版本为4.3.2RELEASE。关于Spring的maven引用如下:



+ViewCode

操作Redis单机



只用Jedis自己实现注入(区别于下面的引用spring-data-redis)



把前面的JedisClient代码拿过来引用即可,只需实现一个访问Redis的Service,就可以集成到Springmvc。Service代码如下:



+ViewCode

Controller实现如下:



@Controller

@RequestMapping(value="redisAllInOne")

publicclassRedisAllInOneController{



@Autowired

privateRedisServiceredisService;



@RequestMapping(value="get",method=RequestMethod.GET)

@ResponseBody

publicObjectgetByMyService(Stringkey){

try{

Stringresult=redisService.get(key);

returnresult;

}catch(Exceptione){

e.printStackTrace();

}

returnnull;

}

}

用spring-data-redis包做集成



上面是自己实现的注入,这里用spring-data-redis进行集成,只需简单配置即可,需要引用maven包如下,版本为目前最新版1.7.2.RELEASE:





org.springframework.data

spring-data-redis

1.7.2.RELEASE



使用spring-data-redis,即省去了自己实现注入的过程,通过它提供的一些配置,即可实现连接池配置、RedisTemplate配置、JedisConnectionFactory配置;通过JedisConnectionFactory可配置连接池参数、redis服务器、端口、密码、超时时间、database索引等;RedisTemplate即注入的bean,可以使用RedisTemplate自动注入的实体进行redis的一系列操作,具体看配置;



redis服务属性配置文件:



redis.maxIdle=300

redis.maxWait=3000

redis.testOnBorrow=true

redis.host=192.168.31.121

redis.port=6379

redis.password=password

redis.timeout=3000

spring-data-redisxml配置文件redis-context.xml:





















































































之后在spring配置文件中引用以上文件:





解释一下上面的配置:



poolConfig即配置redis连接池,之后配置了两个JedisConnectionFactory和RedisTemplate,一个RedisTemplate对应一个JedisConnectionFactory,这样可以配置根据场景配置不同的Redis连接,比如超时时间要求不一致、database0-15可以存储不同的数据等。这里就配置了database1和2,调用commonRedisTemplate会存到database1,调用cacheRedisTemplate会存到database2。



之后在Service层即可注入并引用这两个RedisTemplate,如下代码:



+ViewCode

最后在Controller中调用即可



@Autowired

privateRedisCacheredisCache;





@RequestMapping(value="get",method=RequestMethod.GET)

@ResponseBody

publicObjectgetByMyService(Stringkey){

try{

Stringresult=redisService.get(key);

returnresult;

}catch(Exceptione){

e.printStackTrace();

}

returnnull;

}



@RequestMapping(value="save",method=RequestMethod.GET)

@ResponseBody

publicObjectsave(){

Tokentoken=newToken();

token.setAccess_token("token");

token.setExpires_in(1000);

try{

redisCache.put("token",token);

}catch(Exceptione){

e.printStackTrace();

}

return"ok";

}

操作Redis集群



只用Jedis自己实现注入(区别于下面的引用spring-data-redis)



把前面的JedisClusterClient代码拿过来引用即可,只需实现一个访问Redis的Service,就可以集成到Springmvc。Service代码如下:



importorg.springframework.stereotype.Service;

importutil.JedisClusterClient;



/

Createdbyfengdezitaion2016/10/13.

/

@Service

publicclassRedisClusterService{



publicvoidsave()throwsException{

//调用JedisClusterClient中的方法

JedisClusterClientjedisClusterClient=JedisClusterClient.getInstance();

try{

jedisClusterClient.SaveRedisCluster();

}catch(Exceptione){

throwe;

}

}

}

最后在Controller中调用实现的Service即可



@Controller

@RequestMapping(value="redisCluster")

publicclassRedisClusterController{



@Autowired

privateRedisClusterServiceredisClusterService;



@RequestMapping(value="save",method=RequestMethod.GET)

@ResponseBody

publicObjectsave(){

try{

redisClusterService.save();

}catch(Exceptione){

e.printStackTrace();

returnString.format("error:%s",e.getMessage());

}

return"ok";

}

}

用spring-data-redis包做集成



Spring和spring-data-redismaven包引用和前面一致,之所以引用spring-data-redis1.7.2.RELEASE,是因为目前只有这个最新版本才支持集群操作。



redis集群服务属性配置



redis.maxIdle=300

redis.maxWait=3000

redis.testOnBorrow=false

redis.timeout=3000

spring-data-redisxml集群配置文件redis-cluster-context.xml




















































































class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">





























之后在Spring配置文件中引用





解释以上配置:



poolConfig是连接池配置,redisClusterConfig配置了Redis集群的各个节点(节点host和port最好写在属性配置文件中),集群搭建可见我的另一篇博客。然后下面和单机配置一样了,一对JedisConnectionFactory和RedisTemplate。



之后在Service层即可注入并引用这个RedisTemplate,代码如下:



+ViewCode

最后在Controller中调用即可



@Controller

@RequestMapping(value="redisCluster")

publicclassRedisClusterController{



@Autowired

privateRedisClusterCacheredisClusterCache;



@RequestMapping(value="clusterSave",method={RequestMethod.GET,RequestMethod.POST})

@ResponseBody

publicObjectclusterSave(){

//redisClusterCache.put("cluster","savecluster");

Tokentoken=newToken();

token.setExpires_in(1000);

token.setAccess_token("helloworld");

redisClusterCache.put("token",token);

return"ok";

}



@RequestMapping(value="getKey",method=RequestMethod.GET)

@ResponseBody

publicObjectgetCluster(Stringkey){

Objectval=redisClusterCache.get(key);

returnval;

}

}

注意事项:



版本问题,如果用spring-data-redis做集成操作Reids集群,只有spring-data-redis目前最新版本1.7才包含对集群的操作,而最新的spring-data-redis中的某些功能对Springmvc的版本也有些限制,所以尽量选择高版本的Springmvc对应。

如果存储的value值是一个实体对象,那么一定要实现Serializable接口

献花(0)
+1
(本文系thedust79首藏)