发表于: 2018-09-09 23:09:48

1 381


今天完成的事情:

  1.完成redis缓存在项目中的使用;

  (1)导入jar包;

   <!-- jedis -->
<dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
   <version>2.7.3</version>
</dependency>

  (2)redis.properties;

#ip地址
redis.hostName=127.0.0.1
#端口号
redis.port=6379
#如果有密码
redis.password=
#客户端超时时间单位是毫秒 默认是2000
redis.timeout=2000

#最大空闲数
redis.maxIdle=10
#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
redis.maxActive=10
#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
redis.maxTotal=10
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWaitMillis=1000
#连接的最小空闲时间 默认1800000毫秒(30分钟)
redis.minEvictableIdleTimeMillis=300000
#每次释放连接的最大数目,默认3
redis.numTestsPerEvictionRun=1024
#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
redis.timeBetweenEvictionRunsMillis=30000
#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
redis.testOnBorrow=false
#在空闲时检查有效性, 默认false
redis.testWhileIdle=false

  (3)applicationContext.xml中添加相关配置;

<!-- 载入redis.properties,这里要特别注意,如果有多个properties文件,必须用逗号分开,不能写成两个 <context:property-placeholder/> -->
<context:property-placeholder location="classpath:redis.properties" />

<!-- redis连接池配置-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" >
   <!--最大空闲数-->
   <property name="maxIdle" value="${redis.maxIdle}" />
   <!--连接池的最大数据库连接数  -->
   <property name="maxTotal" value="${redis.maxTotal}" />
   <!--最大建立连接等待时间-->
   <property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
   <!--逐出连接的最小空闲时间 默认1800000毫秒(30分钟)-->
   <property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}" />
   <!--每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3-->
   <property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}" />
   <!--逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1-->
   <property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}" />
   <!--是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个-->
   <property name="testOnBorrow" value="${redis.testOnBorrow}" />
   <!--在空闲时检查有效性, 默认false  -->
   <property name="testWhileIdle" value="${redis.testWhileIdle}" />
</bean >

<!--redis连接工厂 -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
   <property name="poolConfig" ref="jedisPoolConfig"></property>
   <!--IP地址 -->
   <property name="hostName" value="${redis.hostName}"></property>
   <!--端口号  -->
   <property name="port" value="${redis.port}"></property>
   <!--如果Redis设置有密码  -->
   <property name="password" value="${redis.password}" />
   <!--客户端超时时间单位是毫秒  -->
   <property name="timeout" value="${redis.timeout}"></property>
</bean>

<!--redis操作模版,使用该对象可以操作redis  -->
<bean id="redisTemplate" 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="hashKeySerializer">
       <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
   </property>
   <property name="valueSerializer">
       <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
   </property>
   <property name="hashValueSerializer">
       <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
   </property>
</bean >

  (4)RedisUtil(格式就不调整了有点多,反正也是copy别人的工具类);

package com.zyq.util;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;


@Component
public class RedisUtil {
      @Autowired
   private RedisTemplate<String, Object> redisTemplate;

   //=============================common============================

