SSM+Redis的小demo

来源:互联网 发布:网络飞机票怎么取登机 编辑:程序博客网 时间:2024/06/12 20:52

准备ssm工程
准备好redis服务器
构建pom.xml文件,这个pom文件基本和SSM的基本一样,知识增加了几个依赖。
pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>SsmRedisDemo</groupId>    <artifactId>SsmRedisDemo</artifactId>    <version>0.0.1-SNAPSHOT</version>    <packaging>war</packaging>    <name />    <description />    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    </properties>    <dependencies>        <dependency>            <groupId>org.apache.openejb</groupId>            <artifactId>javaee-api</artifactId>            <version>5.0-1</version>            <scope>provided</scope>        </dependency>        <dependency>            <groupId>javax.servlet</groupId>            <artifactId>jstl</artifactId>            <version>1.2</version>            <scope>provided</scope>        </dependency>        <dependency>            <groupId>javax.servlet</groupId>            <artifactId>javax.servlet-api</artifactId>            <version>3.1.0</version>            <scope>provided</scope>        </dependency>        <dependency>            <groupId>javax.servlet.jsp</groupId>            <artifactId>jsp-api</artifactId>            <version>2.1</version>            <scope>provided</scope>        </dependency>        <!-- mybatis和spring相关 -->        <dependency>            <groupId>org.mybatis</groupId>            <artifactId>mybatis</artifactId>            <version>3.3.0</version>        </dependency>        <dependency>            <groupId>org.mybatis</groupId>            <artifactId>mybatis-spring</artifactId>            <version>1.2.3</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>3.2.4.RELEASE</version>            <type>jar</type>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-core</artifactId>            <version>3.2.4.RELEASE</version>            <type>jar</type>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-beans</artifactId>            <version>3.2.4.RELEASE</version>            <type>jar</type>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-webmvc</artifactId>            <version>3.2.4.RELEASE</version>            <type>jar</type>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-orm</artifactId>            <version>3.2.4.RELEASE</version>            <type>jar</type>        </dependency>        <dependency>            <groupId>org.codehaus.jackson</groupId>            <artifactId>jackson-mapper-asl</artifactId>            <version>1.9.13</version>        </dependency>        <!-- 数据库连接池包 -->        <dependency>            <groupId>com.mchange</groupId>            <artifactId>c3p0</artifactId>            <version>0.9.5-pre8</version>        </dependency>        <!-- log4j日志框架 -->        <dependency>            <groupId>org.apache.directory.studio</groupId>            <artifactId>org.apache.logging.log4j</artifactId>            <version>1.2.16</version>        </dependency>        <!-- sqlserver的连接驱动 -->        <dependency>            <groupId>com.microsoft.sqlserver</groupId>            <artifactId>sqljdbc4</artifactId>            <version>4.0</version>        </dependency>        <!--Redis start -->        <dependency>            <groupId>org.springframework.data</groupId>            <artifactId>spring-data-redis</artifactId>            <version>1.6.1.RELEASE</version>        </dependency>        <dependency>            <groupId>redis.clients</groupId>            <artifactId>jedis</artifactId>            <version>2.7.3</version>        </dependency>        <!--Redis end -->        <dependency>            <groupId>commons-codec</groupId>            <artifactId>commons-codec</artifactId>            <version>1.8</version>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <artifactId>maven-war-plugin</artifactId>            </plugin>            <plugin>                <artifactId>maven-compiler-plugin</artifactId>                <configuration>                    <source>1.7</source>                    <target>1.7</target>                </configuration>            </plugin>        </plugins>    </build></project>

编写两个工具类(RedisUtil.java和SerializeUtil.java)和一个缓存类(RedisCache.java)
RedisUtil.java

public class RedisUtil {    // Redis服务器IP    private static String ADDR = "192.168.0.19";    // Redis的端口号    private static int PORT = 6379;    // 访问密码    // private static String AUTH = "admin";    // 可用连接实例的最大数目,默认值为8;    // 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。    private static int MAX_ACTIVE = 1024;    // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。    private static int MAX_IDLE = 200;    // 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;    private static int MAX_WAIT = 10000;    private static int TIMEOUT = 10000;    // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;    private static boolean TEST_ON_BORROW = true;    private static JedisPool jedisPool = null;    /**     * 初始化Redis连接池     */    static {        try {            JedisPoolConfig config = new JedisPoolConfig();            config.setMaxIdle(MAX_ACTIVE);            config.setMaxTotal(MAX_ACTIVE);            config.setMaxIdle(MAX_IDLE);            config.setMaxWaitMillis(MAX_WAIT);            config.setTestOnBorrow(TEST_ON_BORROW);            jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT);        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 获取Jedis实例     *      * @return     */    public synchronized static Jedis getJedis() {        try {            if (jedisPool != null) {                Jedis resource = jedisPool.getResource();                return resource;            } else {                return null;            }        } catch (Exception e) {            e.printStackTrace();            return null;        }    }    /**     * 释放jedis资源     *      * @param jedis     */    public static void returnResource(final Jedis jedis) {        if (jedis != null) {            jedisPool.returnResource(jedis);        }    }}

SerializeUtil.java

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;    }}

