在Sprinng Boot中使用Redis充当缓存

关于我们使用EhCache可以适应很多的应用场景了,但是因为EhCache是进程内的缓存框架,在集群模式下,我们在我们的应用服务器或者云服务器之间的缓存都是独立的。故而在不同的服务器之间的进程会存在缓存不一致的情况,就算我们的EhCache提供了集群环境为我们提供缓存同步,但是我们在进行同步的时候是需要一定的时间的,短暂的缓存不一致仍然存在。

今天我们将围绕我们目前在企业级项目中使用最多的技术,Redis,我们用redis来实现我们的数据缓存。

使用redis作缓存的好处:

  • 快速读写:Redis是基于内存的缓存系统,读写速度非常快。相比于传统的磁盘存储,Redis能够提供更低的延迟,快速响应用户请求。

  • 高并发支持:Redis采用单线程的方式处理请求,通过异步的方式处理多个并发请求,避免了多线程之间的竞争和锁的开销。这使得Redis能够处理大量的并发请求,适用于高并发场景。

  • 数据结构丰富:Redis支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合。这些数据结构的灵活性使得Redis可以应对各种不同的缓存需求,提供更多的功能和选择。

  • 持久化支持Redis支持数据持久化,可以将内存中的数据保存到磁盘上,以防止数据丢失。通过持久化机制,即使Redis重启或崩溃,也能够快速恢复数据,保证数据的可靠性和持久性。

  • 分布式支持Redis提供了集群和分片的支持,可以将数据分布到多个节点上,实现数据的水平扩展和负载均衡。这使得Redis能够应对大规模的数据存储和高并发的访问需求。

  • 缓存策略灵活:Redis提供了丰富的缓存策略,可以设置缓存的过期时间、淘汰策略等。这些策略可以根据业务需求进行灵活配置,提高缓存的效率和命中率。

关于Redis的相关介绍,我这篇就不在描述了。感兴趣的同学可以去看看Redis中文网站。

引入Redis依赖

		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-webartifactId>
		dependency>

		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-data-jpaartifactId>
		dependency>

		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-data-redisartifactId>
		dependency>

		<dependency>
			<groupId>org.apache.commonsgroupId>
			<artifactId>commons-pool2artifactId>
		dependency>

		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-actuatorartifactId>
		dependency>

		<dependency>
			<groupId>mysqlgroupId>
			<artifactId>mysql-connector-javaartifactId>
		dependency>

		<dependency>
			<groupId>org.projectlombokgroupId>
			<artifactId>lombokartifactId>
			<scope>providedscope>
		dependency>

		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-testartifactId>
			<scope>testscope>
		dependency>
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

server.port=9902

spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.min-idle=0
spring.redis.lettuce.shutdown-timeout=100ms

创建一个User实体对象:

@Entity
//@Data
//@NoArgsConstructor
public class User implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    private String name;
    private Integer age;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public User() {
    }
}
@CacheConfig(cacheNames = "users")
public interface UserRepository extends JpaRepository<User, Long> {

    @Cacheable
    User findByName(String name);

    User findByNameAndAge(String name, Integer age);

    @Query("from User u where u.name=:name")
    User findUser(@Param("name") String name);

}
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private CacheManager cacheManager;

    @Test
    public void test() throws Exception {
        System.out.println("CacheManager type : " + cacheManager.getClass());

        // 创建1条记录
        userRepository.save(new User("AAA", 10));

        User u1 = userRepository.findByName("AAA");
        System.out.println("第一次查询:" + u1.getAge());

        User u2 = userRepository.findByName("AAA");
        System.out.println("第二次查询:" + u2.getAge());
    }

}
@EnableCaching
@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

}

在Sprinng Boot中使用Redis充当缓存_第1张图片

你可能感兴趣的:(#,Spring,缓存,redis,数据库)