Redis
Redis 遵守BSD协议,是一个高性能的key-value键值对的非关系型数据库。Redis运行在内存中,所有的操作都是原子性的,支持事务,读写速度每秒可执行上万次。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Spring Data Redis
官方文档: https://spring.io/projects/spring-data-redis
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 http://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.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ronin</groupId>
<artifactId>redis_demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>redis_demo</name>
<packaging>jar</packaging>
<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>
<!-- Spring Boot Begin -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Boot End -->
<!-- Spring Data -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- MySql Connection -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- Apacher Common -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
server:
port: 9004
spring:
application:
name: redis-demo
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.55.136:3306/article?characterEncoding=UTF8
username: root
password: 123456
jpa:
# 数据库类型
database: MySQL
# 开启控制台打印sql语句
show-sql: true
hibernate:
ddl-auto: update
# 192.168.55.136:6379 不写端口,默认是6379
redis:
host: 192.168.55.136
Service
@Service
@Transactional
public class ArticleService {
@Autowired
private ArticleDao articleDao;
//注入spring data redis提供的RedisTemplate模板
@Autowired
private RedisTemplate redisTemplate;
/**
* 根据ID查询实体
* @param id
* @return
*/
public Article findById(String id) {
//从缓存中提取
Article article = (Article) redisTemplate.opsForValue().get("article_" + id);
//如果缓存没有则到数据库查询并放入缓存,设置有效时间10秒
if(article == null){
//从数据库中查询数据
article = articleDao.findById(id).get();
//将数据存放到redis缓存中
redisTemplate.opsForValue().set("article_" + id,article,10, TimeUnit.SECONDS);
}
return article;
}
/**
* 修改
* @param article
*/
public void update(Article article) {
redisTemplate.delete("article_" + article.getId());
articleDao.save(article);
}
/**
* 删除
* @param id
*/
public void deleteById(String id) {
redisTemplate.delete("article_" + id);
articleDao.deleteById(id);
}
}
注解方式
Spring Data Redis 不仅提供了使用 RedisTemplate 模板操作的方式,它还有提供使用注解操作 Redis 的方式。
使用注解方式开发,需要在 Application.java 启动类中添加 @EnableCaching 注解
@SpringBootApplication
@EnableCaching
public class ArticleApplication {
public static void main(String[] args) {
SpringApplication.run(ArticleApplication.class, args);
}
}
Service
@Cacheable 用于增、查操作,需要提供两个属性:
key: 存入 redis 缓存中的 key 值
value:类似于区域名,在存入 redis 时会开启一块区域存放同一 value 的数据,之后的同 value 操作都会在该区域中查找
@CacheEvict 用于更新、删除操作,也需要提供 key、value 两个属性来匹配
@Service
@Transactional
public class ArticleService {
@Autowired
private ArticleDao articleDao;
/**
* 根据ID查询实体
* @param id
* @return
*/
@Cacheable(key = "#id",value = "article")
public Article findById(String id) {
return articleDao.findById(id).get();
}
/**
* 修改
* @param gathering
*/
@CacheEvict(key = "#article.id",value = "article")
public void update(Article article) {
articleDao.save(article);
}
/**
* 删除
* @param id
*/
@CacheEvict(key = "#id",value = "article")
public void deleteById(String id) {
articleDao.deleteById(id);
}
}
测试
启动服务,通过 api 访问
第一次访问,控制台打印查询数据库的 sql 语句
测试数据是否真的放入缓存,多访问几次方法,查看是否还会打印 sql 语句,如果没有打印,说明数据是从缓存中获取的!!!
Spring Data Redis 基本案例成功!