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

32 篇文章 0 订阅
3 篇文章 0 订阅

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.测试是否成功

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

    @Test
    public void testRedis(){
        //增
        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
* */

@WebListener
public class RedisListener implements ServletContextListener {
    @Resource
    private RedisTemplate redisTemplate;

    @Resource
    private PhoneTypeService phoneTypeService;
    private static final String ALL_USER = "ALL_USER_LIST";

    @Override
    public void contextInitialized(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 上下文初始化");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent){
        System.out.println("ServletContext 上下文销毁");
    }
}

2.实体表中需要序列化

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

@Entity
@Table(name="phone_type")
public class PhoneType implements Serializable {
   //省略代码
}

3.findById示例

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

具体方法如下:

    @Override
    public PhoneType findById(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.测试

    @Test
    public void testFindById_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());

    }

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

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在Spring Boot启动时加载数据Redis中有多种方法,以下是两种常用的方法: 方法一:使用CommandLineRunner接口 在启动类中实现CommandLineRunner接口,并重写run方法,在该方法中调用需要加载数据Redis的逻辑代码。例如: ```java @SpringBootApplication public class MyApplication implements CommandLineRunner { @Autowired private RedisTemplate<String, Object> redisTemplate; public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } @Override public void run(String... args) throws Exception { // 加载数据Redis loadDataToRedis(); } private void loadDataToRedis() { // 从数据库或其他数据源获取数据 List<String> dataList = getDataFromDatabase(); // 将数据存入Redis redisTemplate.opsForList().leftPushAll("myDataList", dataList); } private List<String> getDataFromDatabase() { // 从数据库获取数据的逻辑 // ... return dataList; } } ``` 方法二:使用@PostConstruct注解 在需要加载数据Redis的类的方法上添加@PostConstruct注解,该方法会在Spring Bean初始化完成后自动执行。例如: ```java @Service public class MyService { @Autowired private RedisTemplate<String, Object> redisTemplate; @PostConstruct public void loadDataToRedis() { // 从数据库或其他数据源获取数据 List<String> dataList = getDataFromDatabase(); // 将数据存入Redis redisTemplate.opsForList().leftPushAll("myDataList", dataList); } private List<String> getDataFromDatabase() { // 从数据库获取数据的逻辑 // ... return dataList; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值