SpringBoot整合Redis及Redis工具类_大弦小弦错杂弹的博客-程序员宅基地_springboot整合redis及工具类

技术标签: spring boot  java  redis  

一、Maven依赖

 <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-data-redis</artifactId>

 </dependency> 

二、application.yml中加入redis相关配置

 spring: 
  ## Redis 配置
  redis:
    ## Redis数据库索引(默认为0)
    database: 0
    ## Redis服务器地址
    host: localhost
    ## Redis服务器连接端口
    port: 6379
    ## Redis服务器连接密码(默认为空)
    password: root
    jedis:
      pool:
        ## 连接池最大连接数(使用负值表示没有限制)
        #spring.redis.pool.max-active=8
        max-active: 8
        ## 连接池最大阻塞等待时间(使用负值表示没有限制)
        #spring.redis.pool.max-wait=-1
        max-wait: -1
        ## 连接池中的最大空闲连接
        #spring.redis.pool.max-idle=8
        max-idle: 8
        ## 连接池中的最小空闲连接
        #spring.redis.pool.min-idle=0
        min-idle: 0
    ## 连接超时时间(毫秒)
    timeout: 1200

三、写一个redis配置类

SpringBoot自动帮我们在容器中生成了一个RedisTemplate和一个StringRedisTemplate。但是,这个RedisTemplate的泛型是<Object,Object>,写代码不方便,需要写好多类型转换的代码;我们需要一个泛型为<String,Object>形式的RedisTemplate。并且,这个RedisTemplate没有设置数据存在Redis时,key及value的序列化方式。

重新配置一个RedisTemplate

package org.example.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
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.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {

        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 配置连接工厂
        template.setConnectionFactory(factory);

        //序列化和反序列化redis中的值
        Jackson2JsonRedisSerializer jackson = new Jackson2JsonRedisSerializer(Object.class);
        //Java对象转换成JSON结构
        ObjectMapper objectMapper = new ObjectMapper();
        // 指定要序列化的域
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化输入的类型
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson.setObjectMapper(objectMapper);

        // 值采用json序列化
        template.setValueSerializer(jackson);
        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());

        // 设置hash key和value序列化模式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(jackson);
        template.afterPropertiesSet();

        return template;
    }

}

四、写一个Redis工具类

 直接用RedisTemplate操作Redis,需要很多行代码,因此直接封装好一个RedisUtils,这样写代码更方便点。这个RedisUtils交给Spring容器实例化,使用时直接注解注入。

        工具类代码如下:

package org.example.Util;

