SpringBoot2.x和1.x的区别很大,比如在整合 Redis 这一块,RedisCacheManager就有不同。
本文介绍 SpringBoot 2.0.5版本 整合 Redis。
2.RedisConfig.java
设置默认过期时间1天
GenericJackson2JsonRedisSerializer序列化value是采用json格式,里面有对象的class名称,便于反序列化。
以友情链接的service实现为例
除了 @Cacheable、@CacheEvict之外,还有@CachePut,一般不用
查询一律用 @Cacheable,先从 Redis 查有没有这个 key,如果没有则执行方法里的代码,从数据库查询,并将结果存到 Redis 中。
@CacheEvict 可以指定删除某个 key,也可以删除 value 集合的所有 key。
使用的时候只需要注入 RedisUtil,然后就可以简单操作 Redis
最终效果
本文介绍 SpringBoot 2.0.5版本 整合 Redis。
一、基本配置
- pom.xml
- <!-- 里面依赖了spring-data-redis -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-redis</artifactId>
- </dependency>
2.RedisConfig.java
- package com.liuyanzhao.sens.config;
- import lombok.extern.slf4j.Slf4j;
- 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.core.RedisTemplate;
- import org.springframework.data.redis.serializer.*;
- import java.time.Duration;
- /**
- * @author 言曌
- * @date 2018/5/21 上午10:02
- */
- @Configuration
- @EnableCaching
- @Slf4j
- public class RedisConfig {
- //过期时间1天
- private Duration timeToLive = Duration.ofDays(1);
- @Bean
- public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
- //默认1
- RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
- .entryTtl(this.timeToLive)
- .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))
- .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer()))
- .disableCachingNullValues();
- RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory)
- .cacheDefaults(config)
- .transactionAware()
- .build();
- log.debug("自定义RedisCacheManager加载完成");
- return redisCacheManager;
- }
- @Bean(name = "redisTemplate")
- public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
- RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
- redisTemplate.setConnectionFactory(redisConnectionFactory);
- redisTemplate.setKeySerializer(keySerializer());
- redisTemplate.setHashKeySerializer(keySerializer());
- redisTemplate.setValueSerializer(valueSerializer());
- redisTemplate.setHashValueSerializer(valueSerializer());
- log.debug("自定义RedisTemplate加载完成");
- return redisTemplate;
- }
- private RedisSerializer<String> keySerializer() {
- return new StringRedisSerializer();
- }
- private RedisSerializer<Object> valueSerializer() {
- return new GenericJackson2JsonRedisSerializer();
- }
- }
设置默认过期时间1天
GenericJackson2JsonRedisSerializer序列化value是采用json格式,里面有对象的class名称,便于反序列化。
二、@Cacheable和@CacheEvict 的使用
以友情链接的service实现为例
- package com.liuyanzhao.sens.service.impl;
- import com.liuyanzhao.sens.entity.Link;
- import com.liuyanzhao.sens.mapper.LinkMapper;
- import com.liuyanzhao.sens.service.LinkService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.cache.annotation.CacheEvict;
- import org.springframework.cache.annotation.Cacheable;
- import org.springframework.stereotype.Service;
- import java.util.List;
- /**
- * <pre>
- * 友情链接业务逻辑实现类
- * </pre>
- *
- * @author : saysky
- * @date : 2017/11/14
- */
- @Service
- public class LinkServiceImpl implements LinkService {
- private static final String LINKS_CACHE_NAME = "links";
- @Autowired(required = false)
- private LinkMapper linkMapper;
- @Override
- @CacheEvict(value = LINKS_CACHE_NAME, allEntries = true, beforeInvocation = true)
- public Link saveByLink(Link link) {
- if (link != null && link.getLinkId() != null) {
- linkMapper.updateById(link);
- } else {
- linkMapper.insert(link);
- }
- return link;
- }
- @Override
- @CacheEvict(value = LINKS_CACHE_NAME, allEntries = true, beforeInvocation = true)
- public void removeByLinkId(Long linkId) {
- linkMapper.deleteById(linkId);
- }
- @Override
- @Cacheable(value = LINKS_CACHE_NAME, key = "'links_all'")
- public List<Link> findAllLinks() {
- return linkMapper.findAll();
- }
- @Override
- @Cacheable(value = LINKS_CACHE_NAME, key = "'links_id_'+#linkId", unless = "#result == null")
- public Link findByLinkId(Long linkId) {
- return linkMapper.selectById(linkId);
- }
- @Override
- @Cacheable(value = LINKS_CACHE_NAME, key = "'links_count'")
- public Integer getCount() {
- return linkMapper.selectCount(null);
- }
- }
除了 @Cacheable、@CacheEvict之外,还有@CachePut,一般不用
查询一律用 @Cacheable,先从 Redis 查有没有这个 key,如果没有则执行方法里的代码,从数据库查询,并将结果存到 Redis 中。
@CacheEvict 可以指定删除某个 key,也可以删除 value 集合的所有 key。
三、Redis工具类
- package com.liuyanzhao.sens.utils;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.redis.core.StringRedisTemplate;
- import org.springframework.stereotype.Component;
- import java.util.Map;
- import java.util.Set;
- import java.util.concurrent.TimeUnit;
- /**
- * @author 言曌
- * @date 2018/12/16 下午6:57
- */
- @Component
- public class RedisUtil {
- @Autowired
- private StringRedisTemplate redisTemplate;
- // Key(键),简单的key-value操作
- /**
- * 实现命令:TTL key,以秒为单位,返回给定 key的剩余生存时间(TTL, time to live)。
- *
- * @param key
- * @return
- */
- public long ttl(String key) {
- return redisTemplate.getExpire(key);
- }
- /**
- * 实现命令:expire 设置过期时间,单位秒
- *
- * @param key
- * @return
- */
- public void expire(String key, long timeout) {
- redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
- }
- /**
- * 实现命令:INCR key,增加key一次
- *
- * @param key
- * @return
- */
- public long incr(String key, long delta) {
- return redisTemplate.opsForValue().increment(key, delta);
- }
- /**
- * 实现命令: key,减少key一次
- *
- * @param key
- * @return
- */
- public long decr(String key, long delta) {
- if(delta<0){
- // throw new RuntimeException("递减因子必须大于0");
- del(key);
- return 0;
- }
- return redisTemplate.opsForValue().increment(key, -delta);
- }
- /**
- * 实现命令:KEYS pattern,查找所有符合给定模式 pattern的 key
- */
- public Set<String> keys(String pattern) {
- return redisTemplate.keys(pattern);
- }
- /**
- * 实现命令:DEL key,删除一个key
- *
- * @param key
- */
- public void del(String key) {
- redisTemplate.delete(key);
- }
- // String(字符串)
- /**
- * 实现命令:SET key value,设置一个key-value(将字符串值 value关联到 key)
- *
- * @param key
- * @param value
- */
- public void set(String key, String value) {
- redisTemplate.opsForValue().set(key, value);
- }
- /**
- * 实现命令:SET key value EX seconds,设置key-value和超时时间(秒)
- *
- * @param key
- * @param value
- * @param timeout (以秒为单位)
- */
- public void set(String key, String value, long timeout) {
- redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
- }
- /**
- * 实现命令:GET key,返回 key所关联的字符串值。
- *
- * @param key
- * @return value
- */
- public String get(String key) {
- return (String) redisTemplate.opsForValue().get(key);
- }
- // Hash(哈希表)
- /**
- * 实现命令:HSET key field value,将哈希表 key中的域 field的值设为 value
- *
- * @param key
- * @param field
- * @param value
- */
- public void hset(String key, String field, Object value) {
- redisTemplate.opsForHash().put(key, field, value);
- }
- /**
- * 实现命令:HGET key field,返回哈希表 key中给定域 field的值
- *
- * @param key
- * @param field
- * @return
- */
- public String hget(String key, String field) {
- return (String) redisTemplate.opsForHash().get(key, field);
- }
- /**
- * 实现命令:HDEL key field [field ...],删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
- *
- * @param key
- * @param fields
- */
- public void hdel(String key, Object... fields) {
- redisTemplate.opsForHash().delete(key, fields);
- }
- /**
- * 实现命令:HGETALL key,返回哈希表 key中,所有的域和值。
- *
- * @param key
- * @return
- */
- public Map<Object, Object> hgetall(String key) {
- return redisTemplate.opsForHash().entries(key);
- }
- // List(列表)
- /**
- * 实现命令:LPUSH key value,将一个值 value插入到列表 key的表头
- *
- * @param key
- * @param value
- * @return 执行 LPUSH命令后,列表的长度。
- */
- public long lpush(String key, String value) {
- return redisTemplate.opsForList().leftPush(key, value);
- }
- /**
- * 实现命令:LPOP key,移除并返回列表 key的头元素。
- *
- * @param key
- * @return 列表key的头元素。
- */
- public String lpop(String key) {
- return (String) redisTemplate.opsForList().leftPop(key);
- }
- /**
- * 实现命令:RPUSH key value,将一个值 value插入到列表 key的表尾(最右边)。
- *
- * @param key
- * @param value
- * @return 执行 LPUSH命令后,列表的长度。
- */
- public long rpush(String key, String value) {
- return redisTemplate.opsForList().rightPush(key, value);
- }
- }
使用的时候只需要注入 RedisUtil,然后就可以简单操作 Redis
最终效果
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