您的位置:金沙游乐场85155 > 大数据库 > 在ssm项目中使用redis缓存查询数据的方法

在ssm项目中使用redis缓存查询数据的方法

发布时间:2020-05-05 15:50编辑:大数据库浏览(57)

    在项目中常常需要后台程序的持久层查询数据库来获取数据,然后将数据交给服务层、控制层,最后才交给视图层。如果数据访问缓慢,就会影响程序的运行。

    1.前言

    本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例。
    使用技术:SpringBoot、mybatis、shiro、thymeleaf、pagehelper、Mapper插件、druid、dataTables、ztree、jQuery
    开发工具:intellij idea
    数据库:mysql、redis
    基本上是基于使用SpringSecurity的demo上修改而成,地址 http://blog.csdn.net/poorcoder_/article/details/70231779

    为了加快程序的运行,可以将数据放入缓存中,包括数据缓存和页面缓存。

    2.表结构

    还是是用标准的5张表来展现权限。如下图:图片 1
    分别为用户表,角色表,资源表,用户角色表,角色资源表。在这个demo中使用了mybatis-generator自动生成代码。运行mybatis-generator:generate -e 根据数据库中的表,生成 相应的model,mapper单表的增删改查。不过如果是导入本项目的就别运行这个命令了。新增表的话,也要修改mybatis-generator-config.xml中的tableName,指定表名再运行。

    所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。

    3.maven配置

    <?xml version="1.0" encoding="UTF-8"?>
    <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>com.study</groupId>
        <artifactId>springboot-shiro</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>springboot-shiro</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>        <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.2.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>        <java.version>1.8</java.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-thymeleaf</artifactId>        </dependency>        <dependency>            <groupId>com.github.pagehelper</groupId>            <artifactId>pagehelper-spring-boot-starter</artifactId>            <version>1.1.0</version>        </dependency>        <dependency>            <groupId>tk.mybatis</groupId>            <artifactId>mapper-spring-boot-starter</artifactId>            <version>1.1.1</version>        </dependency>        <dependency>            <groupId>org.apache.shiro</groupId>            <artifactId>shiro-spring</artifactId>            <version>1.3.2</version>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>druid</artifactId>            <version>1.0.29</version>        </dependency>        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>        </dependency>        <dependency>            <groupId>net.sourceforge.nekohtml</groupId>            <artifactId>nekohtml</artifactId>            <version>1.9.22</version>        </dependency>        <dependency>            <groupId>com.github.theborakompanioni</groupId>            <artifactId>thymeleaf-extras-shiro</artifactId>            <version>1.2.1</version>        </dependency>        <dependency>            <groupId>org.crazycake</groupId>            <artifactId>shiro-redis</artifactId>            <version>2.4.2.1-RELEASE</version>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>            <plugin>                <groupId>org.mybatis.generator</groupId>                <artifactId>mybatis-generator-maven-plugin</artifactId>                <version>1.3.5</version>                <configuration>                    <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>                    <overwrite>true</overwrite>                    <verbose>true</verbose>                </configuration>                <dependencies>                    <dependency>                        <groupId>mysql</groupId>                        <artifactId>mysql-connector-java</artifactId>                        <version>${mysql.version}</version>                    </dependency>                    <dependency>                        <groupId>tk.mybatis</groupId>                        <artifactId>mapper</artifactId>                        <version>3.4.0</version>                    </dependency>                </dependencies>            </plugin>        </plugins>    </build></project>
    

    其中页面缓存主要是oscache,可以整页或者指定网页某一部分缓存,同时指定他的过期时间,这样在此时间段里面访问的数据都是一样的 。

    4.配置Druid

    package com.study.config;
    
    import com.alibaba.druid.support.http.StatViewServlet;
    import com.alibaba.druid.support.http.WebStatFilter;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    
    /**
     * Created by yangqj on 2017/4/19.
     */
    @Configuration
    public class DruidConfig {
        @Bean
        public ServletRegistrationBean druidServlet() {
    
            ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
            //登录查看信息的账号密码.
    
            servletRegistrationBean.addInitParameter("loginUsername","admin");
            servletRegistrationBean.addInitParameter("loginPassword","123456");
            return servletRegistrationBean;
        }
        @Bean
        public FilterRegistrationBean filterRegistrationBean() {
            FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
            filterRegistrationBean.setFilter(new WebStatFilter;
            filterRegistrationBean.addUrlPatterns("/*");
            filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
            return filterRegistrationBean;
        }
    }
    

    在application.properties中加入:

    # 数据源基础配置
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/shiro
    spring.datasource.username=root
    spring.datasource.password=root
    # 连接池配置
    # 初始化大小,最小,最大
    spring.datasource.initialSize=1
    spring.datasource.minIdle=1
    spring.datasource.maxActive=20
    

    配置好后,运行项目访问http://localhost:8080/druid/ 输入配置的账号密码admin,123456进入:图片 2

    数据缓存则比较多,有著名的ehcache,redis,memcached等。

    5.配置mybatis

    使用springboot 整合mybatis非常方便,只需在application.properties

    mybatis.type-aliases-package=com.study.model
    mybatis.mapper-locations=classpath:mapper/*.xml
    mapper.mappers=com.study.util.MyMapper
    mapper.not-empty=false
    mapper.identity=MYSQL
    pagehelper.helperDialect=mysql
    pagehelper.reasonable=true
    pagehelper.supportMethodsArguments=true
    
    pagehelper.params=count=countSql
    

    将相应的路径改成项目包所在的路径即可。配置文件中可以看出来还加入了pagehelper 和Mapper插件。如果不需要,把上面配置文件中的 pagehelper删除。

    本文主要简单的使用Java代码进行redis缓存,即在查询的时候先在service层从redis缓存中获取数据。如果不存在,则再经过dao层从数据库中获取,最后将查询到的数据缓存到redis中;如果存在,直接从redis缓存中读取,并交给controller层。

    MyMapper:
    package com.study.util;
    
    /**
     * Created by yangqj on 2017/4/20.
     */
    import tk.mybatis.mapper.common.Mapper;
    import tk.mybatis.mapper.common.MySqlMapper;
    public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
    }
    

    对于Springboot整合mybatis可以参考https://github.com/abel533/MyBatis-Spring-Boot

    xml配置:

    6.thymeleaf配置

    thymeleaf是springboot官方推荐的,所以来试一下。
    首先加入配置:

    #spring.thymeleaf.prefix=classpath:/templates/
    #spring.thymeleaf.suffix=.html
    #spring.thymeleaf.mode=HTML5
    #spring.thymeleaf.encoding=UTF-8
    # ;charset=<encoding> is added
    #spring.thymeleaf.content-type=text/html
    # set to false for hot refresh
    spring.thymeleaf.cache=false
    spring.thymeleaf.mode=LEGACYHTML5
    

    可以看到其实上面都是注释了的,因为springboot会根据约定俗成的方式帮我们配置好。所以上面注释部分是springboot自动配置的,如果需要自定义配置,只需要修改上注释部分即可。
    后两行没有注释的部分,spring.thymeleaf.cache=false表示关闭缓存,这样修改文件后不需要重新启动,缓存默认是开启的,所以指定为false。但是在intellij idea中还需要按Ctrl + Shift + F9.
    对于spring.thymeleaf.mode=LEGACYHTML5。thymeleaf对html中的语法要求非常严格,像我从网上找的模板,使用thymeleaf后报一堆的语法错误,后来没办法,使用弱语法校验,所以加入配置spring.thymeleaf.mode=LEGACYHTML5。加入这个配置后还需要在maven中加入

    <dependency>
        <groupId>net.sourceforge.nekohtml</groupId>
        <artifactId>nekohtml</artifactId>
        <version>1.9.22</version>
    </dependency>
    

    否则会报错的。
    在前端页面的头部加入一下配置后,就可以使用thymeleaf了

    <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" />
    

    不过这个项目因为使用了datatables都是使用jquery 的ajax来访问数据与处理数据,所以用到的thymeleaf语法非常少,基本上可以参考的就是js即css的导入和类似于jsp的include功能的部分页面引入。
    对于静态文件的引入:

     <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" />
    

    而文件在项目中的位置是static-css-bootstrap.min.css。为什么这样可以访问到该文件,也是因为springboot对于静态文件会自动查找/static public、/resources、/META-INF/resources下的文件。所以不需要加static.

    页面引入:
    局部页面如下:

    <div  th:fragment="top">    ...</div>
    

    主体页面映入方式:

    <div th:include="common/top :: top"></div>
    

    inclide=”文件路径::局部代码片段名称”

    bean  property name="maxTotal" value="${redis.maxTotal}"/property property name="maxIdle" value="${redis.maxIdle}"/property property name="testOnBorrow" value="${redis.testOnBorrow}"/property property name="maxWaitMillis" value="${redis.maxWaitMillis}"/property /bean !-- jedis客户端单机版 -- bean  constructor-arg name="poolConfig" ref="poolConfig"/constructor-arg constructor-arg name="host" value="${redis.hostName}"/constructor-arg constructor-arg name="port" value="${redis.port}"/constructor-arg /bean !-- jedis集群版配置 -- bean  constructor-arg name="poolConfig" ref="poolConfig"/constructor-arg constructor-arg name="nodes" set bean  constructor-arg name="host" value="127.0.0.1"/constructor-arg constructor-arg name="port" value="7001"/constructor-arg /bean bean  constructor-arg name="host" value="127.0.0.1"/constructor-arg constructor-arg name="port" value="7002"/constructor-arg /bean bean  constructor-arg name="host" value="127.0.0.1"/constructor-arg constructor-arg name="port" value="7003"/constructor-arg /bean bean  constructor-arg name="host" value="127.0.0.1"/constructor-arg constructor-arg name="port" value="7004"/constructor-arg /bean bean  constructor-arg name="host" value="127.0.0.1"/constructor-arg constructor-arg name="port" value="7005"/constructor-arg /bean /set /constructor-arg /bean [java] view plain copyjava调用 //service层查询时代码 @Autowired private JedisClient jedisClient; @Override public ListUser list() { // TODO Auto-generated method stub try { String json = jedisClient.hget("user", "list"); if (StringUtils.isNotBlank(json)) { ListUser users = JsonUtils.jsonToList(json, User.class); return users; } } catch (Exception e) { e.printStackTrace(); } //使用持久层查询数据库 ListUser list = userMapper.list(); try { jedisClient.hset("user", "list", JsonUtils.objectToJson(list)); } catch (Exception e) { e.printStackTrace(); } return list; } 
    

    7.shiro配置

    本文由金沙游乐场85155发布于大数据库,转载请注明出处:在ssm项目中使用redis缓存查询数据的方法

    关键词: