SSM集成Redis的小案例

2023-11-07

一、详情介绍

  这里是使用Window版本的Redis,将下载好的Windows版本的Redis压缩包解压到一个目录下,客户端使用的是Redis Desktop Manager,使用Redis需要启动相应的服务,操作如下图所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

备注:双击打开方框中的服务会弹出redis-server窗口,redis-server的窗口不要关闭,关闭redis-server的窗口,则表示终止redis的服务。
SSM整合的文件及其他的配置文件和pom.xml文件的jar包,参考的连接Spring+SpringMvc+MyBatis整合案例(基于xml配置文件的方式)
将上述链接的配置文件复制过来时,需要修改database.propertise文件中数据库的名称

二、数据库文件
CREATE DATABASE /*!32312 IF NOT EXISTS*/`tour` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `tour`;

DROP TABLE IF EXISTS `category`;

CREATE TABLE `category` (
  `id` int(4) NOT NULL AUTO_INCREMENT COMMENT '分类编号',
  `categoryName` varchar(20) DEFAULT NULL COMMENT '分类名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

insert  into `category`(`id`,`categoryName`) values (1,'博客'),(2,'课程'),(3,'开发者商城'),(4,'问答'),(5,'社区'),(6,'插件'),(7,'认证');
三、SSM项目中的pom文件导入spring-data-redis和jedis依赖的jar包(pom.xml)
  <!-- 依赖管理 -->
  <dependencies>
    <!-- spring-data-redis依赖 -->
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>2.1.8.RELEASE</version>
    </dependency>
    <!-- jedis -->
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.10.2</version>
    </dependency>
  </dependencies>
四、redis的基本配置(redis.properties)
redis.host=127.0.0.1
redis.port=6379
redis.maxIdle=300
redis.maxWaitMillis=3000
redis.maxTotal=600
redis.testOnBorrow=false
redis.testOnReturn=true
五、spring整合redis的配置文件(spring-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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置整合redis过程 -->

    <!-- 1.配置数据库相关参数properties的属性:${url} -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:properties/redis.properties</value>
            </list>
        </property>
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
    </bean>

    <!-- 2.配置数据连接池 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!--最大连接数-->
        <property name="maxTotal" value="${redis.maxTotal}"/>
        <!--最大空闲数-->
        <property name="maxIdle" value="${redis.maxIdle}"/>
        <!--连接时的最大等待毫秒数-->
        <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>
        <!--在提取一个jedis实例时,是否提前进行验证操作;如果为true,则得到的jedis实例均是
        可用的-->
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
    </bean>

    <!-- 3.连接redis工厂 -->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
          p:host-name="${redis.host}" p:port="${redis.port}" p:pool-config-ref="poolConfig"/>

    <!-- 4.配置redisTemplate对象 -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
    </bean>
</beans>
六、spring-dao.xml文件中引入spring-redis.xml(spring-dao.xml)
<!-- 导入sping-redis.xml文件 -->
<import resource="classpath:spring/spring-redis.xml"/>
七、Category实体类
package entity;

import java.io.Serializable;

/**
 * 分类表
 */
public class Category implements Serializable {
    private Integer id;                 /*分类编号*/
    private String categoryName;            /*分类名称*/

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getCategoryName() {
        return categoryName;
    }
    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

    public Category() { }

    public Category(Integer id, String categoryName) {
        this.id = id;
        this.categoryName = categoryName;
    }

    @Override
    public String toString() {
        return "Category{" +
                "id=" + id +
                ", categoryName='" + categoryName + '\'' +
        '}';
    }
}
八、工具类:json字符串转换类
package tools;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

/**
 * json字符串转换类
 */
public class ObjectMapperTools {
    
    /**
     * 创建ObjectMapper对象
     */
    private static ObjectMapper objectMapper = null;

    /*在静态代码块下,objectMapper只会创建一次*/
    static {
        objectMapper = new ObjectMapper();

        /*如果是空对象的时候,不抛异常(如果使用了mybatis懒加载必须设置)*/
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);
    }

    /**
     * 获取ObjectMapper对象
     * @return ObjectMapper对象
     */
    public static ObjectMapper getObjectMapper(){
        return objectMapper;
    }

}
九、数据访问层CategoryDao接口
package dao;

import entity.Category;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 数据访问层CategoryDao接口
 */
@Repository
public interface CategoryDao {
    /**
     * 获取分类的信息
     * @return 分类的信息
     */
    @Select("SELECT * FROM `category` ORDER BY id")
    List<Category> getCategoryList();
}
十、业务逻辑层CategoryService接口
package service;

/**
 * 业务逻辑层CategoryService接口
 */
public interface CategoryService {
    /**
     * 获取存在Redis中的数据
     * @return Redis中的数据
     */
    String findCategoryList() throws Exception;
}
十一、业务逻辑层CategoryServiceImpl实现类
package service.impl;

import dao.CategoryDao;
import entity.Category;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import service.CategoryService;
import tools.ObjectMapperTools;

import java.util.List;

/**
 * 业务逻辑层CategoryServiceImpl实现类
 */
@Service
public class CategoryServiceImpl implements CategoryService {

    @Autowired
    private CategoryDao categoryDao;

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public String findCategoryList() throws Exception {
        /*获取json数据*/
        String jsonData = (String) redisTemplate.opsForValue().get("categoryList");

        /*判断是否从redis中获取到数据*/
        if (jsonData == null) {
            /*若Redis中存储的数据过时,json数据无效时,则去数据库获取List<Category>的数据*/
            List<Category> categoryList = categoryDao.getCategoryList();

            /*将List<Category>中的数据转换成json字符串*/
            jsonData = ObjectMapperTools.getObjectMapper().writeValueAsString(categoryList);

            /*将categoryList中的数据写入Redis中*/
            redisTemplate.opsForValue().set("categoryList", jsonData);
        }

        /*返回json数据*/
        return jsonData;
    }

}
十二、表现层CategoryController类
package web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import service.CategoryService;

/**
 * 表现层CategoryController类
 */
@Controller
@RequestMapping("/category")
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    /**
     * 获取分类类别的json数据
     * @return json数据
     * @throws Exception 异常
     */
    @ResponseBody
    @RequestMapping(value = "/categoryList", method = RequestMethod.GET)
    public String getCategoryList() throws Exception {
        /*获取分类类别的json数据*/
        String jsonData = categoryService.findCategoryList();

        /*将json数据响应给前端页面*/
        return jsonData;
    }

}
十三、页面展现数据
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<c:set var="url" value="${pageContext.request.contextPath}"/>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
  <head>
    <!-- 指定字符集 -->
    <meta charset="utf-8">
    <!-- 使用Edge最新的浏览器的渲染方式 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
    width: 默认宽度与设备的宽度相同
    initial-scale: 初始的缩放比,为1:1 -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>分类列表</title>
    <!-- 1. 导入CSS的全局样式 -->
    <link href="statics/css/bootstrap.min.css" rel="stylesheet">
    <!--导入jquery-->
    <script src="statics/js/jquery-3.3.1.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="statics/js/bootstrap.min.js"></script>
    <style type="text/css">
        .navitem {
            width: 100%;
            height: 40px;
            background: #ffffff;
        }
        .nav {
            width: 1200px;
            margin: 20px auto 0;
        }
        .nav .picture {
            margin-top:5px;
        }
        .nav li {
            float: left;
            margin-left: 60px;
        }
        .nav li a {
            color: #3d3d3f;
            font-size: 16px;
            font-weight: bolder;
            display: inline-block;
        }
        .nav>li>a:focus, .nav>li>a:hover{
            background: none;
        }
        .nav>li>a {
            padding: 10px 15px;
        }
    </style>
    <script type="text/javascript">
        $(function () {
            /*显示分类导航列表*/
            $.ajax({
                url:"${url}/category/categoryList",
                type:"GET",
                data:{action:"getCategoryList"},
                dataType:"json",
                success:function(data) {
                    /*拼接html代码*/
                    var appendHtml = '';

                    /*拼接固定的html代码*/
                    appendHtml += '<li class="picture"><img src="statics/images/csdn.png"></li>';

                    /*循环拼接动态分类列表*/
                    $(data).each(function (i, category) {
                        /*获取分类编号*/
                        var categoryId = category.id;

                        /*获取分类名称*/
                        var categoryName = category.categoryName;

                        /*拼接html代码*/
                        appendHtml += '<li><a href="index.jsp?categoryId=' + categoryId + '">' + categoryName + '</a></li>';
                    });

                    /*拼接开源的html代码*/
                    appendHtml += '<li><a href="index.jsp">开源</a></li>';

                    /*将拼接的html代码存入.nav中*/
                    $(".nav").html(appendHtml);
                }, error:function () {
                    alert("服务器繁忙!");
                }
            });
        });
    </script>
  </head>
  
  <body>
    <div class="navitem">
        <ul class="nav">
            <!--
                <li class="picture"><img src="statics/images/csdn.png"></li>
                <li><a href="index.jsp">博客</a></li>
                <li><a href="index.jsp">课程</a></li>
                <li><a href="index.jsp">开发者商城</a></li>
                <li><a href="index.jsp">问答</a></li>
                <li><a href="index.jsp">社区</a></li>
                <li><a href="index.jsp">插件</a></li>
                <li><a href="index.jsp">认证</a></li>
            -->
        </ul>
    </div>
  </body>
