记录一次springboot中RedisTemplate使用的过程

先配置RedisTemplate<String, Object>

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate<String, Object> configRedisTemplate = new RedisTemplate<>();
    configRedisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
    configRedisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
    configRedisTemplate.setKeySerializer(new StringRedisSerializer());
    configRedisTemplate.setHashKeySerializer(new StringRedisSerializer());
    configRedisTemplate.setConnectionFactory(redisConnectionFactory);
    return configRedisTemplate;
}

再自定义一个RedisCacheManager,可以使用CachePut或其他注解自定义过期时间,例如@CachePut(cacheNames = Constant.RedisKeyPrefix.DEVICE_ITEM + "#600000", key = "#device.id")

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.cache.RedisCache;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;

import java.lang.reflect.Field;
import java.time.Duration;

/**
 * @author yiChuYun_lq
 * @date 2019/7/4 14:47
 * @since 1.0.0
 */
@Slf4j
public class CustomizeRedis extends RedisCacheManager {

    private RedisCacheConfiguration cacheConfig;

    public CustomizeRedis(RedisCacheWriter cacheWriter, RedisCacheConfiguration cacheConfig) {
        super(cacheWriter, cacheConfig, true);
        this.cacheConfig = cacheConfig;
    }

    @Override
    protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
        String[] values = name.split("#");
        long expiration = computeExpiration(values);
        if (cacheConfig == null) cacheConfig = this.cacheConfig;
        if (expiration > -1) {
            Class<? extends RedisCacheConfiguration> cacheConfigClass = cacheConfig.getClass();
            try {
                Field ttl = cacheConfigClass.getDeclaredField("ttl");
                ttl.setAccessible(true);
                ttl.set(cacheConfig, Duration.ofSeconds(expiration));
            } catch (NoSuchFieldException | IllegalAccessException e) {
                log.error(e.getMessage());
            }
        }
        return super.createRedisCache(values[0], cacheConfig);
    }

    private long computeExpiration(String[] values) {
        if (values.length > 1) {
            return Long.parseLong(values[1]);
        }
        return -1;
    }

}

再使用自定义的RedisCacheManager

@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
    return new CustomizeRedis(RedisCacheWriter.lockingRedisCacheWriter(factory), RedisCacheConfiguration.defaultCacheConfig());
}

在定义一个Redis工具类RedisUtils

import com.fansmore.api.common.Constant;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.concurrent.TimeUnit;

public class RedisUtils {
    public static RedisTemplate<String, Object> getRedis() {
        return SpringUtils.getBean("redisTemplate");
    }

    /*返回-1为永不过期,-2未已过期或不存在*/
    public static Long getExpire(String token) {
        return getExpire(token, TimeUnit.SECONDS);
    }

    public static Long getExpire(String token, TimeUnit unit) {
        return getRedis().getExpire(token, unit);
    }

    public static boolean isExpire(String token) {
        Long expire = getExpire(token);
        return Constant.RedisExpireKey.EXPIRE == expire;
    }

    public static Object getCache(String token) {
        if (token == null) token = "";
        return getRedis().opsForValue().get(token);
    }

    public static void setCache(String token, Object obj) {
        setCache(token, obj, 0);
    }

    public static void setCache(String token, Object obj, long expire) {
        setCache(token, obj, expire, null);
    }

    public static void setCache(String token, Object obj, long expire, TimeUnit unit) {
        if (expire > 0) {
            if (unit == null) {
                getRedis().opsForValue().set(token, obj, expire, TimeUnit.MILLISECONDS);
            } else {
                getRedis().opsForValue().set(token, obj, expire, unit);
            }
        } else {
            getRedis().opsForValue().set(token, obj);
        }
    }

    public static void delCache(String token) {
        getRedis().delete(token);
    }
}

 

最后就可以辛苦的码代码了,注意一些坑,设置了过期时间,必须指定时间单位,不然反序列化会出现问题。

最后附上一些常用的redis-cli命令

连接服务器redis-cli -h IP地址 -p 端口

授权 auth 密码

查看key使用keys *key*

查看过期时间ttl ttl key,返回-1代表永不过期,返回-2代表已过期或不存在

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值