RedisCache.java

/* * 使用第三方缓存服务器,处理二级缓存 */public class RedisCache implements Cache {    private static Logger logger = LoggerFactory.getLogger(RedisCache.class);    /** The ReadWriteLock. */    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();    private String id;    private final String COMMON_CACHE_KEY = "COM:";    /**     * 按照一定规则标识key     */    private String getKey(Object key) {        StringBuilder accum = new StringBuilder();        accum.append(COMMON_CACHE_KEY);        accum.append(this.id).append(":");        accum.append(DigestUtils.md5Hex(String.valueOf(key)));        return accum.toString();    }    /**     * redis key规则前缀     */    private String getKeys() {        return COMMON_CACHE_KEY + this.id + ":*";    }    public RedisCache() {    }    public RedisCache(final String id) {        if (id == null) {            throw new IllegalArgumentException("必须传入ID");        }        logger.debug(">>>>>>>>>>>>>>>>>>>>>MybatisRedisCache:id=" + id);        this.id = id;    }    public String getId() {        return this.id;    }    public int getSize() {         return Integer.valueOf(RedisUtil.getJedis().dbSize().toString());    }    public void putObject(Object key, Object value) {         logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:"+key+"="+value);         RedisUtil.getJedis().set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value));    }    public Object getObject(Object key) {         Object value = SerializeUtil.unserialize(RedisUtil.getJedis().get(SerializeUtil.serialize(key.toString())));            logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:"+key+"="+value);            return value;    }    public Object removeObject(Object key) {        return RedisUtil.getJedis().expire(SerializeUtil.serialize(key.toString()),0);    }    public void clear() {         RedisUtil.getJedis().flushDB();    }    public ReadWriteLock getReadWriteLock() {        return readWriteLock;    }}

实体映射文件配置:
<cache type="com.immense.tw.util.RedisCache"></cache>
这个很关键

在spring-base.xml中配置redis

<!-- redis 配置 -->    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"></bean>    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"                         p:host-name="${redis.host}"                         p:port="${redis.port}"                         p:pool-config-ref="poolConfig"/>     <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">          <property name="connectionFactory"   ref="connectionFactory" />      </bean>

开启mybatis对缓存的支持

<!-- 加载mybatis配置文件 -->    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <property name="configLocation" value="classpath:mybatis.xml"></property>        <property name="dataSource" ref="comboPooledDataSourceID"></property>        <!-- 开启缓存支持 -->         <property name="configurationProperties">            <props>                <prop key="cacheEnabled">true</prop>                <!-- 查询时,关闭关联对象即时加载以提高性能 -->                <prop key="lazyLoadingEnabled">false</prop>                <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指定),不会加载关联表的所有字段,以提高性能 -->                <prop key="aggressiveLazyLoading">true</prop>                <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->                <prop key="multipleResultSetsEnabled">true</prop>                <!-- 允许使用列标签代替列名 -->                <prop key="useColumnLabel">true</prop>                <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->                <prop key="useGeneratedKeys">true</prop>                <!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->                <prop key="autoMappingBehavior">FULL</prop>                <!-- 对于批量更新操作缓存SQL以提高性能 -->                <prop key="defaultExecutorType">BATCH</prop>                <!-- 数据库超过25000秒仍未响应则超时 -->                <prop key="defaultStatementTimeout">25000</prop>            </props>        </property>    </bean>

其中

<prop key="cacheEnabled">true</prop>

最关键

然后就可以在自己写的测试类或者controller中做测试了
测试类:

@Test    public void getAll(){        ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");        StudentService studentService =  (StudentService) ac.getBean("studentService");        List<Student> students = studentService.getAll();        for (Student student : students) {            System.out.println(student);        }    }

需要注意的是在实体编写的时候需要实现Serializeable接口,否则会报错
下载源码

原创粉丝点击