Redis工具

本文介绍了如何在Spring Boot项目中集成Redis,并通过RedisTemplate实现常见的缓存操作,如设置、获取、删除键值对,以及设置过期时间和处理列表、映射等数据结构。配置包括在pom.xml中添加依赖,编写RedisConfig配置类,定义RedisService接口及其实现类RedisServiceImpl。
摘要由CSDN通过智能技术生成

黑发不知勤学早,白首方悔读书迟

网上好多RedisUtil工具类,这里给大家展示用接口来实现,我们可以注入后直接调用:
注:
里面的方法并不全面,有没涉及到的方法可以进入到RedisTemplate看源码中的方法,然后写到接口中实现一下就可以使用。


例子:

  private RedisService redisService;
  public void redisTest(@RequestBody User user) {
        User user1 = new User("loveLetter", 18, "测试");
        boolean set = redisService.set(user.getId(), user1);
        System.out.println("Redis set key:" + set);
        System.out.println("Redis get key:"+redisService.get(user.getId()));
    }

控制台输出:
在这里插入图片描述


1、在pom里引入Maven依赖
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置RedisConfig
package com.loveletter.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author loveLetter
 * @create 2022/3/23
 */
@Configuration
public class RedisConfig {

    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate redisTemplate = new StringRedisTemplate();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        /**
         * 通用的序列化和反序列化设置
         * ObjectMapper类是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,反之亦然。
         */
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        // key序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}
3、新建RedisService
package com.loveletter.redis;

import java.util.List;
import java.util.Map;

/**
 * @author loveLetter
 * @create 2022/3/23
 */
public interface RedisService {
    /**
     * 批量删除
     *
     * @param keys key数组
     */
    public void remove(final String... keys);

    /**
     * 批量删除指定key
     *
     * @param pattern
     */
    public void removePattern(final String pattern);

    /**
     * 删除指定key
     *
     * @param key
     */
    public void remove(final String key);

    /**
     * 判断指定key是否存在
     *
     * @param key
     * @return
     */
    public boolean exists(final String key);

    /**
     * 设置key的过期时间(秒)
     *
     * @param key
     * @param expireTime
     */
    public void refreshExpireTime(final String key, Integer expireTime);

    /**
     * 获取指定key
     *
     * @param key
     * @return
     */
    public Object get(final String key);

    /**
     * 添加key-value(使用默认失效时间1天)
     *
     * @param key
     * @param value
     * @return
     */
    public boolean set(final String key, Object value);

    /**
     * 添加key-value(指定失效时间)
     *
     * @param key
     * @param value
     * @param expireTime 失效时间为null则永久生效(单位秒)
     * @return
     */
    public boolean set(final String key, Object value, Integer expireTime);

    /**
     * 插入list
     *
     * @param key
     * @param list
     * @param <T>
     */
    <T> boolean setList(String key, List<T> list);

    /**
     * 插入list
     *
     * @param key
     * @param list
     * @param expireTime
     * @param <T>
     */
    <T> boolean setList(String key, List<T> list, Integer expireTime);

    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @return
     */
    boolean lSet(String key, Object value);

    /**
     * 将list放入缓存
     *
     * @param key        键
     * @param value      值
     * @param expireTime 超时时间秒
     * @return
     */
    boolean lSet(String key, Object value, Integer expireTime);

    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @return
     */
    boolean rSet(String key, Object value);

    /**
     * 将list放入缓存
     *
     * @param key        键
     * @param value      值
     * @param expireTime 超时时间秒
     * @return
     */
    boolean rSet(String key, Object value, Integer expireTime);

    /**
     * 取list
     *
     * @param key
     * @param <T>
     * @return
     */
    <T> List<T> getList(String key);

    /**
     * 存储map
     *
     * @param key
     * @param map
     * @param expireTime 失效时间为null则永久生效(单位秒)
     * @return
     */
    public <K, HK, HV> boolean setMap(K key, Map<HK, HV> map, Integer expireTime);

    /**
     * 获取map
     *
     * @param key
     * @param <K>
     * @param <HK>
     * @param <HV>
     * @return
     */
    public <K, HK, HV> Map<HK, HV> getMap(final K key);

    /**
     * redis计数器
     *
     * @param key
     * @return
     */
    Integer incr(String key);
}
4、新建RedisServiceImpl
package com.loveletter.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @author loveLetter
 * @create 2022/3/23
 */
@Service
public class RedisServiceImpl implements RedisService {
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 一天有多少分钟,默认时间是一天
     */
    private static final Integer MINUTES_OF_ONE_DAY = 24 * 60;

