SpringBoot集成Redis缓存并实现初始化用户数据到Redis缓存

2022-08-05 11:19:23

1、springboot集成Redis缓存

1.引入依赖

在 pom.xml 中引入依赖(这里没有添加版本号是因为加了spring-boot-starter-parent,可以省略一些常用依赖的版本号)

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

2.添加配置

在 application.properties 中添加如下配置

### Redis缓存配置
### 默认Redis数据库为db0
spring.redis.database=0
### 服务器地址,localhost
spring.redis.host=localhost
### 链接端口,默认为6379
spring.redis.port=6379
### Redis密码默认为空
spring.redis.password=

3.测试是否成功

在测试类中加入如下代码,运行

@TestpublicvoidtestRedis(){//增
        redisTemplate.opsForValue().set("name","Test");
        String name=(String)redisTemplate.opsForValue().get("name");
        System.out.println(name);}

运行截图:
在这里插入图片描述
成功!

2、实现初始化用户数据到Redis缓存

之所以要把数据放到缓存中,是因为用户的数据属于变动不大的数据,适合放到缓存中,在应用需要获取用户数据时,可以直接到Redis获取,提高数据访问速度

1.listener监听类

package com.example.demojpa.listener;import com.example.demojpa.model.PhoneType;import com.example.demojpa.service.PhoneTypeService;import org.springframework.data.redis.core.RedisTemplate;import javax.annotation.Resource;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.annotation.WebListener;import java.util.List;/*
* 监听器
* ye
* 2020.10.26
* */@WebListenerpublicclassRedisListenerimplementsServletContextListener{@Resourceprivate RedisTemplate redisTemplate;@Resourceprivate PhoneTypeService phoneTypeService;privatestaticfinal String ALL_USER="ALL_USER_LIST";@OverridepublicvoidcontextInitialized(ServletContextEvent servletContextEvent){//查询数据库所有用户
        List<PhoneType> phoneListenerList= phoneTypeService.findAll();
        System.out.println(phoneListenerList);//清除缓存中的用户数据
        redisTemplate.delete(ALL_USER);//将数据存放到Redis缓存中
        redisTemplate.opsForList().leftPushAll(ALL_USER,phoneListenerList);//真实项目中需要注解掉,查询所有的用户数据
        List<PhoneType> queryPhoneTypeList= redisTemplate.opsForList().range(ALL_USER,0,-1);
        System.out.println("缓存中目前的用户数:"+ queryPhoneTypeList.size()+"人");

        System.out.println("ServletContext 上下文初始化");}@OverridepublicvoidcontextDestroyed(ServletContextEvent servletContextEvent){
        System.out.println("ServletContext 上下文销毁");}}

2.实体表中需要序列化

因为RedisTemplate默认使用jdkSerializationRedisSerializer,而StringRedisTemplate默认使用StringRedisSerializer。所以实体类需要实现序列化接口Serializable。代码如下:

@Entity@Table(name="phone_type")publicclassPhoneTypeimplementsSerializable{//省略代码}

3.findById示例

我们首先是查找Redis缓存中的数据,有就返回,没有就查找数据库中的数据,有就更新缓存并返回数据,没有就返回没有。

具体方法如下:

@Overridepublic PhoneTypefindById(String id){//step.1 查询Redis缓存中的所有数据
        List<PhoneType> phoneTypeList= redisTemplate.opsForList().range(ALL_USER,0,-1);if(phoneTypeList!= null&&phoneTypeList.size()>0){for(PhoneType phoneType:phoneTypeList){if(phoneType.getType_id().equals(id)){return phoneType;}}}//step.2 查询数据库中的数据
        PhoneType phoneType= phoneTypeRepository.findById(id).get();if(phoneType!= null){//step.3 将数据插入到Redis缓存中
            redisTemplate.opsForList().leftPush(ALL_USER,phoneType);}return phoneType;}

4.测试

@TestpublicvoidtestFindById_redis(){
        Long redisUserSize=0L;//查询id = 2 的数据,该数据存在于Redis缓存中
        PhoneType phoneType= phoneTypeService.findById("2");
        redisUserSize= redisTemplate.opsForList().size("ALL_USER_LIST");
        System.out.println("目前缓存中的用户数量为:"+ redisUserSize);
        System.out.println("----> id: "+ phoneType.getType_id()+"   name: "+ phoneType.getType_name());}

在这里插入图片描述
成功!

  • 作者:Chasing stars
  • 原文链接:https://blog.csdn.net/weixin_43520670/article/details/109286117
    更新时间:2022-08-05 11:19:23