• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    详解SSH框架和Redis的整合

    一个已有的Struts+Spring+Hibernate项目,以前使用MySQL数据库,现在想把Redis也整合进去。

    1. 相关Jar文件

    下载并导入以下3个Jar文件:

    commons-pool2-2.4.2.jar、jedis-2.3.1.jar、spring-data-redis-1.3.4.RELEASE.jar。

    2. Redis配置文件

    在src文件夹下面新建一个redis.properties文件,设置连接Redis的一些属性。

    redis.host=127.0.0.1 
    redis.port=6379 
    redis.default.db=1 
    redis.timeout=100000 
    redis.maxActive=300 
    redis.maxIdle=100 
    redis.maxWait=1000 
    redis.testOnBorrow=true 

    再新建一个redis.xml文件。

    ?xml version="1.0" encoding="UTF-8"?> 
    beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 
     
     context:property-placeholder location="classpath:redis.properties"/> 
     
     bean id="propertyConfigurerRedis" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
      property name="order" value="1" /> 
      property name="ignoreUnresolvablePlaceholders" value="true" /> 
      property name="systemPropertiesMode" value="1" /> 
      property name="searchSystemEnvironment" value="true" /> 
      property name="locations"> 
      list> 
       value>classpath:redis.properties/value> 
      /list> 
      /property> 
     /bean>
     
     bean id="jedisPoolConfig" 
      class="redis.clients.jedis.JedisPoolConfig"> 
      property name="maxIdle" value="${redis.maxIdle}" /> 
      property name="testOnBorrow" value="${redis.testOnBorrow}" /> 
     /bean>
      
     bean id="jedisConnectionFactory" 
      class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> 
      property name="usePool" value="true">/property> 
      property name="hostName" value="${redis.host}" /> 
      property name="port" value="${redis.port}" /> 
      property name="timeout" value="${redis.timeout}" /> 
      property name="database" value="${redis.default.db}">/property> 
      constructor-arg index="0" ref="jedisPoolConfig" /> 
     /bean>
     
     bean id="redisTemplate" 
      class="org.springframework.data.redis.core.StringRedisTemplate" 
      p:connectionFactory-ref="jedisConnectionFactory" 
     > 
     /bean>
      
     bean id="redisBase" abstract="true"> 
      property name="template" ref="redisTemplate"/> 
     /bean> 
     
     context:component-scan base-package="com.school.redisclient" />
     
    /beans>
    
    

    3. Redis类

    新建一个com.school.redisclient包,结构如下:

    接口IRedisService:

    public interface IRedisServiceK, V> {  
     public void set(K key, V value, long expiredTime); 
     public V get(K key);
     public Object getHash(K key, String name);
     public void del(K key);   
    } 
    
    

    抽象类AbstractRedisService,主要是对RedisTemplate进行操作:

    public abstract class AbstractRedisServiceK, V> implements IRedisServiceK, V> { 
      @Autowired 
      private RedisTemplateK, V> redisTemplate; 
      
      public RedisTemplateK, V> getRedisTemplate() { 
       return redisTemplate; 
      }   
      public void setRedisTemplate(RedisTemplateK, V> redisTemplate) { 
       this.redisTemplate = redisTemplate; 
      }   
      @Override 
      public void set(final K key, final V value, final long expiredTime) { 
       BoundValueOperationsK, V> valueOper = redisTemplate.boundValueOps(key); 
       if (expiredTime = 0) { 
        valueOper.set(value); 
       } else { 
        valueOper.set(value, expiredTime, TimeUnit.MILLISECONDS); 
       } 
      } 
      @Override 
      public V get(final K key) { 
       BoundValueOperationsK, V> valueOper = redisTemplate.boundValueOps(key); 
       return valueOper.get(); 
      } 
      @Override 
      public Object getHash(K key, String name){
       Object res = redisTemplate.boundHashOps(key).get(name);
       return res;
      }  
      @Override 
      public void del(K key) { 
       if (redisTemplate.hasKey(key)) { 
        redisTemplate.delete(key); 
       } 
      } 
      
     } 
    
    

    实现类RedisService:

    @Service("redisService") 
    public class RedisService extends AbstractRedisServiceString, String> { 
     
    }

    工具类RedisTool:

    public class RedisTool { 
     private static ApplicationContext factory;
     private static RedisService redisService;
     
     public static ApplicationContext getFactory(){
      if (factory == null){
       factory = new ClassPathXmlApplicationContext("classpath:redis.xml");
      }
      return factory;
     } 
     public static RedisService getRedisService(){
      if (redisService == null){
       redisService = (RedisService) getFactory().getBean("redisService");
      }  
      return redisService;
     }
    
    }
    

    4. 查询功能的实现

    新建一个Action:RClasQueryAction,返回Redis里面所有的课程数据。

    @SuppressWarnings("serial")
    public class RClasQueryAction extends ActionSupport {
      RedisService rs = RedisTool.getRedisService();
     ListClas> claslist = new ArrayListClas>();
     Clas c;
     public String execute(){
      if (rs != null){
       System.out.println("RedisService : " + rs);
       getAllClas();
      }
      ServletActionContext.getRequest().setAttribute("claslist", claslist);
      return SUCCESS;
     }
     private void getAllClas(){
      claslist = new ArrayListClas>();  
      int num = Integer.parseInt(rs.get("clas:count"));
      for (int i=0; inum; i++){
       String cid = "clas:" + (i+1);
       c = new Clas();
       int id = Integer.parseInt(String.valueOf(rs.getHash(cid, "ID")));
       c.setId(id);
       System.out.println("ID:" + id);
       String name = (String) rs.getHash(cid, "NAME");
       c.setName(name);
       System.out.println("NAME:" + name);
       String comment = (String) rs.getHash(cid, "COMMENT");
       c.setComment(comment);
       System.out.println("COMMENT:" + comment);
       claslist.add(c);
      }
     }
    
    }
    

    Struts的设置和jsp文件就不详细讲了。

    5. Redis数据库

    Redis数据库里面的内容(使用的是Redis Desktop Manager):

    最后是运行结果:

    当然,这只是实现了从Redis查询数据,还没有实现将Redis作为MySQL的缓存。

    5. 添加功能的实现

    新建一个Action:RClasAction,实现向Redis添加课程数据,并同步到MySQL。

    package com.school.action;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import org.springframework.beans.factory.annotation.Autowired;
    import com.opensymphony.xwork2.ActionSupport;
    import com.school.entity.Clas;
    import com.school.redisclient.RedisService;
    import com.school.redisclient.RedisTool;
    import com.school.service.ClasService;
    @SuppressWarnings("serial")
    public class RClasAction extends ActionSupport { 
     @Autowired
     private ClasService clasService; 
     RedisService rs = RedisTool.getRedisService();
     ListClas> claslist = new ArrayListClas>(); 
     private Clas clas;
     public Clas getClas() {
      return clas;
     } 
     public void setClas(Clas Clas) {
      this.clas = Clas;
     } 
     public String execute(){
      saveClas(clas);
      return SUCCESS;
     } 
     @SuppressWarnings({ "rawtypes", "unchecked" })
     private void saveClas(Clas c){
      ListString> ids = rs.getList("clas:id");
      // clas:id
      int num = ids.size();
      int id = Integer.parseInt(ids.get(num-1)) + 1;
      rs.rightPushList("clas:id", String.valueOf(id));
      // clas:count
      int count = Integer.parseInt(rs.get("clas:count"));
      rs.set("clas:count", String.valueOf(count+1), -1);
      // 增加
      HashMap hashmap = new HashMap();
      hashmap.put("ID", String.valueOf(id));
      hashmap.put("NAME", clas.getName());
      hashmap.put("COMMENT", clas.getComment());
      rs.addHash("clas:" + id, hashmap);
      // 同步到MySQL
      clasService.saveClas(clas);
     }
    }

    clas:id是一个List类型的Key-Value,记录了所有的课程ID,取出最后一个ID,再+1,作为增加的课程的ID,同时clas:count的值也要+1。使用addHash()方法向Redis添加了一个Hash类型的Key-Value(也就是一门课程):

      @SuppressWarnings({ "unchecked", "rawtypes" })
      public synchronized void addHash(K key, HashMap map){
       redisTemplate.opsForHash().putAll(key, map);
      }

    同时将该门课程增加到MySQL。

    6. 删除功能的实现

    新建一个Action:RClasDeleteAction,实现删除Redis的课程数据,并同步到MySQL。

    package com.school.action;
    import org.springframework.beans.factory.annotation.Autowired;
    import com.opensymphony.xwork2.ActionSupport;
    import com.school.redisclient.RedisService;
    import com.school.redisclient.RedisTool;
    import com.school.service.ClasService;
    @SuppressWarnings("serial")
    public class RClasDeleteAction extends ActionSupport { 
     @Autowired
     private ClasService clasService; 
     RedisService rs = RedisTool.getRedisService() 
     private int id;
     public int getId(){
      return id;
     }
     public void setId(int id){
      this.id=id;
     } 
     public String execute(){ 
      deleteClas(id);
      // 同步到MySQL
      clasService.deleteClas(id);
      return SUCCESS;
     }
     private void deleteClas(int id){
      // 删除
      rs.del("clas:" + id);
      // clas:count
      int count = Integer.parseInt(rs.get("clas:count"));
      rs.set("clas:count", String.valueOf(count-1), -1);
      // clas:id
      rs.delListItem("clas:id", String.valueOf(id));
     }
    }

    直接删除clas:id,再将clas:count的值-1,这两步比较简单,复杂的是从clas:id中删除该课程的ID,使用了delListItem()方法来实现:

      @Override
      public synchronized void delListItem(K key, V value){
       redisTemplate.opsForList().remove(key, 1, value);
      }

    redisTemplate.opsForList().remove()方法类似于LREM命令。最后在MySQL中也删除相同的课程。

    7. 修改功能的实现

    新建一个Action:RClasUpdateAction,实现删除Redis的课程数据,并同步到MySQL。

    package com.school.action;
    
    import java.util.HashMap;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.opensymphony.xwork2.ActionSupport;
    import com.school.entity.Clas;
    import com.school.redisclient.RedisService;
    import com.school.redisclient.RedisTool;
    import com.school.service.ClasService;
    
    @SuppressWarnings("serial")
    public class RClasUpdateAction extends ActionSupport{ 
     @Autowired
     private ClasService clasService; 
     RedisService rs = RedisTool.getRedisService(); 
     private Clas clas;
     public Clas getClas() {
      return clas;
     }
     public void setClas(Clas clas) {
      this.clas = clas;
     }
      @SuppressWarnings({ "unchecked", "rawtypes" })
     public String execute(){
      HashMap hashmap = new HashMap();
      hashmap.put("ID", String.valueOf(clas.getId()));
      hashmap.put("NAME", clas.getName());
      hashmap.put("COMMENT", clas.getComment());
      rs.putHash("clas:" + clas.getId(), hashmap);
      // 同步到MySQL
      clasService.updateClas(clas);
      return SUCCESS;
     }
    
    }
    

    使用了putHash()方法来更新:

      @SuppressWarnings({ "rawtypes", "unchecked" })
      @Override
      public synchronized void putHash(K key, HashMap map){
       redisTemplate.boundHashOps(key).putAll(map);
      }

     同时在MySQL做相同的更新操作。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • JSP 开发SSH整合异常解决办法
    • MyEclipse整合ssh三大框架环境搭载用户注册源码下载
    • SSH框架网上商城项目第7战之整合Struts2和Json
    • SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2
    • SSH+Jquery+Ajax框架整合
    • SSH整合中 hibernate托管给Spring得到SessionFactory
    • 详解JAVAEE——SSH三大框架整合(spring+struts2+hibernate)
    上一篇:详谈redis优化配置和redis.conf说明(推荐)
    下一篇:浅谈redis的maxmemory设置以及淘汰策略
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    详解SSH框架和Redis的整合 详解,SSH,框架,和,Redis,的,