    //private static ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 批量删除对应的value
     *
     * @param keys
     */
    @Override
    public void remove(final String... keys) {
        for (String key : keys) {
            remove(key);
        }
    }

    /**
     * 批量删除key
     *
     * @param pattern
     */
    @Override
    public void removePattern(final String pattern) {
        Set<Serializable> keys = redisTemplate.keys(pattern);
        if (keys.size() > 0) {
            redisTemplate.delete(keys);
        }
    }

    /**
     * 删除对应的value
     *
     * @param key
     */
    @Override
    public void remove(final String key) {
        if (exists(key)) {
            redisTemplate.delete(key);
        }
    }

    /**
     * 判断缓存中是否有对应的value
     *
     * @param key
     * @return
     */
    @Override
    public boolean exists(final String key) {
        return redisTemplate.hasKey(key);
    }

    /**
     * 更新缓存时间
     *
     * @param key
     * @param expireTime
     */
    @Override
    public void refreshExpireTime(final String key, Integer expireTime) {
        if (exists(key)) {
            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
        }
    }

    /**
     * 读取缓存
     *
     * @param key
     * @return
     */
    @Override
    public Object get(final String key) {
        Object result = null;
        ValueOperations<String, Object> operations = redisTemplate.opsForValue();
        result = operations.get(key);
        return result;
    }

    /**
     * 写入缓存
     *
     * @param key
     * @param value
     * @return
     */
    @Override
    public boolean set(final String key, Object value) {
        boolean result = false;
        try {
            ValueOperations<String, Object> operations = redisTemplate.opsForValue();
            operations.set(key, value);
            redisTemplate.expire(key, MINUTES_OF_ONE_DAY, TimeUnit.MINUTES);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 写入缓存
     *
     * @param key
     * @param value
     * @return
     */
    @Override
    public boolean set(final String key, Object value, Integer expireTime) {
        boolean result = false;
        try {
            ValueOperations<String, Object> operations = redisTemplate.opsForValue();
            operations.set(key, value);
            if (expireTime != null) {
                redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
            }
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 插入list
     *
     * @param key
     * @param list
     * @param <T>
     */
    @Override
    public <T> boolean setList(String key, List<T> list) {
        return setList(key, list, MINUTES_OF_ONE_DAY * 60);
    }

    @Override
    public <T> boolean setList(String key, List<T> list, Integer expireTime) {
        return set(key, list, expireTime);
    }

    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @return
     */
    @Override
    public boolean lSet(String key, Object value) {
        return lSet(key, value, 0);
    }

    /**
     * 将list放入缓存
     *
     * @param key        键
     * @param value      值
     * @param expireTime 超时时间秒
     * @return
     */
    @Override
    public boolean lSet(String key, Object value, Integer expireTime) {
        try {
            redisTemplate.opsForList().leftPush(key, value);
            if (expireTime > 0) {
                redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @return
     */
    @Override
    public boolean rSet(String key, Object value) {
        return lSet(key, value, 0);
    }
    
    /**
     * 将list放入缓存
     *
     * @param key        键
     * @param value      值
     * @param expireTime 超时时间秒
     * @return
     */
    @Override
    public boolean rSet(String key, Object value, Integer expireTime) {
        try {
            redisTemplate.opsForList().rightPush(key, value);
            if (expireTime > 0) {
                redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * 取list
     *
     * @param key
     * @param <T>
     * @return
     */
    @Override
    public <T> List<T> getList(String key) {
        Object jsonStr = get(key);
        if (jsonStr == null) {
            return null;
        }
        try {
            return (List<T>) jsonStr;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public <K, HK, HV> boolean setMap(K key, Map<HK, HV> map, Integer expireTime) {
        HashOperations<K, HK, HV> operations = redisTemplate.opsForHash();
        operations.putAll(key, map);

        if (expireTime != null) {
            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
        }
        return false;
    }

    @Override
    public <K, HK, HV> Map<HK, HV> getMap(final K key) {
        HashOperations<K, HK, HV> operations = redisTemplate.opsForHash();
        return operations.entries(key);
    }


    /**
     * redis计数器
     *
     * @param key
     * @return
     */
    @Override
    public Integer incr(String key) {
        ValueOperations<String, Object> ops = redisTemplate.opsForValue();
        try {
            //此方法会先检查key是否存在,存在+1,不存在先初始化,再+1
            ops.increment(key, 1);

            return (int) get(key);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return 0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值