Springboot-cache-redis 实战
项目结构
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>spring-boot-demo-cache-redis</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-boot-demo-cache-redis</name> <description>Demo project for Spring Boot</description> <parent> <groupId>com.xkcoding</groupId> <artifactId>spring-boot-demo</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 对象池,使用redis时必须引入 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!-- 引入 jackson 对象json转换 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <finalName>spring-boot-demo-cache-redis</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 在这里插入代码片`spring: redis: host: 192.168.60.147 # 连接超时时间(记得添加单位,Duration) timeout: 10000ms # Redis默认情况下有16个分片,这里配置具体使用的分片 # database: 0 lettuce: pool: # 连接池最大连接数(使用负值表示没有限制) 默认 8 max-active: 8 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1 max-wait: -1ms # 连接池中的最大空闲连接 默认 8 max-idle: 8 # 连接池中的最小空闲连接 默认 0 min-idle: 0 cache: # 一般来说是不用配置的,Spring Cache 会根据依赖的包自行装配 type: redis logging: level: com.xkcoding: debug ` package com.xkcoding.cache.redis.config; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.io.Serializable; /** * <p> * redis配置 * </p> * * @package: com.xkcoding.cache.redis.config * @description: redis配置 * @author: yangkai.shen * @date: Created in 2018/11/15 16:41 * @copyright: Copyright (c) 2018 * @version: V1.0 * @modified: yangkai.shen */ @Configuration @AutoConfigureAfter(RedisAutoConfiguration.class) @EnableCaching public class RedisConfig { /** * 默认情况下的模板只能支持RedisTemplate<String, String>,也就是只能存入字符串,因此支持序列化 */ @Bean public RedisTemplate<String, Serializable> redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory) { RedisTemplate<String, Serializable> template = new RedisTemplate<>(); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setConnectionFactory(redisConnectionFactory); return template; } /** * 配置使用注解的时候缓存配置,默认是序列化反序列化的形式,加上此配置则为 json 形式 */ @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { // 配置序列化 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); return RedisCacheManager.builder(factory).cacheDefaults(redisCacheConfiguration).build(); } } package com.xkcoding.cache.redis.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; /** * <p> * 用户实体 * </p> * * @package: com.xkcoding.cache.redis.entity * @description: 用户实体 * @author: yangkai.shen * @date: Created in 2018/11/15 16:39 * @copyright: Copyright (c) 2018 * @version: V1.0 * @modified: yangkai.shen */ @Data @AllArgsConstructor @NoArgsConstructor public class User implements Serializable { private static final long serialVersionUID = 2892248514883451461L; /** * 主键id */ private Long id; /** * 姓名 */ private String name; } package com.xkcoding.cache.redis.service.impl; import com.google.common.collect.Maps; import com.xkcoding.cache.redis.entity.User; import com.xkcoding.cache.redis.service.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.Map; /** * <p> * UserService * </p> * * @package: com.xkcoding.cache.redis.service.impl * @description: UserService * @author: yangkai.shen * @date: Created in 2018/11/15 16:45 * @copyright: Copyright (c) 2018 * @version: V1.0 * @modified: yangkai.shen */ @Service @Slf4j public class UserServiceImpl implements UserService { /** * 模拟数据库 */ private static final Map<Long, User> DATABASES = Maps.newConcurrentMap(); /** * 初始化数据 */ static { DATABASES.put(1L, new User(1L, "user1")); DATABASES.put(2L, new User(2L, "user2")); DATABASES.put(3L, new User(3L, "user3")); } /** * 保存或修改用户 * * @param user 用户对象 * @return 操作结果 */ @CachePut(value = "user", key = "#user.id") @Override public User saveOrUpdate(User user) { DATABASES.put(user.getId(), user); log.info("保存用户【user】= {}", user); return user; } /** * 获取用户 * * @param id key值 * @return 返回结果 */ @Cacheable(value = "user", key = "#id") @Override public User get(Long id) { // 我们假设从数据库读取 log.info("查询用户【id】= {}", id); return DATABASES.get(id); } /** * 删除 * * @param id key值 */ @CacheEvict(value = "user", key = "#id") @Override public void delete(Long id) { DATABASES.remove(id); log.info("删除用户【id】= {}", id); } } package com.xkcoding.cache.redis.service; import com.xkcoding.cache.redis.entity.User; /** * <p> * UserService * </p> * * @package: com.xkcoding.cache.redis.service * @description: UserService * @author: yangkai.shen * @date: Created in 2018/11/15 16:45 * @copyright: Copyright (c) 2018 * @version: V1.0 * @modified: yangkai.shen */ public interface UserService { /** * 保存或修改用户 * * @param user 用户对象 * @return 操作结果 */ User saveOrUpdate(User user); /** * 获取用户 * * @param id key值 * @return 返回结果 */ User get(Long id); /** * 删除 * * @param id key值 */ void delete(Long id); } package com.xkcoding.cache.redis; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringBootDemoCacheRedisApplication { public static void main(String[] args) { SpringApplication.run(SpringBootDemoCacheRedisApplication.class, args); } }