redis工具类

SpringBoot Redis工具类封装 SpringBoot整合Redis的博客很多,但是很多都不是我想要的结果。因为我只需要整合完成后,可以操作Redis就可以了,并不需要配合缓存相关的注解使用(如@Cacheable)。看了很多博客后,我成功的整合了,并写了个Redis操作工具类。特意在此记录一下,方便后续查阅。 一、Maven依赖 1、本文所采用的SpringBoot的版本如下 <parent> &lt... 阅读详情
package com.yxb.common.redis;
import com.yxb.base.util.CommonUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Repository;
import java.util.*;
import java.util.concurrent.TimeUnit;


@Repository("redisDao")
public class RedisDao {
    @Autowired
    private StringRedisTemplate redisTemplate;

    private static Logger logger = LoggerFactory.getLogger(RedisDao.class);

    /**
     * 设置对象
     * */
    public <T> boolean set(String key,  T value) {
        boolean result = false;
        try {
            String str = CommonUtil.beanToString(value);
            ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
            valueOperations.set(key,str);
            result = true;
        }catch (Exception e){
            logger.error("redis set error key={},value={}",key,value,e);
        }
        return result;
    }

    /**
     * 带过期时间
     * @param key
     * @param value
     * @param timeout 过期时间(单位:秒)
     * @param <T>
     * @return
     */
    public <T> boolean set(String key,T value, Integer timeout){
        boolean result = false;
        String str = CommonUtil.beanToString(value);
        try {
            ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
            valueOperations.set(key,str,timeout.longValue(), TimeUnit.SECONDS);
            result = true;
        }catch (Exception e){
            logger.error("redis set error key={},value={},timeout={}",key,str,timeout,e);
        }
        return result;
    }

    //带过期时间类型
    public <T> boolean set(String key,T value,Integer timeout, TimeUnit unit){
        String str = CommonUtil.beanToString(value);
        try {
            ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
            valueOperations.set(key,str,timeout.longValue(),unit);
        }catch (Exception e){
            logger.error("redis set error key={},value={},timeout={},unit={}",key,str,timeout,unit,e);
            return false;
        }
        return true;
    }

    //通过key获取value
    public <T> T  get(String key,Class<T> clazz){
        String result = null;
        try{
            ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
            result = valueOperations.get(key);
        }catch (Exception e){
            logger.error("redis get error key={}",key,e);
        }
        T t = CommonUtil.stringToBean(result,clazz);
        return t;
    }

    //删除key
    public boolean del(String key){
        boolean result = false;
        try{
            redisTemplate.delete(key);
            result = true;
        }catch (Exception e){
            logger.error("redis del error key={}",key,e);
        }
        return result;
    }

    public boolean delCollection(Set<String> keys){
        boolean result = false;
        try{
            redisTemplate.delete(keys);
            result = true;
        }catch (Exception e){
            logger.error("redis delCollection error key={}",keys.toString(),e);
        }
        return result;
    }

    //判断key是否存在
    public boolean hasKey(String key){
        boolean result = false;
        try{
            result = redisTemplate.hasKey(key);
        }catch (Exception e){
            logger.error("redis hasKey error key = {}",key,e);
        }
        return result;
    }

    //递增   递减
    public long increment(String key, Integer delta){
        try{
            ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
            return valueOperations.increment(key, delta.longValue());
        }catch (Exception e){
            logger.error("redis increment error key = {}, delta = {}", key, delta, e);
        }
        return 0;
    }

    /**
     * 递增和递减  如果key在redis中不存在(即第一次往redis中放这个key),则设置该key的过期时间timeout
     * @param key
     * @param delta
     * @param timeout 单位是秒
     * @return
     */
    public long increment(String key, Integer delta, Integer timeout){
        try{
            boolean hasKey = false;
            if(!hasKey(key)){
                hasKey = true;
            }
            long value = increment(key, delta);
            if(hasKey){
                expire(key,timeout);
            }
            return value;
        }catch (Exception e){
            logger.error("redis increment error key = {}, delta = {}", key, delta, e);
        }
        return 0;
    }

