1.使用redis缓存数据库中的一些数据
这只是简单使用:
准备条件:
1).开发环境 :win7
2)开发工具 :IDE
3)技术框架:SpringBoot+mybaties-plus+redis+mysql
4) linux:centOs
进入主题:
- 新建一个springBoot项目;(这里网络有很多)
- 在pom.xml中添加依赖;
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yang</groupId>
<artifactId>redis-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>redis-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--添加jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!--添加web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<!--添加Springboot整合mybaties-plus-->
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<!--添加mysql 连接驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--spring整合redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!--提供了在srping应用中通过简单的配置访问redis服务api-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<!--提供POJO的getter/setter/toString;等-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 修改配置文件
application.properties
重命名为application.yml
,将127.0.0.1 地址改为自己数据库安装的地址,将“bookstore” 改为自己的连接的数据库名称 ,username和password 分别改为自己连接数据库时的用户名和密码。
#配置服务
server:
port: 8081
servlet:
context-path: /
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/bookstore?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
#mybatis-plush配置
mybatis-plus:
#定义别名包
type-aliases-package: com.yang.pojo
#加载Mapper映射文件
mapper-locations: classpath:/mybatis/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: false
# 添加日志信息
logging:
level:
com.jt.mapper: debug
- pojo类的编写
在com.yang.pojo包下创建Address类,这个需要如不用lombok这个jar包,就自己生成对应get/set/toString/equals/无参构造/全参构造等方法
package com.yang.pojo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import lombok.experimental.Accessors;
/**
* @author 杨
* @Date 项目创建日期为 2021/1/7
* @copyright 项目版权归作者所有
*/
@Data //@Setter ,@Getter ,@ToString
@NoArgsConstructor //无参构造
@AllArgsConstructor //全参构造
@TableName(value = "address") //1.关联表名 有了这个可以不用写对应mapper.xml映射文件了
@Accessors(chain = true) //实现链式加载
public class Address {
//对象与数据表要完美映射 对象名称与表名 对象的属性与表的字段
//注意对象使用包装类型
@TableId
private String address_areaId;
private String address_name;
private String address_regionId;
}
- mapper接口的编写。
注意:假如我们的启动类在com.yang 这个包下。
在com.yang.mapper包小创建AddressMapper 接口并且继承 BaseMapper 接口,接口不需要写任何的方法,因为我们使用mybaties-plus这个架包。
package com.yang.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yang.pojo.Address;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface AddressMapper extends BaseMapper<Address> {
}
- 在com.yang.service包下创建AddressService接口
package com.yang.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.yang.pojo.Address;
import java.util.List;
/**
* MP :代表mybaties-plus
*/
public interface AddressService {
List<Address> listMP();//使用MP用法
List<Address> listRedisCache() throws JsonProcessingException;//使用redis进行缓存
}
- 在com.yang.service.impl包下创建AddressServiceImpl 并且实现AddressService接口
package com.yang.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yang.mapper.AddressMapper;
import com.yang.pojo.Address;
import com.yang.service.AddressService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import java.util.List;
/**
* @author yang
* @Date 项目创建日期为 2021/1/7
* @copyright 项目版权归作者所有
*/
@Service
public class AddressServiceImpl implements AddressService {
@Autowired
private AddressMapper addressMapper;
@Override
public List<Address> listMP() {//从数据库查询数据
IPage<Address> ipage =new Page<>(0,20);//使用MP提供的IPage进行分页查询
QueryWrapper<Address> queryWrapper=new QueryWrapper<>();
queryWrapper.orderByAsc("address_areaId");//查询降序
IPage<Address> selectPage = addressMapper.selectPage(ipage, queryWrapper);//
List<Address> addressList= selectPage.getRecords();//获取查询到前20 条数据
return addressList;
}
@Override
public List<Address> listRedisCache() throws JsonProcessingException {
System.out.println("");
String host="192.168.126.129";//虚拟机ip地址
int port=6379;//redis 服务默认端口
String key="list";//声明redis set(key,value)中的key
Jedis jedis=new Jedis(host, port);//简单创建一个连接虚拟机redis实例
/**
* 这个类有两个方法
* readValue() //将JSON转化为对象 反射思想
* writeValueAsString()//将对象转化为JSON
*/
ObjectMapper objectMapper=new ObjectMapper();//这个类可以
List<Address> list=null;
if (jedis.exists(key)){
System.out.println("使用redis缓存的数据");
String value=jedis.get(key);//如redis中已经缓存了这些数据,这直接从redis中拿数据,就不需要到数据库中取了。这里的key不做变化,只是简单使用
//将JSON转化为对象 反射思想
list = objectMapper.readValue(value, List.class);
}else {
System.out.println("使用查询到数据库的数据");
list=listMP();//获取从数据库查询出来的分页数据
//将对象转化为JSON
String json = objectMapper.writeValueAsString(list);
jedis.set(key, json);
}
return list;
}
}
- 配置查询拦截类(实现分页辅助类)
在com.yang.config包下创建MybatisPlusConfig类
package com.yang.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author 杨
* @Date 项目创建日期为 2021/1/8
* @copyright 项目版权归作者所有
*/
@Configuration
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
- 控制类的实现
在com.yang.controller包下创建AddresController 类
package com.yang.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.yang.pojo.Address;
import com.yang.service.AddressService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author 杨
* @Date 项目创建日期为 2021/1/7
* @copyright 项目版权归作者所有
*/
@RestController
@RequestMapping("/addr")
public class AddresController {
@Autowired
private AddressService addressService;
@RequestMapping("/listMP")
public List<Address> listMP() throws JsonProcessingException {
// return addressService.listMP();
return addressService.listRedisCache();
}
}
- 启动我们虚拟机中redis服务
命令:
redis-server redis.conf
a)查看是否启动成功
命令:ps -ef|grep redis
出现下表示启动成功
11. 在浏览器中输入 http://localhost:8081/addr/listMP
路径后回车
第一次数据是从数据库中拿到的数据:
12. 再次刷新浏览器地址时:
这是从redis缓存中取数据,此时不再去查询数据库:
我们查看下redis缓存中缓存key,和value
可以看到数据已经缓存到redis中了。