   public boolean expire(String key,long time){
          try {
                     if(time>0){
                         redisTemplate.expire(key, time, TimeUnit.SECONDS);
       }
                   return true;
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }


   public long getExpire(String key){
       return redisTemplate.getExpire(key,TimeUnit.SECONDS);
   }

   public boolean hasKey(String key){
       try {
           return redisTemplate.hasKey(key);
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }

   @SuppressWarnings("unchecked")
   public void del(String ... key){
       if(key!=null&&key.length>0){
           if(key.length==1){
               redisTemplate.delete(key[0]);
           }else{
               redisTemplate.delete(CollectionUtils.arrayToList(key));
           }
       }
   }

   //============================String=============================
  
   public Object get(String key){
       return key==null?null:redisTemplate.opsForValue().get(key);
   }


   public boolean set(String key,Object value) {
       try {
           redisTemplate.opsForValue().set(key, value);
           return true;
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }

   }

   public boolean set(String key,Object value,long time){
       try {
           if(time>0){
               redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
           }else{
               set(key, value);
           }
           return true;
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }


   public long incr(String key, long delta){
       if(delta<0){
           throw new RuntimeException("递增因子必须大于0");
       }
       return redisTemplate.opsForValue().increment(key, delta);
   }


   public long decr(String key, long delta){
       if(delta<0){
           throw new RuntimeException("递减因子必须大于0");
       }
       return redisTemplate.opsForValue().increment(key, -delta);
   }

   //================================Map=================================
  
   public Object hget(String key,String item){
       return redisTemplate.opsForHash().get(key, item);
   }


   public Map<Object,Object> hmget(String key){
       return redisTemplate.opsForHash().entries(key);
   }


   public boolean hmset(String key, Map<String,Object> map){
       try {
           redisTemplate.opsForHash().putAll(key, map);
           return true;
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }


   public boolean hmset(String key, Map<String,Object> map, long time){
       try {
           redisTemplate.opsForHash().putAll(key, map);
           if(time>0){
               expire(key, time);
           }
           return true;
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }


   public boolean hset(String key,String item,Object value) {
       try {
           redisTemplate.opsForHash().put(key, item, value);
           return true;
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }

   public boolean hset(String key,String item,Object value,long time) {
       try {
           redisTemplate.opsForHash().put(key, item, value);
           if(time>0){
               expire(key, time);
           }
           return true;
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }


   public void hdel(String key, Object... item){
       redisTemplate.opsForHash().delete(key,item);
   }


   public boolean hHasKey(String key, String item){
       return redisTemplate.opsForHash().hasKey(key, item);
   }


   public double hincr(String key, String item,double by){
       return redisTemplate.opsForHash().increment(key, item, by);
   }


   public double hdecr(String key, String item,double by){
       return redisTemplate.opsForHash().increment(key, item,-by);
   }

   //============================set=============================
   
   public Set<Object> sGet(String key){
       try {
           return redisTemplate.opsForSet().members(key);
       } catch (Exception e) {
           e.printStackTrace();
           return null;
       }
   }


   public boolean sHasKey(String key,Object value){
       try {
           return redisTemplate.opsForSet().isMember(key, value);
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }


   public long sSet(String key, Object...values) {
       try {
           return redisTemplate.opsForSet().add(key, values);
       } catch (Exception e) {
           e.printStackTrace();
           return 0;
       }
   }


   public long sSetAndTime(String key,long time,Object...values) {
       try {
           Long count = redisTemplate.opsForSet().add(key, values);
           if(time>0) expire(key, time);
           return count;
       } catch (Exception e) {
           e.printStackTrace();
           return 0;
       }
   }

   public long sGetSetSize(String key){
       try {
           return redisTemplate.opsForSet().size(key);
       } catch (Exception e) {
           e.printStackTrace();
           return 0;
       }
   }


   public long setRemove(String key, Object ...values) {
       try {
           Long count = redisTemplate.opsForSet().remove(key, values);
           return count;
       } catch (Exception e) {
           e.printStackTrace();
           return 0;
       }
   }
   //===============================list=================================


   public List<Object> lGet(String key,long start, long end){
       try {
           return redisTemplate.opsForList().range(key, start, end);
       } catch (Exception e) {
           e.printStackTrace();
           return null;
       }
   }


   public long lGetListSize(String key){
       try {
           return redisTemplate.opsForList().size(key);
       } catch (Exception e) {
           e.printStackTrace();
           return 0;
       }
   }


   public Object lGetIndex(String key,long index){
       try {
           return redisTemplate.opsForList().index(key, index);
       } catch (Exception e) {
           e.printStackTrace();
           return null;
       }
   }


   public boolean lSet(String key, Object value) {
       try {
           redisTemplate.opsForList().rightPush(key, value);
           return true;
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }


   public boolean lSet(String key, Object value, long time) {
       try {
           redisTemplate.opsForList().rightPush(key, value);
           if (time > 0) expire(key, time);
           return true;
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }


   public boolean lSet(String key, List<Object> value) {
       try {
           redisTemplate.opsForList().rightPushAll(key, value);
           return true;
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }


   public boolean lSet(String key, List<Object> value, long time) {
       try {
           redisTemplate.opsForList().rightPushAll(key, value);
           if (time > 0) expire(key, time);
           return true;
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }


   public boolean lUpdateIndex(String key, long index,Object value) {
       try {
           redisTemplate.opsForList().set(key, index, value);
           return true;
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }


   public long lRemove(String key,long count,Object value) {
       try {
           Long remove = redisTemplate.opsForList().remove(key, count, value);
           return remove;
       } catch (Exception e) {
           e.printStackTrace();
           return 0;
       }
 }

}

  (5)使用缓存

   1)这里的使用String;

 @Autowired
   private ExcellentStudentService excellentStudentService;
   @Autowired
   private RedisUtil redisUtil;
//    跳转首页
   @RequestMapping(value = "/index")
      public String indexView(Model model) {
              logger.info("进入首页(展示优秀学员信息)。。。。。。。。。。。。。。。。。");
       model.addAttribute("item","indexBody");
       List<ExcellentStudent> list;
       if (redisUtil.get("ExcellentStudent")==null){
                      logger.info("缓存中没有优秀学员信息,正要去数据库中查询");
           list = excellentStudentService.selectByOrder();
           redisUtil.set("ExcellentStudent",list);
       }else {
                      logger.info("缓存中有优秀学员信息,直接读取了");
           list = (List<ExcellentStudent>) redisUtil.get("ExcellentStudent");
       }
       model.addAttribute("list",list);
       return "myView";
   }

   2)这里的使用hash。

    @Autowired
   private StudentService studentService;

   @Autowired
   private RedisUtil redisUtil;

//    查询所有学生信息,上下页跳转使用
   @RequestMapping(value = "/studentS",method = RequestMethod.GET)
   public ModelAndView selectAllByPage(Integer currPage){
      logger.info("输入参数:当前页为"+currPage+"。");
      ModelAndView modelAndView = new ModelAndView("myView");
      Page<Student> page;
      if (redisUtil.hget("pageStudents","page"+currPage)==null){
           logger.info("缓存中没有第"+currPage+"页的page,我要查询并放进去。。。");
           page = studentService.selectAllByPage(currPage);
           logger.info("共查询到"+page.getList().size()+"条记录");
           redisUtil.hset("pageStudents","page"+currPage,page);
       }else {
           logger.info("缓存中存在第"+currPage+"页的page页存在,我直接从缓存拿了。。。");
           page = (Page<Student>) redisUtil.hget("pageStudents","page"+currPage);
       }
       modelAndView.addObject("page",page);
       modelAndView.addObject("item","viewsBody");
       logger.info("***********************分割线***************************");
       return modelAndView;
   }

  (6)展示;

  刷新页面:

  2.尝试使用redis缓存实现nginx代理之后session共享(使用spring-session-data-redis);

  (1)导入jar包;

<dependency>
   <groupId>org.springframework.session</groupId>
   <artifactId>spring-session-data-redis</artifactId>
   <version>1.3.0.RELEASE</version>
   <type>pom</type>
</dependency>

  (2)applicationContext.xml中添加如下配置

<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>

  (3)web.xml中添加如下过滤器,放在所有过滤器最前面

<filter>
   <filter-name>springSessionRepositoryFilter</filter-name>
   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
   <filter-name>springSessionRepositoryFilter</filter-name>
   <url-pattern>/*</url-pattern>
   <dispatcher>REQUEST</dispatcher>
   <dispatcher>ERROR</dispatcher>
</filter-mapping>

  (4)nginx代理配置三个服务器tomcat8 8089端口,resin 8090端口,jetty 8099端口;

  

  (5)展示(可使用成果展示链接查看);


明天计划的情:

  按照任务要求整理任务六相关知识,对照验收标准等完成任务六。

遇到的问题:

  在尝试使用redis缓存完成nginx代理服务器session共享时,配置好之后启动项目,出现如下报错:


收获:

  1.学习redis与springMVC项目整合;

  2.学习redis缓存完成nginx代理服务器session共享。


任务进度:

  2018.09.04日领取任务六,预计2018.09.10提交任务六。


返回列表 返回列表
评论

    分享到