    //设置key的过期时间
    public boolean expire(String key,Integer timeout){
        boolean result = false;
        try{
            redisTemplate.expire(key,timeout.longValue(),TimeUnit.SECONDS);
            result = true;
        }catch (Exception e){
            logger.error("redis expire error key = {}", key, e);
        }
        return result;
    }

    //设置key的过期时间(自定义时间单位)
    public boolean expire(String key, Integer timeout, TimeUnit timeUnit){
        boolean result = false;
        try{
            redisTemplate.expire(key,timeout.longValue(),timeUnit);
            result = true;
        }catch (Exception e){
            logger.error("redis expire error key = {}", key, e);
        }
        return result;
    }

    //获取key的过期时间 返回秒
    public long ttl(String key){
        try{
            long time = redisTemplate.getExpire(key,TimeUnit.SECONDS);
            return time;
        }catch (Exception e){
            logger.error("redis expire error key = {}", key, e);
        }
        return (long)0;
    }

    //--------------Map-----------------//
    //put整个map
    public boolean putAll(String key, Map map){
        boolean result = false;
        try{
            HashOperations<String, String, String> options = redisTemplate.opsForHash();
            options.putAll(key,map);
            result = true;
        }catch (Exception e){
            logger.error("redis putAll error key={},map={}",key,map,e);
        }
        return result;
    }
    //带过期时间   单位是秒
    public boolean putAll(String key, Map map,Integer timeout){
        boolean result = false;
        try{
            HashOperations<String, String, String> options = redisTemplate.opsForHash();
            options.putAll(key,map);
            redisTemplate.expire(key,timeout.longValue(),TimeUnit.SECONDS);
            result = true;
        }catch (Exception e){
            logger.error("redis putAll error key={},map={}",key,map,e);
        }
        return result;
    }
    //map中放单个键值对
    public  boolean put(String key,String hashKey,String hashValue){
        boolean result = false;
        try{
            HashOperations<String, String, String> options = redisTemplate.opsForHash();
            options.put(key,hashKey,hashValue);
            result = true;
        }catch (Exception e){
            logger.error("redis put error key={},hashKey={},hashValue={}",key,hashKey,hashValue,e);
        }
        return result;
    }
    //判断map中hashKey是否存在
    public boolean hasKey(String key,String hashKey){
        try{
            HashOperations<String, String, String> options = redisTemplate.opsForHash();
            return options.hasKey(key,hashKey);
        }catch (Exception e){
            logger.error("redis hasKey error key={},hashKey={}",key,hashKey,e);
        }
        return false;
    }
    //get  获取map中键的值
    public String getHashValue(String key,String hashKey){
        try{
            HashOperations<String, String, String> options = redisTemplate.opsForHash();
            return options.get(key,hashKey);
        }catch (Exception e){
            logger.error("redis get error key={},hashKey={}",key,hashKey,e);
        }
        return  null;
    }

    //multiGet 获取多个value
    public List<String> multiGet(String key, Collection<String> fields){
        try{
            HashOperations<String, String, String> options = redisTemplate.opsForHash();
            return options.multiGet(key,fields);
        }catch(Exception e){
            logger.error("redis multiGet error key={},hashKey={}",key,fields,e);
        }
        return null;
    }
    //delete 删除map中的key 可以是多个
    public long delete(String key,String... hashKeys){
        try{
            HashOperations<String, String, String> options = redisTemplate.opsForHash();
            return options.delete(key,hashKeys);
        }catch (Exception e){
            logger.error("redis delete error key={},hashKeys={}",key,hashKeys,e);
        }
        return 0;
    }
    //increment map中的key对应的value 做递增操作
    public long increment(String key,String hashKey,Integer delta){
        try {
            HashOperations<String, String, String> options = redisTemplate.opsForHash();
            return options.increment(key,hashKey,delta.longValue());
        }catch (Exception e){
            logger.error("redis delete error key={},hashKey={},delta={}",key,hashKey,delta,e);
        }
        return 0;
    }
    //keys 获取map中的所有的keys
    public Set<String> keys(String key){
        try{
            HashOperations<String, String, String> options = redisTemplate.opsForHash();
            return redisTemplate.keys(key);
//            return options.keys(key);
        }catch (Exception e){
            logger.error("redis keys error key={}",key,e);
        }
        return null;
    }

    //keys 获取map中的所有的map
    public Map<String,String> entries(String key){
        try{
            HashOperations<String, String, String> options = redisTemplate.opsForHash();
            return options.entries(key);
        }catch (Exception e){
            logger.error("redis keys error key={}",key,e);
        }
        return null;
    }

    /**
     * 往redis中放入set
     * @param key
     * @param time 过期时间 可传null null代表不设置过期时间
     * @param values
     * @return
     */
    public long sAdd(String key,Integer time,String... values){
        try{
            SetOperations<String,String> setOperations = redisTemplate.opsForSet();
            //the number of elements that were added to the set,
            // not including all the elements already present into the set.
            long n = setOperations.add(key,values);
            if(time != null){
                expire(key,time);
            }
            return n;
        }catch (Exception e){
            logger.error("redis set add error ",e);
        }
        return 0;
    }

    //判断value 是否是 keySet中的元素
    public boolean sIsMember(String key,String value){
        try{
            SetOperations<String,String> setOperations = redisTemplate.opsForSet();
            return setOperations.isMember(key,value);
        }catch (InvalidDataAccessApiUsageException e1){
            this.del(key);
        }catch(Exception e){
            logger.error("redis set sisMember error",e);
        }
        return false;
    }

    //redis set 移除
    public long sRem(String key,String... hashKeys){
        try {
            SetOperations<String,String> setOperations = redisTemplate.opsForSet();
            //the number of members that were removed from the set,
            // not including non existing members
            return setOperations.remove(key,hashKeys);

        }catch (Exception e){
            logger.error("redis set sRem error",e);
        }
        return 0;
    }

    //the cardinality (number of elements) of the set, or 0 if key does not exist.
    public long sCard(String key){
        try{
            SetOperations<String,String> setOperations = redisTemplate.opsForSet();
            long n = setOperations.size(key);
//            setOperations.members();
            return n;
        }catch(Exception e){
            logger.error("redis set sSize error ",e);
        }
        return 0;
    }

    /**
     * 返回当前key下的集合
     * @param key
     * @return
     */
    public Set<String> members(String key){
        Set<String> set = null;
        try {
            SetOperations<String, String> setOperations = redisTemplate.opsForSet();
            set = setOperations.members(key);
            return set;
        }catch (InvalidDataAccessApiUsageException e1){
            this.del(key);
        }catch(Exception e){
            logger.error("redis members sSize error ",e);
        }
        return set;
    }

    /****************************** ZSET start ************************/
    /**
     * 往zset中放入一个value
     * @param key redis的key
     * @param value redis中保存的value
     * @param score value对应的分值
     * @return
     */
    public boolean zAdd(String key,String value,double score){
        try{
            ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();
            return zSetOperations.add(key,value,score);
        }catch(Exception e){
            logger.error("redis zset zadd error e:{}",e);
        }
        return false;
    }

    /**
     * 从zset中删除一个value
     * @param key redis的key
     * @param value redis的key中要删除的value
     * @return
     */
    public boolean zRem(String key,String... value){
        try{
            ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();
            long row = zSetOperations.remove(key,value);
            return row > 0 ?true:false;
        }catch(Exception e){
            logger.error("redis zset remove error e:{}",e);
        }
        return false;
    }

    /**
     * 返回value在redis的key中的排名 有小到大的排名 分数最小的,排名为1
     * @param key redis中的key
     * @param value
     * @return
     */
    public long zRank(String key,String value){
        try{
            ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();
            return (zSetOperations.rank(key,value)+1);
        }catch(Exception e){
            logger.error("redis zset zRank error e:{}",e);
        }
        return 0;
    }

    /**
     * 返回value在redis的key中的排名,有大到小排名 分数最大的,排名为1
     * @param key redis中的key
     * @param value
     * @return
     */
    public long zRevRank(String key,String value){
        try{
            ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();
            Long res = zSetOperations.reverseRank(key,value);
            if(null == res){
                return 0;
            }else
                return res + 1;
        }catch(Exception e){
            logger.error("redis zset zRevRank error e:{}",e);
        }
        return 0;
    }