import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    //===============缓存相关方法===============

    //指定缓存失效时间
    public boolean expire(String key, long time) {
        try {
            if (time > 0) {
                redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    //根据key获取过期时间,返回0代表为永久有效
    public long getExpire(String key) {
        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
    }

    //===============数据类型为String的相关方法===============

    //根据key值获取缓存值
    public Object stringGet(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }

    //根据key值存入数据类型为String的缓存值
    public boolean stringSet(String key, Object value) {
        try {
            redisTemplate.opsForValue().set(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    //根据key值存入数据类型为String的缓存值并设置时间
    public boolean stringSetWithTime(String key, Object value, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
            } else {
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    //删除缓存
    public void stringDelete(String... key) {
        if (key != null && key.length > 0) {
            if (key.length == 1) {
                redisTemplate.delete(key[0]);
            } else {
                redisTemplate.delete((Collection<String>) CollectionUtils.arrayToList(key));
            }
        }
    }

    //===============数据类型为Hash的相关方法===============

    //根据key和item获取缓存值
    public Object hashGet(String key, String item) {
        return redisTemplate.opsForHash().get(key, item);
    }

    //根据key和item存入数据类型为Hash的缓存值
    public boolean hashSet(String key, String item, Object value) {
        try {
            redisTemplate.opsForHash().put(key, item, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    //根据key和item存入数据类型为Hash的缓存值并设置时间
    public boolean hashSetWithTime(String key, String item, Object value, long time) {
        try {
            redisTemplate.opsForHash().put(key, item, value);
            if (time > 0) {
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    //删除缓存
    public void hashDelete(String key, Object... item) {
        redisTemplate.opsForHash().delete(key, item);
    }

    //===============数据类型为SET的相关方法===============

    //根据key值获取缓存值
    public Set<Object> setGet(String key) {
        try {
            return redisTemplate.opsForSet().members(key);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    //根据key值存入数据类型为SET的缓存值
    public long setSet(String key, Object... values) {
        try {
            return redisTemplate.opsForSet().add(key, values);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    //根据key值存入数据类型为SET的缓存值并设置时间
    public long setSetWithTime(String key, long time, Object... values) {
        try {
            Long count = redisTemplate.opsForSet().add(key, values);
            if (time > 0) {
                expire(key, time);
            }
            return count;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    //删除缓存
    public long setDelete(String key, Object... values) {
        try {
            Long count = redisTemplate.opsForSet().remove(key, values);
            return count;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    //===============数据类型为LIST的相关方法===============
    //获取List缓存的内容,从start到end,若从0到-1代表所有值
    public List<Object> listGet(String key, long start, long end) {
        try {
            return redisTemplate.opsForList().range(key, start, end);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    //根据key值存入数据类型为List的缓存值
    public boolean listSet(String key, Object value) {
        try {
            redisTemplate.opsForList().rightPush(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    //根据key值存入数据类型为List的缓存值并设置时间
    public boolean listSetWithTime(String key, Object value, long time) {
        try {
            redisTemplate.opsForList().rightPush(key, value);
            if (time > 0) {
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    //删除缓存
    public long listDelete(String key, long count, Object value) {
        try {
            Long remove = redisTemplate.opsForList().remove(key, count, value);
            return remove;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }


}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43794465/article/details/120353443

智能推荐

python怎么测试一个网站的延迟_python 实现ping测试延迟的两种方法_奶油甜甜圈的博客-程序员宅基地

一.python实现ping返回延迟繁琐版#!/usr/bin/python3.7# !coding:utf-8__author__ = "hsz"__date__ = "Thu Feb 27 22:41:15 EST 2020"import timeimport structimport socketimport selectimport sysdef chesksum(data):"""校验"...

Git学习之二 git常用一些常用命令_dylan13531的博客-程序员宅基地

git一些常用命令git checkout + 文件名上次说过,git reset head + 文件名 是将暂存区的文件取消暂存,这个地方不是很好理解,再举个例子:1、我们有一个文件提交到版本区叫test.txt;2、这时候我删除文件并提交到暂存区,此时工作区没有test.txt文件,暂存区有test.txt文件;3、我想将暂存区的内容恢复到工作区,怎么做呢?➜ gitTest g...

awk-sed_weixin_30593443的博客-程序员宅基地

1. awk 模式扫描和处理语言 1.1 awk常用选项 1.2 awk示例 1.2.1 抽取2列 1.2.2 tab键分割列 1.2.3 筛选包含.html的行 1.2.4 添加标题,添加内容,上面添加的内容被认为为1个字段,没有tab分割 1.2.5 拆分 1.2.6 统计 1.2.7 统计各个connection状态 1.2.8 每...

区块链分叉如何解决_新手必看 | 区块链分叉是怎么回事?_weixin_39910523的博客-程序员宅基地

近期,话说链圈和币圈相当火,链圈总是开会、上课,币圈自然就是“炒币”了,无论是否权圈中人,都为此乐此不疲。而今天我们要说的是区块链的分叉。这又是一个既与链圈密切相关,又和币圈不可分割的话题。如何理解分叉?其实说到区块链中的分叉,只要从它的英文上就能知道含义,即fork。非常形象,就是“叉子”,意思就是岔路及分支含义。那区块链为什么会分叉呢?这可以从区块链的结构着手,各个区块之间被链接在一起,同时通...

mysql两句sql先后执行_MySQL——SQL语句执行顺序_王司图的博客-程序员宅基地

一、SQL 语句关键字的执行顺序查询:姓名不同人员的最高工资,并且要求大于5000元,同时按最大工资进行排序并取出前5条.select name, max(salary)frompersonwhere name is not nullgroup bynamehaving max(salary) &gt; 5000order by max(salary)limit0,5在上面的示例中 SQL 语句的...

读取本地json文件_九月十九的博客-程序员宅基地_读取本地json文件

1,读取文件的公共方法。public static String readJsonFile(String fileName) { String jsonStr = ""; try { File jsonFile = new File(fileName); FileReader fileReader = new FileReader(jsonFile); Reader reader = new Inp...

随便推点

Android VLC播放器二次开发1——程序结构分析_blueangle17的博客-程序员宅基地

最近因为一个新项目需要一个多媒体播放器,所以需要做个视频、音频、图片方面的播放器。也查阅了不少这方面的资料,如果要从头做一个播放器工作量太大了,而且难度也很大。所以最后选择了VLC作为基础,进行二次开发。选择VLC的原因有两个,第一:VLC在其他平台很成熟,解码器方面支持很完善。第二:VLC已经实现了完整的视频播放和音频播放功能。开发速度可以加快很多。  下面给出两张截图,主要是为了方便后

(二)脏数据的预防及处理_weixin_30359021的博客-程序员宅基地

推荐原文:https://www.jianshu.com/p/0078e5dd1e61(啊···我的排版好垃圾·····)如何处理已产生的脏数据?有那么多预防脏数据产生的方法,但相信脏数据的产生还是在所难免的。脏数据一旦产生,导致的系统行为也是不可预测的,可能无足轻重,也可能暴露非常严重的缺陷。该如何应对产生的脏数据呢?脏数据产生以后有两种存在形式,一种是已经引起某些问题被...

mysql服务器的HA集群之corosync+drbd+pacemaker实现-下篇_weixin_33969116的博客-程序员宅基地

案例应用:红帽企业群集和存储管理之mysql服务器的HA集群之corosync+drbd+pacemaker实现-下篇上篇地址:http://xjzhujunjie.blog.51cto.com/3582724/886317接上篇!!!五.群集管理5.1 配置群集的工作属性corosync默认启用了stonith,而当前集群并没有相应...

[转]帧中继术语_weixin_33923148的博客-程序员宅基地

http://hi.baidu.com/luke0756/blog/item/ddc2d013a8155726dd5401de.htmlhttp://www.chinaitpower.com/2005September/2005-09-13/208211.html4.Frame-Relay(帧中继)4.1)FR:包交换网络,或者分组交换网络,共享带宽,...

微信小程序的自制聊天框_希帆的博客-程序员宅基地_微信小程序聊天框

作者:刘旭濠在之前的小程序开发学习中,弄了一个小程序的拍照功能(虽然跟那些大老比不了,不过也好歹是自己弄出来的小程序也很开心了)现在就了一个仿聊天框的就聊天框,当然也可以和别人聊天 我这个还弄完整只能发图片下面的文本框还没调试好。 import java.applet。*;import java.awt.*;import java.io. *;import java.net.*;im...

推荐文章

热门文章

相关标签