</html>
十四、Redis客户端查看保存的数据

在这里插入图片描述

十五、页面展示的效果图

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSM集成Redis的小案例 的相关文章

随机推荐

  • 2023年“网络安全”赛项江苏省淮安市选拔赛 任务书

    任务书 一 竞赛时间 共计3小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 服务器内部信息获取 任务二 网站渗透测试 任务三 Linux系统渗透提权 任务四 Web渗透测试 第二阶段分
  • C#时间格式转换问题(12小时制和24小时制)

    string time Convert ToDateTime date ToString yyyy MM dd HH mm 24小时 string time Convert ToDateTime date ToString yyyy MM
  • @FeignClient服务之间调用Get请求传递对象参数

    使用feign进行服务间调用时 Get请求有多个参数的时候如何使用对象传参呢 第一步 引入pom依赖
  • unity中控制主角的移动和旋转

    在游戏中我们通常要控制玩家的移动和旋转 首先我们说一下移动 移动的本质就是在Update 或LateUpdate 中不断修改物体的position来实现移动 移动的方法有4中 1 transform Translate 第一种方法与直接修改
  • 两列表同时排序,排序后对应元素不变(用到zip打包和解包)

    number是数字 lis是要排的序列 def sort number list number lis 利用 解包方式 将一个排序好的元组 通过元组生成器再转成list list sorted list list zip sorted zi
  • 创造自己的专属免费网盘:Nextcloud

    由于百度网盘速度奇慢无比 而且同步文件夹还需要会员什么的 这对于Nextcloud来说简直就是欺负人啊 所以我们通过搭建一个Nextcloud的私有云 来解决这些问题 目录 简介 快捷安装 配置ssl 启用https 报错 意外处理 一 简
  • less动态样式语言(预处理语言)

    一 使用方法 Less是一门CSS 预处理语言 它扩展了 CSS 语言 增加了变量 Mixin 函数等特性 使 CSS 更易维护和扩展 Less 可以运行在 Node 或浏览器端 1 客户端使用 1 下载less 2 编写项目less文件
  • 红米10A 一键root教程 解锁BL 跳过168小时限制 刷面具root救黑砖刷机 解决无法解锁BL 新版本刷机

    新版本 红米10A 解锁BL 无法秒解锁BL root bootloader 要刷机 线刷救砖 获取Root权限都需要解除bootloader锁 我们称解除刷机限制的这个操作就叫解锁BL 只有解锁BL后 才可以进行刷机 刷Root权限等等一
  • Linux多进程:orphan process——孤儿进程

    孤儿进程orphan process 当父进程比子进程先结束 这样的子进程就成为了孤儿进程 每当出现一个孤儿进程 内核会把孤儿进程的父进程设置为init 托管 init进程会循环wait 孤儿进程结束 然后做剩下的善后 回收资源 因此 孤儿
  • 验证链表是否有环

    思路 声明一个快指针 一个慢指针 快指针一次走两步 慢指针一次走一步 如果快慢两个指针相遇 说明链表有环 至于为什么快慢两个指针相遇就说明链表中有环 这个牵扯到数学证明 这里就不论证了 我们直接用结论 代码实现 初始化的时候 快指针指向 h
  • SSM框架学习(三),SSM整合

    主要整合的主要整合Spring和Mybatis 将Mybatis交由Spring管理 第一步配置datasource
  • 因找不到D3DCompiler_47.dll文件导致游戏软件无法启动问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个D3DComp
  • jdbc中加载oracle驱动程序,在一个Java应用程序中使用多个Oracle JDBC驱动程序?

    我想通过JDBC连接到两个不同的Oracle数据库 一个8 0 5 0 0和一个12c 我确实有两个JDBC驱动程序 它们可以通过简单的 hello world 应用程序分别成功地连接到相应的DB 下面 我将它们都放在一个Java应用程序中
  • 【R语言】实验五 综合应用

    系列文章目录 实验一 R 语言数据结构 数据导入与数据处理 实验二 基本数据处理 实验三 数据可视化 实验四 数据分析 实验五 综合应用 实验数据 实验数据下载 1 systation 数据集 systation csv 中包含的是沈阳地铁
  • springmvc_上传图片以及显示图片到页面

    首先我使用的开发工具是IntelliJ idea 今天想做一个上传头像以及显示头像的简单功能 也在网上查询了很多资料 真的看得头大 最后还是自己鼓捣出来了 明明很简单的一个功能 先看看效果吧 需要注意的地方 1 记住要在wepapp文件目录
  • 必看,Mac苹果电脑重装系统教程

    们在使用mac电脑的过程中 因为Mac电脑长时间使用或多或少都可能会出现一些问题 这个时候我们可以选择重新安装系统来解决这些问题 Mac电脑重装系统方法其实很简单 分为两种 一种可以在线重装系统 一种可以将Mac系统制作到U盘里进行系统重装
  • ubuntu pptp

    Hi 1 安装pptp linux sudo apt get install pptp linux binutils 2 建立pptp连接 sudo pptpsetup create testvpn server 45 77 243 243
  • 在Ubuntu18.04上安装Docker CE的方法

    卸载旧版本 如果之前安装旧版本 需要先卸载 1 sudoapt get remove docker docker engine docker io containerd runc 设置仓库 更新apt包索引 1 sudoapt get up
  • Java实验3 员工管理系统

    Java实验3 员工管理系统 文章目录 Java实验3 员工管理系统 toc 1 实验要求 2 具体创建过程 3 结果展示 4 代码展示 1 实验要求 进行一个企业员工基本信息的数据库设计 使用员工信息表 部门信息表两个数据表来存放数据 选
  • SSM集成Redis的小案例

    一 详情介绍 这里是使用Window版本的Redis 将下载好的Windows版本的Redis压缩包解压到一个目录下 客户端使用的是Redis Desktop Manager 使用Redis需要启动相应的服务 操作如下图所示 备注 双击打开