    /**
     * 返回redis的key中的成员数
     * @param key
     * @return
     */
    public long zCard(String key){
        try{
            ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();
            return zSetOperations.zCard(key);
        }catch (Exception e){
            logger.error("redis zset zCard error e:{}",e);
        }
        return 0;
    }

    /**
     * 在redis的key中对应的value 增加 delta分值
     * @param key
     * @param value
     * @param delta
     * @return
     */
    public double zIncrby(String key,String value,double delta){
        try{
            ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();
            return zSetOperations.incrementScore(key,value,delta);
        }catch (Exception e){
            logger.error("redis zset zCard error e:{}",e);
        }
        return 0;
    }


    public double zIncrby(String key,String value,double delta,Long secend){
        try{
            ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();
            double d = zSetOperations.incrementScore(key,value,delta);
            redisTemplate.expire(key,secend,TimeUnit.SECONDS);
        }catch (Exception e){
            logger.error("redis zset zCard error e:{}",e);
        }
        return 0;
    }

    /**
     * 返回redis的key中从start到end结束的集合 start,end表示的是下标 下标从0开始 返回的数据中包含下标为start和end的值
     * 其中-1代表最后一个成员,-2代表倒数第二个成员 start=0 end=-1 代表返回整个有序集合
     * 注意:该接口返回的是有小到大的排列顺序 如需返回有大到小 请调用 zRevrange 接口
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Set<String> zRange(String key,Integer start,Integer end){
        try{
            ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();
            return zSetOperations.range(key,start.longValue(),end.longValue());
        }catch (Exception e){
            logger.error("redis zset zRange error e:{}",e);
        }
        return new HashSet<String>();
    }

    public Map<String,Double> zRangeWithScores(String key,Integer start,Integer end){
        try{
            ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();
            Set<ZSetOperations.TypedTuple<String>> set = zSetOperations.rangeWithScores(key,start.longValue(),end.longValue());
            Map<String,Double> idAndScores = new HashMap<>();
            for (ZSetOperations.TypedTuple<String> z : set){
                idAndScores.put(z.getValue(),z.getScore());
            }
            return idAndScores;
        }catch (Exception e){
            logger.error("redis zset zRange error e:{}",e);
        }
        return new HashMap<>();
    }

    /**
     * 返回redis的key中从start到end结束的集合 start,end表示的是下标 下标从0开始 返回的数据中包含下标为start和end的值
     * 其中-1代表最后一个成员,-2代表倒数第二个成员 start=0 end=-1 代表返回整个有序集合
     * 注意:该接口返回的是有大到小的排列顺序 如需返回有小到大 请调用 zRange 接口
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Set<String> zRevrange(String key,Integer start,Integer end){
        try{
            ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();
            return zSetOperations.reverseRange(key,start.longValue(),end.longValue());
        }catch (Exception e){
            logger.error("redis zset zRange error e:{}",e);
        }
        return new HashSet<String>();
    }

    /**
     * 返回value在key中排名的分数值
     * @param key
     * @param value
     * @return
     */
    public double zScore(String key,String value){
        try{
            ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();
            Double db = zSetOperations.score(key,value);
            return db==null?0:db;
        }catch(Exception e){
            logger.error("redis zset zscore error e:{}",e);
        }
        return 0;
    }
    /****************************** ZSET end ************************/

    /******************************List start************************/
    /**
     * 类似于压栈操作,将元素放入头部
     * @param key
     * @param object
     * @return
     */
    public long leftPush(String key,Object object){
        try{
            ListOperations listOperations = redisTemplate.opsForList();
            long n = listOperations.leftPush(key,object);
            return n;
        }catch (Exception e){
            logger.error("redis leftPush  error e:{}",e);
        }
        return 0;
    }

