Springboot配置单节点Redis和工具类的封装

Redis是我们常用的高速NoSql数据库,重要性毋庸赘言,本文介绍一下如何快速的在Springboot中集成单节点的Redis。

  1. 添加POM文件依赖:
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
  1. 在application.properties文件中配置连接信息和连接池信息,注意如果Redis没有配置连接密码,则spring.redis.password配置为空:
#Redis配置
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.timeout=2000ms

# redis连接池配置
spring.redis.jedis.pool.max-active=200
spring.redis.jedis.pool.min-idle=20
spring.redis.jedis.pool.max-wait=3000ms
  1. 自定义Redis的配置类(此步骤建议添加,可以自定义序列化方式等):
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfiguration {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer<Object> jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jsonRedisSerializer.setObjectMapper(objectMapper);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

本文定义的序列化方式使用了Jackson包,您可以跟实际情况酌情修改。

  1. 在Springboot的入口点添加注解@ServletComponentScan,用于扫描步骤3添加的RedisConfiguration
@SpringBootApplication
@ServletComponentScan
@EnableConfigurationProperties
public class FoundationApplication {

    public static void main(String[] args) {
        ApplicationContext applicationContext = SpringApplication.run(FoundationApplication.class, args);
        new SpringUtils().setApplicationContext(applicationContext);
    }
}
  1. Redis工具类的封装,这里没有什么好说的,上代码:
import org.cicada.chtp.foundation.common.chtplogger.ChtpLogger;
import org.cicada.chtp.foundation.common.utils.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Component
public class RedisProvider {

    private final RedisTemplate<String, Object> redisTemplate;
    private static final ChtpLogger logger = ChtpLogger.getLogger(RedisProvider.class);

    @Autowired
    public RedisProvider(RedisTemplate<String, Object> redisTemplate){
        this.redisTemplate = redisTemplate;
    }

    /**
     * 设置失效时间
     *
     * @param key 欲设置失效时间的键
     * @param time 失效时间,单位为秒
     */
    public void expire(String key, long time){
        try{
            if(key == null){
                logger.error("设置过期时间出错: Key值为null");
            }
            else if(time <= 0){
                logger.error("设置过期时间出错: 过期时间必须大于0");
            }
            else {
                this.redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
        }
        catch (Exception e){
            logger.error("设置过期时间出错:" + key, e);
        }
    }

    /**
     * 查询某个键的失效时间
     *
     * @param key 欲查询失效时间的键
     * @return expire 返回指定键的失效时间
     */
    public long getExpireTime(String key){
        long expire = 0;
        try{
            if(key == null){
                logger.error("获取过期时间出差: Key值为null");
            }
            else {
                Object object = redisTemplate.getExpire(key);
                expire = object != null ? (long)object : 0;
            }
        }
        catch (Exception e){
            logger.error("获取过期时间出错:" + key, e);
        }
        return expire;
    }

    /**
     * 查询键是否存在
     *
     * @param key 欲查询的键
     * @return 返回是否存在
     */
    public boolean hasKey(String key){
        boolean has = false;
        try{
            if (key != null){
                Object object = this.redisTemplate.hasKey(key);
                has = object != null && (boolean) object;
            }
            else {
                logger.error("查询键是否存在出错: Key值为null");
            }
        }
        catch (Exception e){
            logger.error("查询键是否存在出错:" + key, e);
        }
        return has;
    }

    /**
     * 删除数据
     * @param keys 欲删除键的数组
     */
    public void delete(String...keys){
        try {
            if(keys != null && keys.length > 0){
                if(keys.length == 1){
                    this.redisTemplate.delete(keys[0]);
                }
                if (keys.length > 1){
                    this.redisTemplate.delete(CollectionUtils.arrayToList(keys));
                }
            }
            else {
                logger.error("删除键出错: 键为空");
            }
        }
        catch (Exception e){
            logger.error("删除键出错:" + Arrays.toString(keys), e);
        }
    }

    /**
     * 获取普通数据
     * @param key 数据的键
     * @return Object
     */
    public Object get(String key){
        Object object = null;
        try {
            if (key != null){
                object = this.redisTemplate.opsForValue().get(key);
            }
            else {
                logger.error("获取值出错: 键为空");
            }
        }
        catch (Exception e){
            logger.error("获取值出错:" + key, e);
        }
        return object;
    }

    /**
     * 插入普通数据
     * @param key 数据的键
     * @param value 数据的值
     */
    public boolean set(String key, Object value){
        boolean setResult = false;
        try {
            if(key == null){
                logger.error("插入值出错: 键为空");
            }
            else if (value == null){
                logger.error("插入值出错: 值为空");
            }
            else {
                this.redisTemplate.opsForValue().set(key, value);
                setResult = true;
            }
        }
        catch (Exception e){
            logger.error("插入值出错:" + key, e);
        }
        return setResult;
    }

    /**
     * 插入普通数据的同时设置过期时间
     * @param key 数据的键
     * @param value 数据的值
     * @param time 数据的过期时间
     */
    public boolean set(String key, Object value, long time){
        boolean setResult = false;
        try {
            if(key == null){
                logger.error("插入值出错: 键为空");
            }
            else if (value == null){
                logger.error("插入值出错: 值为空");
            }
            else if (time <= 0){
                logger.error("插入值出错: 有效期小于0");
            }
            else {
                this.redisTemplate.opsForValue().set(key, value, time);
                setResult = true;
            }
        }
        catch (Exception e){
            logger.error("插入值出错:" + key, e);
        }
        return setResult;
    }

    /**
     * hget
     * @param key Redis的键
     * @param item 哈希的键
     *
     */
    public Object hget(String key, String item){
        Object object = null;
        try {
            if(key == null){
                logger.error("获取哈希出错: 键为空");
            }
            else if (item == null){
                logger.error("获取哈希出错: 项为空");
            }
            else {
                object = this.redisTemplate.opsForHash().get(key, item);
            }
        }
        catch (Exception e){
            logger.error("获取哈希出错: Key:" + key + ", Item: " + item, e);
        }
        return object;
    }


    public Map<Object, Object> hmget(String key){
        Map<Object, Object> map = null;
        try {
            if(key == null){
                logger.error("获取哈希出错: 键为空");
            }
            else {
                map = this.redisTemplate.opsForHash().entries(key);
            }
        }
        catch (Exception e){
            logger.error("获取哈希出错: Key:" + key, e);
        }
        return map;
    }

    public boolean hmset(String key, Map<Object, Object> map){
        boolean setResult = false;
        try {
            if(key == null){
                logger.error("存储哈希出错: 键为空");
            }
            else if(map == null){
                logger.error("存储哈希出错: 值为空");
            }
            else {
                this.redisTemplate.opsForHash().putAll(key, map);
                setResult = true;
            }
        }
        catch (Exception e){
            logger.error("存储哈希出错: Key:" + key, e);
        }
        return setResult;
    }

    public boolean hset(String key, String item, Object value){
        boolean setResult = false;
        try {
            if(key == null){
                logger.error("存储哈希出错: 键为空");
            }
            else if(item == null){
                logger.error("存储哈希出错: 项为空");
            }
            else if(value == null){
                logger.error("存储哈希出错: 值为空");
            }
            else {
                this.redisTemplate.opsForHash().put(key, item, value);
                setResult = true;
            }
        }
        catch (Exception e){
            logger.error("设置哈希出错: Key:" + key, e);
        }
        return setResult;
    }

    public void hdel(String key, Object...item){
        try {
            if(key == null){
                logger.error("删除哈希出错: 键为空");
            }
            else if(item == null){
                logger.error("删除哈希出错: 项为空");
            }
            else {
                this.redisTemplate.opsForHash().delete(key, item);
            }
        }
        catch (Exception e){
            logger.error("删除哈希出错: Key:" + key, e);
        }
    }

    public boolean hHasKey(String key, String item){
        boolean has = false;
        try{
            if(key == null){
                logger.error("查找哈希出错: 键为空");
            }
            else if(item == null){
                logger.error("查找哈希出错: 项为空");
            }
            else {
                has = this.redisTemplate.opsForHash().hasKey(key, item);
            }
        }
        catch (Exception e){
            logger.error("查找哈希出错: Key:" + key, e);
        }
        return has;
    }

    public Set<Object> sGet(String key){
        Set<Object> set = null;
        try{
            if(key == null){
                logger.error("查询Set出错: 键为空");
            }
            else {
                set = this.redisTemplate.opsForSet().members(key);
            }
        }
        catch (Exception e){
            logger.error("查询Set出错: Key:" + key);
        }
        return set;
    }

    public long sSet(String key, Object...values){
        long successNum = 0;
        try{
            if(key == null){
                logger.error("存储Set出错: 键为空");
            }
            else if(values == null){
                logger.error("存储Set出错: 值为空");
            }
            else {
                Object object = this.redisTemplate.opsForSet().add(key, values);
                successNum = object != null ? (long)object : 0;
            }
        }catch (Exception e){
            logger.error("存储Set出错: Key:" + key, e);
        }
        return successNum;
    }

    public long sGetSize(String key){
        long size = 0;
        try {
            if(key == null){
                logger.error("获取Set尺寸出错: 键为空");
            }
            else {
                Object object = this.redisTemplate.opsForSet().size(key);
                size = object != null ? (long)object : 0;
            }
        }
        catch (Exception e){
            logger.error("获取Set尺寸出错: Key:" + key, e);
        }
        return size;
    }

    public long setRemove(String key, Object...values){
        long successNum = 0;
        try {
            if(key == null){
                logger.error("删除Set出错: 键为空");
            }
            else if (values == null){
                logger.error("删除Set出错: 值为空");
            }
            else {
                Object object = this.redisTemplate.opsForSet().remove(key, values);
                successNum = object != null ? (long)object : 0;
            }
        }
        catch (Exception e){
            logger.error("删除Set出错: Key:" + key, e);
        }
        return successNum;
    }

    /**
     * 查询List的值,范围为(0, -1)代表所有
     * @param key 键
     * @param start 开始
     * @param end 结束
     * @return 返回查询到的List
     */
    public List<Object> lGet(String key, long start, long end){
        List<Object> list = null;
        try {
            if(key == null){
                logger.error("查询List出错: 键为空");
            }

            else {
                list = this.redisTemplate.opsForList().range(key, start, end);
            }
        }
        catch (Exception e){
            logger.error("查询List出错: Key:" + key, e);
        }
        return list;
    }

    public long lGetListSize(String key){
        long size = 0;
        try {
            if(key == null){
                logger.error("获取List尺寸出错: 键为空");
            }
            else {
                Object object = this.redisTemplate.opsForList().size(key);
                size = object != null ? (long)object : 0;
            }
        }
        catch (Exception e){
            logger.error("获取List尺寸出错: Key:" + key, e);
        }
        return size;
    }

    /**
     * 通过索引查询List的中数据
     * @param key 键
     * @param index 索引,当索引大于等于0时,0代表表头,1代表第二个元素;当索引小于0时,-1代表表尾,-2代表倒数第二个元素
     * @return 值
     */
    public Object lGetByIndex(String key, long index){
        Object object = null;
        try{
            if(key == null){
                logger.error("通过Index获取List中数据出错: 键为空");
            }
            else{
                object = this.redisTemplate.opsForList().index(key, index);
            }
        }
        catch (Exception e){
            logger.error("通过Index获取List中数据出错: Key:" + key, e);
        }
        return object;
    }

    public boolean lSet(String key, Object value){
        boolean setResult = false;
        try{
            if(key == null){
                logger.error("写入List出错: 键为空");
            }
            else if (value == null){
                logger.error("写入List出错: 值为空");
            }
            else {
                this.redisTemplate.opsForList().rightPush(key, value);
                setResult = true;
            }
        }
        catch (Exception e){
            logger.error("写入List出错: Key:" + key, e);
        }
        return setResult;
    }

    public boolean lSet(String key, List<Object> values){
        boolean setResult = false;
        try{
            if(key == null){
                logger.error("写入List出错: 键为空");
            }
            else if (values == null){
                logger.error("写入List出错: 值为空");
            }
            else {
                this.redisTemplate.opsForList().rightPushAll(key, values);
                setResult = true;
            }
        }
        catch (Exception e){
            logger.error("写入List出错: Key:" + key, e);
        }
        return setResult;
    }

    public boolean lUpdateByIndex(String key, long index, Object value){
        boolean setResult = false;
        try{
            if(key == null){
                logger.error("更新List出错: 键为空");
            }
            else {
                this.redisTemplate.opsForList().set(key, index, value);
                setResult = true;
            }
        }
        catch (Exception e){
            logger.error("更新List出错: Key:" + key, e);
        }
        return setResult;
    }

    /**
     * 移除N个值为value
     * @param key 键
     * @param count 移除多少个
     * @param value 值
     * @return 移除的个数
     */
    public long lRemove(String key, long count, Object value){
        long successNum = 0;
        try{
            if(key == null){
                logger.error("移除List出错: 键为空");
            }
            else if(value == null){
                logger.error("移除List出错: 值为空");
            }
            else {
                Object object = this.redisTemplate.opsForList().remove(key, count, value);
                successNum = object != null ? (long)object : 0;
            }
        }
        catch (Exception e){
            logger.error("移除List出错: Key:" + key, e);
        }
        return successNum;
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355