springboot缓存——集成redis

本文介绍Redis的特点及在Spring Boot中的集成方法,包括配置、依赖添加、缓存使用技巧及常见问题解决方案。

Redis简介

1、Redis特点

Redis是一个开源的、高性能的、基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同场景下的缓存与存储需求,直观的存储结构使得通过程序交互十分简单。
Redis数据库中所有数据都存储在内存中,由于内存的读写速度远快于硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势,而且Redis提供了对持久化的支持,即可以将内存中的数据异步写入到硬盘中,且不影响继续提供服务。

2、单线程的Redis为什么这么快

(1) 纯内存操作
(2) 单线程操作,避免了频繁的上下文切换
(3) 采用了非阻塞I/O多路复用机制

3、使用Redis有什么缺点

(1)缓存和数据库双写一致性问题
(2)缓存雪崩问题
(3)缓存击穿问题
(4)缓存的并发竞争问题

Redis的java client

在所有的java client中比较突出的是 Lettuce 和 jedis。Lettuce 和 jedis 的都是连接 Redis Server的客户端。
(1)Jedis 在实现上是直连 redis server,多线程环境下非线程安全,除非使用连接池,为每个 redis实例增加 物理连接。
(2)Lettuce 是 一种可伸缩,线程安全,完全非阻塞的Redis客户端,多个线程可以共享一个RedisConnection,它利用Netty NIO 框架来高效地管理多个连接,从而提供了异步和同步数据访问方式,用于构建非阻塞的反应性应用程序。

springboot 1.5.x版本的默认的Redis客户端是 Jedis实现的
springboot 2.x版本中默认客户端是用lettuce实现的。

SpringBoot 2.x集成Redis做缓存

1、添加Redis、连接池和Cache依赖

(1)springboot 2.x版本中默认客户端是用lettuce实现的

	<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

(2)springboot 2.x版本中客户端改为Jedis实现

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

2、配置application.properties

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

## Cache部分
//缓存的名称集合,多个采用逗号分割
spring.cache.cache-names=
//缓存的类型,官方提供了很多,这里我们填写redis
spring.cache.type=redis
//是否缓存null数据,默认是false
spring.cache.redis.cache-null-values=false
//redis中缓存超时的时间,默认60000ms
spring.cache.redis.time-to-live=60000
//缓存数据key是否使用前缀,默认是true
spring.cache.redis.use-key-prefix=true
//缓存数据key的前缀,在上面的配置为true时有效,
spring.cache.redis.key-prefix=

注:若java client用Jedis实现时连接池要改成spring.redis.lettuce.pool

3、redis配置类(必要时配置)

进行常用的设置:缓存过期时间、制定key值,以及序列化等。

4、Service层使用缓存

@Service
public class BookManageServiceImpl implements BookManageService{
 
    @Autowired
    BookManageMapper bookManageMapper;
    
    //根据用户id获取用户信息 
    @Override
    @Transactional(propagation = Propagation.REQUIRED,readOnly = false)
    @Cacheable(value = "book",key = "#id",unless = "#result==null")
    public User findBook(int id) {
        return bookManageMapper.findBybookid(id);
    }
}

注解说明:
(1)@CacheConfig
配置在类上,cacheNames即定义了本类中所有用到缓存的地方,都去找这个库。只要使用了这个注解,在方法上@Cacheable 、@CachePut 、@CacheEvict就可以不用写value去找具体库名了。【一般不怎么用】

(2)@Cacheable
配置在方法或类上,作用:本方法执行后,先去缓存看有没有数据,如果没有,从数据库中查找出来,给缓存中存一份,返回结果,下次本方法执行,在缓存未过期情况下,先在缓存中查找,有的话直接返回,没有的话从数据库查找

(3)@CachePut
类似于更新操作,即每次不管缓存中有没有结果,都从数据库查找结果,并将结果更新到缓存,并返回结果

(4)@CacheEvict
用来清除用在本方法或者类上的缓存数据(用在哪里清除哪里),要指定value和key

注解的参数:
(1)cacheNames和value
指定缓存组件的名字,通过下面代码可以看出可以将返回结果放在哪个缓存中,可以通过数组的方式指定多个缓存
(2)key
缓存数据的时候使用的key,它是用来指定对应的缓存,模拟使用方法参数值作为key的值。也可以使用SpEL表达式的值来指定
(3)condition
指定复合条件的情况下才缓存。也可以通过SpEL表达式进行设置。这个配置规则和上面表格中的配置规则是相同的。
(4)unless(除非)
当这个条件为true的时候,方法的返回值就不会被缓存

4、启动类开启缓存

@SpringBootApplication
@EnableCaching
public class Application {

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

5、测试

浏览器访问后,redis中就会生成缓存数据
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值