    /**
     * 将元素push在list的尾部
     * @param key
     * @param object
     * @return
     */
    public long rightPush(String key,Object object){
        try{
            ListOperations listOperations = redisTemplate.opsForList();
            long n = listOperations.rightPush(key,object);
            return n;
        }catch (Exception e){
            logger.error("redis leftPush  error e:{}",e);
        }
        return 0;
    }

    /**
     * 删除尾部数据
     * @param key
     * @return
     */
    public Object rightPop(String key){
        try{
            ListOperations listOperations = redisTemplate.opsForList();
            Object o = listOperations.rightPop(key);
            return o;
        }catch (Exception e){
            logger.error("redis leftPush  error e:{}",e);
        }
        return null;
    }
    /**
     * 删除首位数据
     * @param key
     * @return
     */
    public Object leftPop(String key){
        try{
            ListOperations listOperations = redisTemplate.opsForList();
            Object o = listOperations.leftPop(key);
            return o;
        }catch (Exception e){
            logger.error("redis leftPop  error e:{}",e);
        }
        return null;
    }

    /**
     * 通过key和索引获取对象
     * @param key
     * @param index
     * @return
     */
    public Object getFromList(String key,Integer index){
        try{
            ListOperations listOperations = redisTemplate.opsForList();

            Object o = listOperations.index(key,index.longValue());
            return o;
        }catch (Exception e){
            logger.error("redis getFromList  error e:{}",e);
        }
        return null;
    }

    /**
     * 获取列表
     * @param key
     * @param start
     * @param end
     * @return
     */
    public List<Object> range(String key,Integer start,Integer end){
        try{
            ListOperations listOperations = redisTemplate.opsForList();
            List<Object> list = listOperations.range(key,start.longValue(),end.longValue());
            return list;
        }catch (Exception e){
            logger.error("redis range  error e:{}",e);
        }
        return null;
    }

    /**
     * 获取列表全部
     * @param key
     * @return
     */
    public List<Object> range(String key){
        try{
            ListOperations listOperations = redisTemplate.opsForList();
            List<Object> list = listOperations.range(key, 0, -1);
            return list;
        }catch (Exception e){
            logger.error("redis range  error e:{}",e);
        }
        return null;
    }

    /**
     * 删除集合指定元素
     * @param key 集合key
     * @param itme 集合中的指定元素
     * @return
     */
    public Long remove(String key, String itme) {
        try {
            ListOperations listOperations = redisTemplate.opsForList();
            Long removeNum = listOperations.remove(key, 0, itme);
            return removeNum;
        } catch (Exception e) {
            logger.error("redis range  error e:{}",e);
        }
        return 0l;
    }

    /**
     * 获取集合长度
     * @param key
     * @return
     */
    public Long size(String key){
        try{
            ListOperations listOperations = redisTemplate.opsForList();
            long n = listOperations.size(key);
            return n;
        }catch (Exception e){
            logger.error("redis size  error e:{}",e);
        }
        return null;
    }

    public Set<String> getKeysByLike(String cachePrefix) {
        return redisTemplate.keys(cachePrefix);
    }

    /**
     * 获取key类型
     * @param key
     * @return
     */
    public DataType getKeysType(String key) {
        return redisTemplate.type(key);
    }




}

Redis工具类实战应用——Fewyit Redis工具类全解析 在现代IT架构中,Redis作为高性能的键值存储系统,已经成为数据缓存和消息队列管理等场景的首选工具。它不仅支持多种数据类型如字符串、列表、集合、有序集合和哈希等,而且还提供了诸如事务、Lua脚本、发布/订阅等高级特性。掌握Redis,不仅能提高系统的性能,还可以极大地简化业务逻辑的实现。本文将深入探讨Redis的核心概念和使用方法,旨在为读者提供从入门到高级应用的全面指南。从连接管理到数据类型操作,再到高级特性和特定场景应用,我们将逐层深入,揭示Redis的强大功能和在实际项目中的应用技巧。 阅读详情

相关推荐

在Ubuntu上通过Wine完美运行企业微信的详细指南

