• SSM整合redis


    准备工作:

    jedis连接

         添加jar支持:

        <!-- redis依赖 -->
    
    <dependency>  
    
       <groupId>org.springframework.data</groupId>  
    
       <artifactId>spring-data-redis</artifactId>  
    
       <version>1.6.0.RELEASE</version>  
    
    </dependency>  
    
    <dependency>  
    
       <groupId>redis.clients</groupId>  
    
       <artifactId>jedis</artifactId>  
    
       <version>2.7.3</version>  
    
    </dependency>

         如果redis服务想被外部链接访问,需要修改redis.conf配置 (69行)

                 69 上面bind 相应本机的IP  

                 136 行 daemonize yes

    启动服务:     

     ./bin/redis-server bin/redis.conf

    命令测试:

    ./bin/redis-cli -h 192.168.182.20

          编码测试:

            Jedis jedis=new Jedis("192.168.23.111",6379);

             //jedis.ping();

            JedisPool jedisPool=new JedisPool("192.168.23.111",6379);

            Jedis resource = jedisPool.getResource();

      单机版

    1,在web.xml里面添加

    配置多个spring配置文件的路径

    2,添加spring-redis.xml

    <!-- 开启扫描 -->
        <context:component-scan base-package="com.duguangming.util"></context:component-scan>
        <!-- 初始化Jedis连接池-->
        <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
            <!--最大连接数, 默认8个-->
            <property name="maxTotal" value="50" />
            <!--最大空闲连接数, 默认8-->
            <property name="maxIdle" value="10" />
            <!--连接时的最大等待毫秒数-->
            <property name="maxWaitMillis" value="1000" />
            <!--获得一个jedis实例的时候是否检查连接可用性-->
            <property name="testOnBorrow" value="true" />
        </bean>
        <!-- 把jedisPool交给spring管理 -->
        <bean   class="redis.clients.jedis.JedisPool" >
            <constructor-arg name="poolConfig" ref="poolConfig"></constructor-arg>
            <constructor-arg name="host" value="192.168.239.20"></constructor-arg>
            <constructor-arg name="port" value="6379"></constructor-arg>
        </bean>

    3,编写JedisUtil及实现类,序列化工具

    public interface JedisUtil {
        /**
         * 放入缓存
         * @param key
         * @param value
         */
        void putObject(Object key, Object value);
        /**
         * 清除缓存
         * @param arg0
         * @return
         */
        Object removeObject(Object arg0);
        /**
         * 从缓存中获取
         * @param arg0
         * @return
         */
        Object getObject(Object arg0);
    }
    @Component
    public class JedisUtilImpl implements  JedisUtil{
    
      
        @Autowired
        private JedisPool jedisPool;
    
       //放入缓存
        public void putObject(Object key, Object value) {
            // TODO Auto-generated method stub
            Jedis resource = jedisPool.getResource();
            resource.set(SerializeUtil.serialize(key.toString()),
                    SerializeUtil.serialize(value));
            resource.close();
        }
       //清楚缓存
        public Object removeObject(Object arg0) {
            // TODO Auto-generated method stub
            Jedis resource = jedisPool.getResource();
            Object expire = resource.expire(
                    SerializeUtil.serialize(arg0.toString()), 0);
            resource.close();
            return expire;
        }
        //从缓存中取
        public Object getObject(Object arg0) {
            // TODO Auto-generated method stub
            Jedis resource = jedisPool.getResource();
            Object value = SerializeUtil.unserialize(resource.get(
                    SerializeUtil.serialize(arg0.toString())));
            resource.close();
            return value;
        }
    }

    序列化工具:

    public class SerializeUtil {
    
        public static byte[] serialize(Object object) {
            ObjectOutputStream oos = null;
            ByteArrayOutputStream baos = null;
            try {
                // 序列化
                baos = new ByteArrayOutputStream();
                oos = new ObjectOutputStream(baos);
                oos.writeObject(object);
                byte[] bytes = baos.toByteArray();
                return bytes;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static Object unserialize(byte[] bytes) {
            if (bytes == null)
                return null;
            ByteArrayInputStream bais = null;
            try {
                // 反序列化
                bais = new ByteArrayInputStream(bytes);
                ObjectInputStream ois = new ObjectInputStream(bais);
                return ois.readObject();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    4,在服务层注入接口测试缓存功能

     service层实现类具体代码:

    public List<Class> listAll() {
            List<Class> classListByParam = null;
            //从缓存中获取班级列表
            Object classList = jedisUtil.getObject("ddd");
            //判断缓存中是否存在
            if(classList!=null){//不空,强转返回
                System.out.println("redis缓存中存在,直接返回");
                classListByParam= (List<Class>)SerializeUtil.unserialize((byte[])classList);
            }else{
                System.out.println("redis缓存中不存在,从数据库中取出,并且放入缓存");
                //查询数据库,取出
                classListByParam = classDAO.listAll();
                //放入redis缓存
                jedisUtil.putObject("ddd", SerializeUtil.serialize(classListByParam));
            }
            return classListByParam;
    
        }

       redis集群版(实体类需要实现序列化接口)

     注意:在项目中使用集群(  要求jedis2.8以上版本,更换pom版本)

    ssm项目中,spring-redis-cluster.xml主配置文件的配置

    <!--扫描包-->
        <context:component-scan base-package="com.duguangming.util"></context:component-scan>
        <bean class="redis.clients.jedis.JedisCluster">
           <constructor-arg name="nodes">
               <set>
                   <!--配置集群任意一台节点就可以-->
                   <bean class="redis.clients.jedis.HostAndPort">
                       <constructor-arg name="host" value="192.168.239.20"/>
                       <constructor-arg name="port" value="7001"/>
                   </bean>
                   <bean class="redis.clients.jedis.HostAndPort">
                       <constructor-arg name="host" value="192.168.239.20"/>
                       <constructor-arg name="port" value="7002"/>
                   </bean>
                   <bean class="redis.clients.jedis.HostAndPort">
                       <constructor-arg name="host" value="192.168.239.20"/>
                       <constructor-arg name="port" value="7003"/>
                   </bean>
                   <bean class="redis.clients.jedis.HostAndPort">
                       <constructor-arg name="host" value="192.168.239.21"/>
                       <constructor-arg name="port" value="7004"/>
                   </bean>
                   <bean class="redis.clients.jedis.HostAndPort">
                       <constructor-arg name="host" value="192.168.239.21"/>
                       <constructor-arg name="port" value="7005"/>
                   </bean>
                   <bean class="redis.clients.jedis.HostAndPort">
                       <constructor-arg name="host" value="192.168.239.21"/>
                       <constructor-arg name="port" value="7006"/>
                   </bean>
               </set>
           </constructor-arg>
        </bean>
    </beans>

    ssm项目中,web.xml的路径配置

    ssm项目中,JedisUtilImpl实现类的

    @Component
    public class JedisUtilImpl implements  JedisUtil{
        @Autowired
        private JedisCluster jedisCluster;
    
    
        public void putObject(Object key, Object value) {
            jedisCluster.set(SerializeUtil.serialize(key),SerializeUtil.serialize(value));
          
        }
    
    
        public Object removeObject(Object arg0) {
            return jedisCluster.expire(SerializeUtil.serialize(arg0),1);
        }
    
    
        public Object getObject(Object arg0) {
            byte[] bytes = jedisCluster.get(SerializeUtil.serialize(arg0));
            return SerializeUtil.unserialize(bytes);
        }
    }
  • 相关阅读:
    6.VUE事件处理
    springmvc在使用@ModelAttribute注解获取Request和Response会产生线程并发不安全问题
    IDEAhttp://lookdiv.com/index/index/indexcodeindex.html
    不四舍五入保留...4(round(273.86015,4,1);)
    spring security中@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter四者的区别
    @RepeatSubmit spring boot 防止重复提交
    权限设计的杂谈
    vue设置全局样式变量 less
    坐标轴刻度取值算法-基于魔数数组-源于echarts的y轴刻度计算需求
    less使用
  • 原文地址:https://www.cnblogs.com/duguangming/p/11140882.html
Copyright © 2020-2023  润新知