Spring Boot整合Spring Cache及Redis过程解析

网友投稿 506 2023-07-06

Spring Boot整合Spring Cache及Redis过程解析

Spring Boot整合Spring Cache及Redis过程解析

这篇文章主要介绍了Spring Boot整合Spring Cache及Redis过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1.安装redis

a.由于官方是没有Windows版的,所以我们需要-微软开发的redis,网址:

https://github.com/MicrosoftArchive/redis/releases

b.解压后,在redis根目录打开cmd界面,输入:redis-server.exe redis.windows.conf,启动redis(关闭cmd窗口即停止)

2.使用

a.创建SpringBoot工程,选择maven依赖

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-thymeleaf

org.springframework.boot

spring-boot-starter-data-redis

.....

b.配置 application.yml 配置文件

server:

port: 8080

spring:

# redis相关配置

redis:

database: 0

host: localhost

port: 6379

password:

jedis:

pool:

# 连接池最大连接数(使用负值表示没有限制)

max-active: 8

# 连接池最大阻塞等待时间(使用负值表示没有限制)

max-wait: -1ms

# 连接池中的最大空闲连接

max-idle: 5

# 连接池中的最小空闲连接

min-idle: 0

# 连接超时时间(毫秒)默认是2000ms

timeout: 2000ms

# thymeleaf热更新

thymeleaf:

cache: false

c.创建RedisConfig配置类

@Configuration

@EnableCaching //开启缓存

public class RedisConfig {

/**

* 缓存管理

* @param redisConnectionFactory

* @return

*/

@Bean

public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {

// 生成一个默认配置,通过config对象即可对缓存进行自定义配置

RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();

// 设置缓存的默认过期时间,也是使用Duration设置

config = config.entryTtl(Duration.ofMinutes(30))

// 设置 key为string序列化

.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))

// 设置value为json序列化

.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer()))

// 不缓存空值

.disableCachingNullValues();

// 对每个缓存空间应用不同的配置

Map configMap = new HashMap<>();

configMap.put("userCache", config.entryTtl(Duration.ofSeconds(60)));

// 使用自定义的缓存配置初始化一个cacheManager

RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)

//默认配置

.cacheDefaults(config)

// 特殊配置(一定要先调用该方法设置初始化的缓存名,再初始化相关的配置)

.initialCacheNames(configMap.keySet())

.withInitialCacheConfigurations(configMap)

.build();

return cacheManager;

}

/**

* Redis模板类redisTemplate

* @param factory

* @return

*/

@Bean

public RedisTemplate redisTemplate(RedisConnectionFactory factory) {

RedisTemplate template = new RedisTemplate<>();

template.setConnectionFactory(factory);

// key采用String的序列化方式

template.setKeySerializer(new StringRedisSerializer());

// hash的key也采用String的序列化方式

template.setHashKeySerializer(new StringRedisSerializer());

// value序列化方式采用jackson

template.setValueSerializer(jackson2JsonRedisSerializer());

// hash的value序列化方式采用jackson

template.setHashValueSerializer(jackson2JsonRedisSerializer());

return template;

}

/**

* json序列化

* @return

*/

private RedisSerializer jackson2JsonRedisSerializer() {

//使用Jackson2JsonRhttp://edisSerializer来序列化和反序列化redis的value值

Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class);

//json转对象类,不设置默认的会将json转成hashmap

ObjectMapper mapper = new ObjectMapper();

mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

serializer.setObjectMapper(mapper);

return serializer;

}

}

d.创建entity实体类

public class User implements Serializable {

private int id;

private String userName;

private String userPwd;

public User(){}

public User(int id, String userName, String userPwd) {

this.id = id;

this.userName = userName;

this.userPwd = userPwd;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getUserPwd() {

return userPwd;

}

public void setUserPwd(String userPwd) {

this.userPwd = userPwd;

}

}

e.创建Service

@Service

public class UserService {

//查询:先查缓存是是否有,有则直接取缓存中数据,没有则运行方法中的代码并缓存

@Cacheable(value = "userCache", key = "'user:' + #userId")

public User getUser(int userId) {

System.out.println("执行此方法,说明没有缓存");

return new User(userId, "用户名(get)_" + userId, "密码_" + userId);

}

//添加:运行方法中的代码并缓存

@CachePut(value = "userCache", key = "'user:' + #user.id")

public User addUser(User user){

int userId = user.getId();

System.out.println("添加缓存");

return new User(userId, "用户名(add)_" + userId, "密码_" + userId);

}

//删除:删除缓存

@CacheEvict(value = "userCache", key = "'user:' + #userId")

public boolean deleteUser(int userId){

System.out.println("删除缓存");

return true;

}

@Cacheable(value = "common", key = "'common:user:' + #userId")

public User getCommonUser(int userId) {

System.out.println("执行此方法,说明没有缓存(测试公共配置是否生效)");

return new User(userId, "用户名(common)_" + userId, "密码_" + userId);

}

}

f.创建Controller

@RestController

@RequestMapping("/user")

public class UserController {

@Resource

private UserService userService;

@RequestMapping("/getUser")

public User getUser(int userId) {

return userService.getUser(userId);

}

@RequestMapping("/addUser")

public User addUser(User user){

return userService.addUser(user);

}

@RequestMapping("/deleteUser")

public boolean deleteUser(int userId){

return userService.deleteUser(userId);

}

@RequestMapping("/getCommonUser")

public User getCommonUser(int userId) {

return userService.getCommonUser(userId);

}

}

@Controller

public class HomeController {

//默认页面

@RequestMapping("/")

public String login() {

return "test";

}

}

g.在 templates 目录下,写书 test.html 页面

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring实战之使用Expression接口进行表达式求值操作示例
下一篇:创建Maven项目和Spring IOC实例过程解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~