【Redis】SpringBoot + JPA + Redis 做数据库缓存

1,Maven依赖信息

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- jpa配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!-- postgresql数据库 -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>
        <!-- redis配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

2,配置文件

server:
  port: 8888
spring:
  datasource:
    url: jdbc:postgresql://192.168.80.10:5432/bl?useSSL=false
    username: postgres
    password: 123456
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        temp:
          use_jdbc_metadata_defaults: false
  redis:
    host: localhost
    port: 6379

3, 实体类

@MappedSuperclass
public abstract class ID implements Serializable {

    private String id;

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid")
    @Column(unique = true, nullable = false, updatable = false, length = 32)
    public String getId() {
        return id;
    }

    public void  setId(String id) {
        this.id = id;
    }

}

@MappedSuperclass
public abstract class BaseEntity extends ID {

    private Date createAt;
    private Date updateAt;

    @Temporal(TemporalType.TIMESTAMP)
    @CreationTimestamp
    @Column(updatable = false)
    public Date getCreateAt() {
        return createAt;
    }

    public void setCreateAt(Date createAt) {
        this.createAt = createAt;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @UpdateTimestamp
    public Date getUpdateAt() {
        return updateAt;
    }

    public void setUpdateAt(Date updateAt) {
        this.updateAt = updateAt;
    }
}
@Entity
@Table(name = "t_employee")
public class Employee extends BaseEntity {

    private String name;

    private Double salary;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }
}

4,service层

@Service
public class EmployeeServiceImpl implements EmployeeService {

    @Autowired
    EmployeeDao employeeDao;

    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;

    @Override
    @Transactional
    public Employee save(Employee employee) {
        return employeeDao.save(employee);
    }

    @Override
    public Employee findById(String id) {
        String key = "user_" + id;
        ValueOperations<Object, Object> operations = redisTemplate.opsForValue();
        boolean hasKey = redisTemplate.hasKey(key);

        if(hasKey){ // 如果Redis中存在则查Redis
            long start = System.currentTimeMillis();
            Employee employee = (Employee) operations.get(key);
            long end = System.currentTimeMillis();
            System.out.println("姓名:" + employee.getName());
            System.out.println("查询redis花费的时间是:" + (end - start)+"ms");
            return employee;
        }else { // 如果Redis中不存在则查数据库,并写入Redis
            long start = System.currentTimeMillis();
            Optional<Employee> optional = employeeDao.findById(id);
            if (optional.isPresent()) {
                Employee employee = optional.get();
                long end = System.currentTimeMillis();
                System.out.println("姓名:" + employee.getName());
                System.out.println("查询数据库花费的时间是:" + (end - start)+"ms");
                // 写入缓存
//                operations.set(key, employee, 5, TimeUnit.HOURS);
                operations.set(key, employee, 5, TimeUnit.SECONDS);
                return employee;
            }
        }

        return null;
    }
}

5,controller层

@Controller
public class EmployeeController {

    @Autowired
    EmployeeService employeeService;

    @RequestMapping("save")
    @ResponseBody
    public Employee save(){
        Employee employee = new Employee();
        employee.setName("zhangsan");
        employee.setSalary(120.0);
        return employeeService.save(employee);
    }

    @RequestMapping("/findById/{id}")
    @ResponseBody
    public Employee find(@PathVariable("id") String id){
        return employeeService.findById(id);
    }



}

6,测试

首先运行save方法向数据库里插入一条记录:

然后测试查询方法:

查询效率有了很大的提升!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值