springboot学习笔记(八)——使用redis做缓存

前言:       

         redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

         Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 [1] 

          Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

                                                                       (以上来自百度百科)

         现在很多情况下,我们都开始使用redis进行缓存,技能降低数据库服务器压力,也让用户更快的访问到我们的数据,并发上也能很好的处理。现在我们来学学springboot中使用redis注解进行开发。

开发环境:

         win10+IntelliJ IDEA +JDK1.8+redis3.5  

         springboot版本:springboot 1.5.14 ——2.0后的springboot增加了挺多新特性,暂时先不做了解

项目结构:

                                       

项目完整案例:

https://github.com/LuckToMeet-Dian-N/springboot_Learn_8

环境搭建:

       这步是搭建redis环境,这里接不做介绍了。如果还没搭建的同学参考我的另一篇博客:随笔(三)-- linux下安装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>

	<groupId>com.wen</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>demo</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.14.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<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>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</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>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

        application.properties

# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=172.16.151.156
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=2000
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0

#数据库类信息
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=wuxiwen
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#展示sql语句
spring.jpa.show-sql=true
#设置方言
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect

#时区设置
spring.jackson.time-zone=GMT+8
#日期期时格式设置置
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

注解介绍:

@CachePut     @CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

@Cacheable    对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。

@CacheConfig 缓存配置,可以配置一个类全局缓存的名字

@CacheEvict     @CacheEvict是用来标注在需要清除缓存元素的方法或类上的。

 

开始开发:

        Dao层:

package com.wen.test.Dao;

import com.wen.test.vo.Users;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@CacheConfig(cacheNames = "users")
public interface UserDao extends JpaRepository<Users,Integer>{


    @Cacheable(key ="'id:'+#p0")
    @Query("select u from Users u where u.user_id=:user_id")
    Users findUsersByUser_id(@Param("user_id") Integer user_id);

    @Modifying
    @Transactional
//    @CachePut(key = "'id:'+#p0.user_id")  //缓存刷新
    @CacheEvict(key = "'id:'+#p0.user_id") //删除缓存
    Users save(Users users);

}

       vo层:

package com.wen.test.vo;

import lombok.Data;
import sun.applet.Main;


import javax.persistence.*;

@Data
@Entity
@Table(name = "users")
public class Users {
    @Id
    @GeneratedValue
    private Integer user_id;
    @Column
    private String username;
    @Column
    private String password;

}

        Test类:

package com.wen.test;


import com.wen.test.Dao.UserDao;
import com.wen.test.vo.Users;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    @Autowired
    UserDao userDao;

    @Test
    public void contextLoads() throws Exception {
        /**
         * 用于更新或者增加操作时用到
         */
        Users userss = new Users();
        userss.setUsername("wen");
        userss.setUser_id(1);
        userss.setPassword("12312313");
        Users users=userDao.findUsersByUser_id(1);
	    System.out.println("第一次查询:"+users.getUsername());
        System.out.println("------------完美分割线----------------");
        System.out.println("开始更新操作");
        userDao.save(userss);
        Users u2=userDao.findUsersByUser_id(1);
        System.out.println("第二次查询:"+u2.getUsername());



    }


}

测试:

总结:

         redis的简单缓存操作就是这样了。还有好多好多的东西要学。比如:redis的锁,redis消息队列等,一大堆的redis实现的逗逗是特别的优秀,在我们平时学习来说是一个宝库。简单缓存就写到这里咯,谢谢大家!~

程序人生,与君共勉~!

猜你喜欢

转载自blog.csdn.net/weixin_41622183/article/details/81167574