首页 > 技术文章 > springBoot集成redis

duzhenwen 2020-12-27 20:29 原文

       Redis作为一个Java后端面试中的一个常问考点,并且在项目中越来越常用,所以自己动手搭建了一个基于springboot集成redis做为数据缓存的demo(springboot集成mybatis、redis,并具有增删改查询接口)。关注微信公众号【菜鸟阿都】并回复:redis,可获得源码。后面也会继续深入研究redis相关知识,期待与大家一起学习交流。

redis简介

       基于键值对的开源内存数据库,支持5种数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)。spring对redis的支持是通过spring Data Redis来实现的,Spring Data Redis 提供了RedisTemplate和StringRedisTemplate两个模板来进行数据操作,StringRedisTemplate只针对键值都是字符型的数据进行操作,StringRedisTemplate继承于RedisTemplate,并采用StringRedisSerializer对键值序列化。

StringRedisTemplate 实现源码

public class StringRedisTemplate extends RedisTemplate<String, String>{
    public StringRedisTemplate() {
    this.setKeySerializer(RedisSerializer.string());
    this.setValueSerializer(RedisSerializer.string());
    this.setHashKeySerializer(RedisSerializer.string());
    this.setHashValueSerializer(RedisSerializer.string());
    }
}
public interface RedisSerializer<T> {
    static RedisSerializer<String> string() {
    return StringRedisSerializer.UTF_8;
    }
}

RedisTemplate提供的数据访问方法

方法

说明

opsForValue()

操作只有简单属性的数据

opsForList()

操作含有list的数据

opsForSet()

操作含有set的数据

opsForZSet()

操作含有ZSet(有序的set)的数据

opsForHash()

操作含有hash的数据

1. 添加reids依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
   <version>2.4.1</version>
</dependency>

2. 封装redis工具类

将redis的操作方法封装为工具类,方便使用

/**
 * Redis操作工具类
 */
@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;

    // 存入数据到缓存
    public void setValue(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    // 通过key获得数据
    public Object getValue(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    // 存入数据到缓存并设置过期时间(单位为秒)
    public void setValueAndExpire(String key, Object value, long time){
        redisTemplate.opsForValue().set(key, value,time,TimeUnit.SECONDS);
    }

    // 删除缓存
    public void delete(String key){
        redisTemplate.delete(key);
    }
}

3. redis使用

       查询数据时先查询缓存中是否存在,存在时,返回内存中的数据,缓存中不存在时,再查询数据库并存入缓存,然后返回查询出的数据

// 根据id查询记录
@Override
public User find(int id) {
    //根据key查询缓存
    User user=(User) redisUtil.getValue("userKey"+id);
    //判断是否为空
    if(user==null){
        // 缓存为空,查询数据库
        user=userMapper.find(id);
        System.out.println("缓存为空,查询数据库");
        // 插入缓存,并设置过期时间(单位为秒)
        redisUtil.setValueAndExpire("userKey"+id,user,30);
        System.out.println("插入缓存");
    }else{
        System.out.println("缓存不为空");
    }
    return user;
}

4. 自定义缓存序列化方式

      RedisTemplate默认采用JdkSerializaationRedisSerializer方式序列化,以二进制数据存放,使用redis客户端工具查看数据时不直观,并且需要对实体类进行序列化(实现Serializable接口)。所以编写redis的配置类修改RedisTemplate的序列化方式,将JdkSerializaationRedisSerializer序列化方式修改为Jackson2JsonRedisSerialize,以json格式对数据进行保存。StringRedisTemplate默认使用的是StringRedisSerializer。

 @Configuration
public class RedisConfig   {
    // 使用Jackson2JsonRedisSerialize替换默认JDK序列化
    @Bean
    public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // key采用String的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // value序列化方式采用jackson
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        // hash的hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }    
}

默认序列化(通过redisClient客户端查看)

图片

使用自定义序列化后,存入缓存中的数据(通过redisClient客户端查看)

图片

5.结果分析

       第一次访问时,缓存为空,查询数据库并插入缓存中,总共用时2941毫秒,第二次查询时,直接从缓存中获取,用时仅仅25毫秒。

缓存为空,查询数据库
插入缓存
总用时:2941
缓存不为空
总用时:25

关注微信公众号【菜鸟阿都】并回复:redis,可获得源码

资源获取

回复关键字(关注微信公众号)描述
redis获得springboot集成redis.,mybatis增删改查示例源码
easymock获得免费easymock接口服务
springboot获得springboot集成swagger,mybatis增删改查示例源码
redis客户端获得redis数据库管理软件redisClient
java资源获得java多线程,springboot,sql优化,java面试视频资源
开发手册阿里巴巴java开发手册(嵩山版)

 

 

 

推荐阅读