课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > Java Spring mvc操作Redis及Redis集群
  • Java Spring mvc操作Redis及Redis集群

    发布:昆明Java培训      来源:达内新闻      时间:2016-10-21

  • Redis是什么,能做什么

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

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

    一般Java程序操作Redis

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

    <dependency>

    <groupId>redis.clients</groupId>

    <artifactId>jedis</artifactId>

    <version>2.9.0</version>

    </dependency>

    操作Redis单机

    + View Code

    操作redis集群

    + View Code

    Spring mvc操作Redis

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

    + View Code

    操作Redis单机

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

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

    + View Code

    Controller实现如下:

    @Controller

    @RequestMapping(value = "redisAllInOne")

    public class RedisAllInOneController {

    @Autowired

    private RedisService redisService;

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

    @ResponseBody

    public Object getByMyService(String key){

    try {

    String result = redisService.get(key);

    return result;

    }catch (Exception e){

    e.printStackTrace();

    }

    return null;

    }

    }

    用spring-data-redis包做集成

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

    <dependency>

    <groupId>org.springframework.data</groupId>

    <artifactId>spring-data-redis</artifactId>

    <version>1.7.2.RELEASE</version>

    </dependency>

    使用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-redis xml配置文件redis-context.xml:

    <!-- jedis连接池配置-->

    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" >

    <property name="maxIdle" value="${redis.maxIdle}" />

    <property ame="maxWaitMillis" value="${redis.maxWait}" />

    <property ame="testOnBorrow" value="${redis.testOnBorrow}" />

    </bean>

    <!-- redis服务器中心-->

    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >

    <property ame="poolConfig" ref="poolConfig" />

    <property name="port" value="${redis.port}" />

    <property name="hostName" value="${redis.host}" />

    <!--<property ame="password" value="${redis.password}" />-->

    <property name="timeout" value="${redis.timeout}" ></property>

    <property name="database" value="1"></property>

    </bean>

    <bean id="commonRedisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >

    <property ame="connectionFactory" ref="connectionFactory" />

    <property ame="keySerializer" ref="stringRedisSerializer" />

    <property ame="hashKeySerializer" ref="stringRedisSerializer" />

    <property ame="valueSerializer" ref="stringRedisSerializer" />

    <property ame="hashValueSerializer" ref="stringRedisSerializer" />

    </bean>

    <bean id="connectionFactory1" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >

    <property name="poolConfig" ref="poolConfig" />

    <property name="port" value="${redis.port}" />

    <property name="hostName" value="${redis.host}" />

    <!--<property ame="password" value="${redis.password}" />-->

    <property name="timeout" value="${redis.timeout}" ></property>

    <property name="database" value="2"></property>

    </bean>

    <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />

    <bean id="cacheRedisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >

    <property ame="connectionFactory" ref="connectionFactory1" />

    <property ame="keySerializer" ref="stringRedisSerializer" />

    <property name="hashKeySerializer" ref="stringRedisSerializer" />

    <property ame="valueSerializer" ref="stringRedisSerializer" />

    <property ame="hashValueSerializer" ref="stringRedisSerializer" />

    </bean>

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

    1

    <import resource="redis-context.xml" />

    昆明Java培训机构的老师解释一下上面的配置:

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

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

    + View Code

    最后在Controller中调用即可

    @Autowired

    private RedisCache redisCache;

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

    @ResponseBody

    public Object getByMyService(String key) {

    try {

    String result = redisService.get(key);

    return result;

    } catch (Exception e) {

    e.printStackTrace();

    }

    return null;

    }

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

    @ResponseBody

    public Object save() {

    Token token = new Token();

    token.setAccess_token("token");

    token.setExpires_in(1000);

    try {

    redisCache.put("token", token);

    } catch (Exception e) {

    e.printStackTrace();

    }

    return "ok";

    }

    操作Redis集群

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

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

    import org.springframework.stereotype.Service;

    import util.JedisClusterClient;

    /**

    * Created by fengdezitai on 2016/10/13.

    */

    @Service

    public class RedisClusterService {

    public void save() throws Exception{

    //调用JedisClusterClient中的方法

    JedisClusterClient jedisClusterClient = JedisClusterClient.getInstance();

    try {

    jedisClusterClient.SaveRedisCluster();

    }catch (Exception e){

    throw e;

    }

    }

    }

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

    @Controller

    @RequestMapping(value = "redisCluster")

    public class RedisClusterController {

    @Autowired

    private RedisClusterService redisClusterService;

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

    @ResponseBody

    public Object save(){

    try{

    redisClusterService.save();

    }catch (Exception e){

    e.printStackTrace();

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

    }

    return "ok";

    }

    }

    用spring-data-redis包做集成

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

    redis集群服务属性配置

    redis.maxIdle=300

    redis.maxWait=3000

    redis.testOnBorrow=false

    redis.timeout=3000

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

    <!--连接池配置-->

    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" >

    <property name="maxIdle" value="${redis.maxIdle}" />

    <property ame="maxWaitMillis" value="${redis.maxWait}" />

    <property ame="testOnBorrow" value="${redis.testOnBorrow}" />

    </bean>

    <bean id="redisClusterConfig" class="org.springframework.data.redis.connection.RedisClusterConfiguration">

    <property ame="maxRedirects" value="3"></property>

    <property ame="clusterNodes">

    <set>

    <bean class="org.springframework.data.redis.connection.RedisNode">

    <constructor-arg ame="host" value="192.168.31.245"></constructor-arg>

    <constructor-arg ame="port" value="7000"></constructor-arg>

    </bean>

    <bean class="org.springframework.data.redis.connection.RedisNode">

    <constructor-arg ame="host" value="192.168.31.245"></constructor-arg>

    <constructor-arg ame="port" value="7001"></constructor-arg>

    </bean>

    <bean class="org.springframework.data.redis.connection.RedisNode">

    <constructor-arg ame="host" value="192.168.31.245"></constructor-arg>

    <constructor-arg ame="port" value="7002"></constructor-arg>

    </bean>

    <bean class="org.springframework.data.redis.connection.RedisNode">

    <constructor-arg ame="host" value="192.168.31.210"></constructor-arg>

    <constructor-arg ame="port" value="7003"></constructor-arg>

    </bean>

    <bean class="org.springframework.data.redis.connection.RedisNode">

    <constructor-arg ame="host" value="192.168.31.210"></constructor-arg>

    <constructor-arg ame="port" value="7004"></constructor-arg>

    </bean>

    <bean class="org.springframework.data.redis.connection.RedisNode">

    <constructor-arg ame="host" value="192.168.31.210"></constructor-arg>

    <constructor-arg ame="port" value="7005"></constructor-arg>

    </bean>

    </set>

    </property>

    </bean>

    <bean id="redis4CacheConnectionFactory"

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

    <constructor-arg ame="clusterConfig" ref="redisClusterConfig" />

    <property name="timeout" value="${redis.timeout}" />

    <property ame="poolConfig" ref="poolConfig"/>

    </bean>

    <bean ame="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />

    <bean id="clusterRedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">

    <property ame="connectionFactory" ref="redis4CacheConnectionFactory" />

    <property ame="keySerializer" ref="stringRedisSerializer" />

    <property ame="hashKeySerializer" ref="stringRedisSerializer" />

    <property ame="valueSerializer" ref="stringRedisSerializer" />

    <property ame="hashValueSerializer" ref="stringRedisSerializer" />

    </bean>

    之后在Spring配置文件中引用

    1

    <import resource="redis-cluster-context.xml" />

    昆明Java培训机构的老师解释以上配置:

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

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

    + View Code

    最后在Controller中调用即可

    @Controller

    @RequestMapping(value = "redisCluster")

    public class RedisClusterController {

    @Autowired

    private RedisClusterCache redisClusterCache;

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

    @ResponseBody

    public Object clusterSave(){

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

    Token token = new Token();

    token.setExpires_in(1000);

    token.setAccess_token("hello world");

    redisClusterCache.put("token",token);

    return "ok";

    }

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

    @ResponseBody

    public Object getCluster(String key){

    Object val = redisClusterCache.get(key);

    return val;

    }

    }

    昆明Java培训机构的老师提醒注意事项:

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

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

    推荐文章

上一篇:【昆明Java培训机构】剖析HashSet

下一篇:Java培训:不要在构造函数中抛出异常

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:12/29

Java--零基础业余班

Java--零基础业余班

开班日期:12/29

Java--周末提升班

Java--周末提升班

开班日期:12/29

Java--零基础周末班

Java--零基础周末班

开班日期:12/29

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56