目录
Redis Repositories方式
a、启用 Repository 功能
b、注解需要缓存的实体
c、创建一个 Repository 接口
d、测试类中测试
Redis Repositories方式
Spring Data Redis 从 1.7 开始提供 Redis Repositories ,可以无缝的转换并存储 domain objects,使用的数据类型为哈希(hash)。
Spring Data Redis 的 Repository 的基本实现为:CrudRepository 。
基础用法(Usage)分为以下三步
a、启用 Repository 功能
编写一个配置类(或直接利用 Spring Boot 的入口类),在其上标注 @EnableRedisRepositories(basePackages = "...")
,表示启用 Repository 功能。
属性 basePackages
如果不赋值,那么默认是扫描入口类平级及之下的所有类,看它们谁的头上有 @Repository
注解。如果是同时使用 spring-data-jpa 和 spring-data-redis 时,由于它们的 Repository 的祖先中都有 CrudRepository 因此会造成冲突。虽有,最好还是加上 basePackages
属性并为它赋值,指定各自扫描的路径,以避免冲突
package cn.woniu;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
@SpringBootApplication
@MapperScan("cn.woniu.dao")
@EnableRedisRepositories(basePackages = {"cn.woniu.redis"})
public class RedisDatatypeApplication {
public static void main(String[] args) {
SpringApplication.run(RedisDatatypeApplication.class, args);
}
}
b、注解需要缓存的实体
添加关键的两个注解 @RedisHash
和 @Id
;
package cn.woniu.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
@Data
@NoArgsConstructor
@AllArgsConstructor
@RedisHash("goods")
public class goods {
private Integer id;
@Id
private Integer code; //商品编号
private String name;
private Double price; //价格
private String num; //数量
}
@RedisHash("goods")是将数据分到goods的组,哈希对应数据是组
@Id是类似一个索引,如通过编号查询的编号,reids中的所示是都是在goods标签下的
注解 | 说明 |
---|---|
@RedisHash | 表示将 User 类的对象都对于 Redis 中的名为 user 的 Set 中。 |
@Id | 标注于对象的唯一性标识上。 |
c、创建一个 Repository 接口
自定的 Repository 接口必须继承 CrudRepository,才能“天生”具有存取数据的能力
package cn.woniu.redis;
import cn.woniu.entity.goods;
import org.springframework.data.repository.CrudRepository;
/**
* 操作redis的接口(增删改查)
* 把goods 以hash 数据类型方式存储
*/
public interface RedisRepository extends CrudRepository<goods,Long> {
}
d、测试类中测试
加入依赖
<?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.7.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com</groupId>
<artifactId>redis1227</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>redis1227</name>
<description>redis1227</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
<!-- springboot整合redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 使用 lettuce 时要加这个包;使用 jedis 时则不需要。-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!--mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</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>
配置文件
server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/redis?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
mybatis-plus.mapper-locations=classpath:mapper/*Dao.xml
## Redis 服务器地址
spring.redis.host=localhost
## Redis 服务器连接端口
spring.redis.port=6379
## Redis 数据库索引(默认为 0)
spring.redis.database=0
dao层
package cn.woniu.dao;
import cn.woniu.entity.goods;
import java.util.List;
public interface UserDao {
List<goods> queryGoods();
void insertGoods(goods goods);
}
xml文件-sql语句
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.woniu.dao.UserDao">
<select id="queryGoods" resultType="cn.woniu.entity.goods">
select id,code,name,price,num from goods
</select>
<insert id="insertGoods">
insert into goods(id,code,name,price,num) values (#{id},#{code},#{name},#{price},#{num})
</insert>
</mapper>
通过Redis的id查询(这里的id就是我们上面的@Id,即code)
package cn.woniu.dao;
import cn.woniu.entity.goods;
import java.util.List;
public interface UserDao {
List<goods> queryGoods();
void insertGoods(goods goods);
}
@Test
void testSaveGood(){
//保存数据库数据到redis
//redisRepository.saveAll(goods);
Optional<cn.woniu.entity.goods> byId = redisRepository.findById(Long.valueOf(2));
if (byId.isPresent()){
//isPresent() 有元素返回true,没有元素返回false
System.out.println(byId);
}else{
System.out.println("开始查询数据库");
//redis 没有该商品信息
//1.查数据库
//2.往redis里放
List<goods> goods = userDao.queryGoods();
//保存数据库数据到redis
redisRepository.saveAll(goods);
}
}
以上代码逻辑是: 通过此行代码先查询redis中是否有ID为2(即code=2)的数据,
这行代码是有元素的话返回结果为true,没有结果则为false
如果有此数据存在的话会直接查询显示数据,如果没有则会查询数据库中,如果数据库中有此数据便将此数据放入redis中
Redis新增数据
//1.新增数据 //2.删除redis数据 //3.查询数据库数据 //4.写入redis //5.返回数据我们先要数据库中增加数据,如果redis中有此数据的话直接删除,然后再写入,然后查询数据库中的数据之后再写入redis中,这之前要现在数据库中增加,注意@Id(这里是code)也要保证唯一性
@Test
void testInsertGood(){
//1.新增数据
//2.删除redis数据
//3.查询数据库数据
//4.写入redis
//5.返回数据
userDao.insertGoods(new goods(3,3,"平板",Double.valueOf(33),"50"));
List<goods> goods = userDao.queryGoods();
//写入redis
redisRepository.saveAll(goods);
}
查询Redis中所有数据
@Test
void testQueryAllGoods(){
Iterable<goods> all = redisRepository.findAll();
List<goods> goods = (List<goods>) all;
goods.forEach(e->
System.out.println(e));
}
这里查询所有,是通过自定的 Repository 接口的findAll方法,生成一个迭代,之后强制转换为一个list集合,之后遍历集合,