1、簡介
REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。
Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。
它通常被稱爲數據結構服務器,因爲值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
1.1、特點
- Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啓的時候可以再次加載進行使用。
- Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
- Redis支持數據的備份,即master-slave模式的數據備份。
2、引入依賴
<!-- redis 緩存依賴包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
3、添加 yml 相關配置
只配置了最最基本的,我本人的redis是沒有設置密碼的,所以我這裏沒有添加密碼設置
spring:
redis:
host: localhost
database: 0
timeout: 10000
3、創建配置類
添加一個 RedisConfig 類
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class) // 在加載配置的類之後再加載當前類
public class RedisConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解決查詢緩存轉換異常的問題
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
//配置序列化(解決亂碼的問題)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
// .entryTtl(Duration.ZERO)
.entryTtl(Duration.ofDays(1L)) //設置默認緩存1天
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
Set<String> cacheNames = new HashSet<>();
cacheNames.add("wzpLjy");
// cacheNames.add("wzp");
// cacheNames.add("ljy");
// 對每個緩存空間應用不同的配置
Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
configMap.put("wzpLjy", config);
// configMap.put("wzp", config.entryTtl(Duration.ofSeconds(30L))); //這個緩存空間30秒
// configMap.put("ljy", config.entryTtl(Duration.ofHours(1L))); //這個緩存空間30秒
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.initialCacheNames(cacheNames)// 注意這兩句的調用順序,一定要先調用該方法設置初始化的緩存名,再初始化相關的配置
.withInitialCacheConfigurations(configMap)
.build();
return cacheManager;
}
}
注意:在項目啓動類上加上 @EnableCaching 註解
4、示例
4.1、model實體類
@Entity
@Getter
@Setter
public class User implements Serializable {
private static final long serialVersionUID = -2565653911716253067L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Long createAt = System.currentTimeMillis();
private Long updateAt = System.currentTimeMillis();
private String username;
private String password;
private String name;
private String sex;
private String age;
private String tel;
}
4.2、Repository
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
@Override
@CacheEvict(value = "user",allEntries=true)
User save(User user);
@Override
@Cacheable(value = "user")
void delete(User user);
@Override
@Cacheable(value = "user")
List<User> findAll();
}
4.3、controller
@RestController
@Api(tags = "用戶接口管理")
public class UserController {
@Autowired
private UserRepository userRepository;
@PostMapping("save")
@ApiOperation("新增用戶")
public User save (@RequestBody User user){
userRepository.save(user);
return user;
}
@PostMapping("findAll")
@ApiOperation("查詢用戶")
public List findAll (){
List list = userRepository.findAll();
return list;
}
}
5、測試
測試我就不貼了,因爲我是使用的 hibernate jpa 操作,控制檯打印sql語句,第一次請求接口的時候緩存裏面沒有,會直接查找數據庫,有sql語句打印。第二次是在緩存裏面查詢,未對數據庫進行任何操作,故沒有sql語句打印,即可判斷redis緩存是否生效
6、結語
按照慣例寫個結語,嗯...看了很多大佬的教程,結合我自己的總結了一波,當然了,不足之處請多包涵,也請多指教...如有雷同,也請多包涵......