本文提供了在Ubuntu系统上通过Wine兼容层安装和运行企业微信的详细教程。针对官方未提供Linux版本的痛点,指南推荐使用Ubuntu Kylin团队优化打包的Wine环境,通过简单的命令行步骤即可完成部署,并涵盖启动、中文输入法配置、文件管理等常见问题的解决方案,帮助用户实现高效、稳定的办公沟通。

weixin_29306317的博客 233

redis的存值,取值,删除,判断是否过期

在redis中保存产品线信息,避免每次查询都从数据库查询 //存list结构的数据 List<Product> list = productMapper.getList(); for(Product product:list){ redisDao.put(CommonConstant.REDIS_PRODUCTLIST, product.getS...

hit、run 4210

Windows10 搭建 FTP 服务器

问题: 有这么一个需求,博主需要对班级同学的信息进行收集,同学的信息是一个个的文件, 正常是每个同学将自己的信息打包压缩通过 QQ 或者邮箱方式发送给博主, 博主一个个接收这些压缩包,然后进行解压,再统一放到一个文件夹下, 但是博主觉得这样子实在是太麻烦了,如果某一个同学的信息来回变动,就需要接收很多次,更改很多次, 另外如果消息过多还会产生漏掉某个同学的信息的问题。 解决方法: 如果可以使...

assiduous_me的博客 3968

Redis缓存雪崩,穿透、multiGet 批量查询优化、pipeline 批量查询优化

一、缓存穿透的解决方案 为了演示缓存穿透,这里设置的redis是单机单实例。 二、缓存穿透之布隆过滤器 布隆过滤器能够迅速判断一个元素是否存在于集合里。 布隆过滤器缺点: 1.会有1%的误判率,误判概率越低,数组所占用的空间越长。 2.布隆过滤器的数据只能添加,不能移除,主要是由于多个数据可能存在于同一个位置,比如subCat:2、subCat:3。 3.维护起来比较麻烦,代码复杂。 三、缓存雪崩与预防 1.什么是缓存雪崩? 当在同一时刻缓存里有大量的key过期时间结束,此时有大

qq_39750835的博客 8909

OpenFOAM算例文件结构深度解析:以cavity案例为例教你读懂每个文件夹的作用

本文以OpenFOAM经典cavity案例为例,深度解析CFD算例文件结构。详细阐述了0、constant、system三个核心目录的作用:0存放初始与边界条件,constant定义物理属性和网格,system控制求解策略。通过剖析关键文件,帮助用户理解每个参数的意义,掌握从读懂到定制算例的能力,为高效使用这一开源CFD工具奠定坚实基础。

beer8的博客 241

自定义AOP实现注解式redis缓存

