SpringBoot集成Redis缓存并实现初始化用户数据到Redis缓存
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());
}
成功!