欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

七十四.引入Redis缓存

程序员文章站 2024-02-27 20:53:03
...

webshop-prodect项目的pom.xml文件中引入相关依赖,如下:

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <!--排除redis的异步客户端lettuce-->
            <exclusions>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--引入redis的客户端jedis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

修改webshop-prodect项目的application.yml文件,加上redis的相关配置,如下:
七十四.引入Redis缓存
新建redis的配置类RedisConfig,具体内容如下:

package com.example.springboot.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;

import javax.annotation.PostConstruct;

@Configuration
public class RedisConfig {

    @Autowired
    private RedisTemplate redisTemplate;

    @PostConstruct
    public void init() {
        initRedisTemplate();
    }

    /**
     * 设置redis的key-value序列化器为字符串序列化器
     */
    private void initRedisTemplate() {
        RedisSerializer stringSerializer = redisTemplate.getStringSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);
    }
}

之后就可以使用注入RedisTemplate类来操作redis中的相应数据,或者使用SpringCache的注解方式来操作redis中数据,而哪些数据是可以放入redis的,需要根据业务情况做分析,读多写少的数据放入redis可以大程度减少与数据库的磁盘交互,基于内存的数据读取可以极大的优化数据查询性能,但是如果是写多读少的数据,要考虑的点就比较多了,如何保证缓存一致性就是一个大问题,是采用双写模式还是失效模式,解决方案就还得针对到具体的数据类型了,比如如果要求数据是强一致性的,那么建议加锁排队,保证操作数据的顺序,如果要求数据是最终一致性,可以容忍短时间的数据不一致,那么给缓存数据加上过期时间即可,当然了,还有一种类型的锁叫做读写锁,可以做到读读操作时无锁,而只要有写操作发生就加锁,阻塞后续的操作,这样在写时就可以保证数据的一致性,而读时的性能又不会受影响。