@Resource RedisCommonDao redisCommonDao; @Around("@annotation(appsinnovaCache)") public Object authentication(final ProceedingJoinPoint jp, AppsinnovaCache appsinnovaCache) throws Throwable { return this.aroundCacheMethod(jp,appsinno.

zhao19191919的博客 290

从SIGGRAPH审稿人视角看:什么样的TOG论文更容易被接收?

本文从SIGGRAPH审稿人视角深入解析TOG论文的审稿标准与投稿策略,揭示如何提升论文接收概率。重点探讨创新性、技术深度、实验验证等核心评分维度,并提供写作技巧与审稿意见应对策略,帮助研究者优化ACM Transactions on Graphics投稿质量。

weixin_33721344的博客 109

redis 学习(五)

redis常用数据操作方法: package com.tryke.api.common.dao.redis.impl; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.ut

qing 343

EMD (经验模态分解) 在 C++ 中的实现指南

EMD 是由 Norden E. Huang 等人在1998年提出的一种适用于非线性和非平稳信号的分析方法。对称性:IMF 的上下包络对称。零交叉点:IMF 的零交叉点数量与极值点数量相同或相差一个。本文详细介绍了如何在C++中实现EMD,包括理论背景、算法步骤、代码实现和优化等内容。通过丰富的代码示例和详细的解释,希望能够帮助读者掌握EMD的基本原理,并能够在实际项目中灵活应用。未来,随着信号处理技术的不断发展,EMD及其变种(如EEMD、CEEMDAN等)将继续在各个领域发挥重要作用。

qq_38334677的博客 1750

利用GAT(图论分析工具箱)构建并分析大脑结构协变网络学习笔记

前言 前面我学习了利用DTI构建白质纤维脑网络,并采用GRETNA计算了小世界网络属性。阅读文献发现可以利用灰质体积或皮层指标(皮层厚度、折叠指数、沟深)等构建结构协变网络再进行网络拓扑属性的计算。因此,我采用前面提取的灰质体积和皮质数据进行了结构协变网络分析,特此写下笔记以便后面的学习。 一、数据准备 二、构建结构协变网络 三、全局属性的统计分析 四、局部属性的统计分析 五、网络攻击分析 六、度的分布 ..................

weixin_52073820的博客 7498

Redis常用操作工具类---包含单例和集群模式

接口: import java.util.List; import java.util.Map; import java.util.Set; /** * @Author: lcx * @Date: Created at 2018/8/18 13:40. * @Description: */ public interface JedisCommonDao { /** ...

Java流浪记 2086

从 RAP OData 到可交付的 SAP Fiori 应用:部署与授权全链路实战笔记

摘要:本文探讨了RAP开发中常见的交付误区,指出开发者预览(FEAP)并非可部署应用,强调从服务发布到业务应用落地的完整链路。文章详细对比了不同部署路径(ABAP/BTP),解析权限管理关键点(SAP_BR_DEVELOPER的临时性),并提供了标准授权组合方案(IAM+业务目录+角色)。通过"发运跟踪"案例,展示了从开发验证到生产部署的全流程,特别提醒注意开发环境与生产环境的权限差异,避免"开发机正常、生产机403"的典型问题。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1402

Redis工具类

通过源码可以看出,SpringBoot自动帮我们在容器中生成了一个RedisTemplate和一个StringRedisTemplate。​ 看到这个**@ConditionalOnMissingBean注解后,就知道如果Spring容器中有了RedisTemplate对象了,这个自动配置的RedisTemplate不会实例化**。因此我们可以直接自己写个配置类,配置RedisTemplate。该注解核心作用是:当容器中不存在指定类型(或名称)的 Bean 时,才会创建当前注解标注的 Bean。代码如

2303_80236475的博客 929

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Redis操作工具类

核心Redis操作工具类RedisOperateUtil如下,主要包括Redis键(Key)、字符串(String)、哈希(Hash)、列表(List)、集合(Set)等常用的操作。

liwenyang1992的专栏 9625

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Redis工具类:RedisTemplate

/ hash的value序列化方式采用jackson第四步:创建JSON工具类try {return s;T t = null;

2501_90207129的博客 979

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

最全的Redis工具类

RedisUtil 介绍  最全的Java操作Redis的工具类,封装了对Redis五种基本类型的各种操作,力求符合Redis的原生操作,使用StringRedisTemplate实现! 快速导航: key命令操作 | String数据操作 | Hash数据操作 | List数据操作 | Set数据操作 | zSet数据操作 相关知识: Redis基础知识补充 | Spring集成Redis | ...

李意成的博客 3968

封装好的Redis工具类

文章目录redis工具类工具类一工具类二工具类三 redis工具类 工具类一 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; imp

weixin_63436826的博客 395

java redis 工具类_Java操作Redis工具类

packagejavax.utils;importjava.util.ArrayList;importjava.util.List;importredis.clients.jedis.JedisPoolConfig;importredis.clients.jedis.JedisShardInfo;importredis.clients.jedis.ShardedJedis;importredis....

weixin_36019798的博客 339

Redis连接操作工具类

在开发过程中使用Redis,每个人都写一套,很是不方便,下面奉上RedisUtil工具类,包含获取连接,获取资源,释放资源,String、对象保存、删除等等操作 下面上代码: package com.jane.framework.redis; import com.jane.framework.common.util.ConstantsConfigureBean; import com.jane.framework.common.util.SpringContextUtil; import org.apa

庸人1396 972
上一篇: 加密的工具类SecurityUtil
下一篇: 公共的工具类CommonUtil
hit、run
博客等级 码龄10年 163粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值