iava redis工具类

2023-10-26

redis工具类

package com.customerNoPlatform.configs;

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

import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import lombok.extern.slf4j.Slf4j;

import javax.annotation.Resource;

@Component
@Slf4j
public class RedisUtil {
	//锁名称
    public static final String LOCK_PREFIX = "redis_lock";
    //加锁失效时间,毫秒
    public static final int LOCK_EXPIRE = 300; // ms
    
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    //=============================common============================  

    /**
     * 指定缓存失效时间
     *
     * @param key  键
     * @param time 时间(秒)
     * @return
     */
    public boolean expire(String key, long time) {
        try {
            if (time > 0) {
                redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            log.info("指定redis缓存失效时间成功,key:{},time:{}",key,time);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            log.info("指定redis缓存失效时间失败,key:{},time:{}",key,time);
            return false;
        }
    }

    /**
     * 根据key 获取过期时间
     *
     * @param key 键 不能为null
     * @return 时间(秒) 返回0代表为永久有效
     */
    public long getExpire(String key) {
    	long time=redisTemplate.getExpire(key, TimeUnit.SECONDS);
        log.info("根据key获取redis缓存失效时间,key:{},time:{}",key,time);
        return time;
    }

    /**
     * 判断key是否存在
     *
     * @param key 键
     * @return true 存在 false不存在
     */
    public boolean hasKey(String key) {
        try {
        	boolean flag=redisTemplate.hasKey(key);
        	log.info("判断redis是否包含key,key:{},return:{}",key,flag);
            return flag;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 删除缓存
     *
     * @param key 可以传一个值 或多个
     */
    @SuppressWarnings("unchecked")
    public void del(String... key) {
        if (key != null && key.length > 0) {
            if (key.length == 1) {
                boolean flag=redisTemplate.delete(key[0]);
                log.info("从redis删除key,key:{},return:{}",key,flag);
            } else {
                long count=redisTemplate.delete(CollectionUtils.arrayToList(key));
                log.info("从redis删除key,key:{},return:{}",key,count);
            }
        }
    }

    //============================String=============================  

    /**
     * 普通缓存获取
     *
     * @param key 键
     * @return 值
     */
    public Object get(String key) {
    	if(key==null) {
    		log.info("从redis获取key,key:{},return:{}",key,null);
    		return null;
    	}else {
    		Object object=redisTemplate.opsForValue().get(key);
    		log.info("从redis获取key,key:{},return:{}",key,object);
    		return object;
    	}
    }

    /**
     * 普通缓存放入
     *
     * @param key   键
     * @param value 值
     * @return true成功 false失败
     */
    public boolean set(String key, Object value) {
        try {
            redisTemplate.opsForValue().set(key, value);
            log.info("保存键值到redis成功,key:{},value:{}",key,value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            log.info("保存键值到redis失败,key:{},value:{}",key,value);
            return false;
        }

    }

    /**
     * 普通缓存放入并设置时间
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
     * @return true成功 false 失败
     */
    public boolean set(String key, Object value, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
                log.info("保存键值到redis成功并设定失效时间,key:{},value:{},time:{},",key,value,time);
            } else {
                set(key, value);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }


    //================================Map=================================  

    /**
     * HashGet
     *
     * @param key  键 不能为null
     * @param item 项 不能为null
     * @return 值
     */
    public Object hget(String key, String item) {
        return redisTemplate.opsForHash().get(key, item);
    }

    /**
     * 获取hashKey对应的所有键值
     *
     * @param key 键
     * @return 对应的多个键值
     */
    public Map<Object, Object> hmget(String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * HashSet
     *
     * @param key 键
     * @param map 对应多个键值
     * @return true 成功 false 失败
     */
    public boolean hmset(String key, Map<String, Object> map) {
        try {
            redisTemplate.opsForHash().putAll(key, map);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * HashSet 并设置时间
     *
     * @param key  键
     * @param map  对应多个键值
     * @param time 时间(秒)
     * @return true成功 false失败
     */
    public boolean hmset(String key, Map<String, Object> map, long time) {
        try {
            redisTemplate.opsForHash().putAll(key, map);
            if (time > 0) {
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 向一张hash表中放入数据,如果不存在将创建
     *
     * @param key   键
     * @param item  项
     * @param value 值
     * @return true 成功 false失败
     */
    public boolean hset(String key, String item, Object value) {
        try {
            redisTemplate.opsForHash().put(key, item, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 向一张hash表中放入数据,如果不存在将创建
     *
     * @param key   键
     * @param item  项
     * @param value 值
     * @param time  时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间
     * @return true 成功 false失败
     */
    public boolean hset(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;
        }
    }

    /**
     * 删除hash表中的值
     *
     * @param key  键 不能为null
     * @param item 项 可以使多个 不能为null
     */
    public void hdel(String key, Object... item) {
        redisTemplate.opsForHash().delete(key, item);
    }

    /**
     * 判断hash表中是否有该项的值
     *
     * @param key  键 不能为null
     * @param item 项 不能为null
     * @return true 存在 false不存在
     */
    public boolean hHasKey(String key, String item) {
        return redisTemplate.opsForHash().hasKey(key, item);
    }


    //============================set=============================  

    /**
     * 根据key获取Set中的所有值
     *
     * @param key 键
     * @return
     */
    public Set<Object> sGet(String key) {
        try {
            return redisTemplate.opsForSet().members(key);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 根据value从一个set中查询,是否存在
     *
     * @param key   键
     * @param value 值
     * @return true 存在 false不存在
     */
    public boolean sHasKey(String key, Object value) {
        try {
            return redisTemplate.opsForSet().isMember(key, value);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 将数据放入set缓存
     *
     * @param key    键
     * @param values 值 可以是多个
     * @return 成功个数
     */
    public long sSet(String key, Object... values) {
        try {
            return redisTemplate.opsForSet().add(key, values);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 将set数据放入缓存
     *
     * @param key    键
     * @param time   时间(秒)
     * @param values 值 可以是多个
     * @return 成功个数
     */
    public long sSetAndTime(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;
        }
    }

    /**
     * 获取set缓存的长度
     *
     * @param key 键
     * @return
     */
    public long sGetSetSize(String key) {
        try {
            return redisTemplate.opsForSet().size(key);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 移除值为value的
     *
     * @param key    键
     * @param values 值 可以是多个
     * @return 移除的个数
     */
    public long setRemove(String key, Object... values) {
        try {
            Long count = redisTemplate.opsForSet().remove(key, values);
            return count;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    //===============================list=================================  

    /**
     * 获取list缓存的内容
     *
     * @param key   键
     * @param start 开始
     * @param end   结束  0 到 -1代表所有值
     * @return
     */
    public List<Object> lGet(String key, long start, long end) {
        try {
            return redisTemplate.opsForList().range(key, start, end);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 获取list缓存的长度
     *
     * @param key 键
     * @return
     */
    public long lGetListSize(String key) {
        try {
            return redisTemplate.opsForList().size(key);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 通过索引 获取list中的值
     *
     * @param key   键
     * @param index 索引  index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
     * @return
     */
    public Object lGetIndex(String key, long index) {
        try {
            return redisTemplate.opsForList().index(key, index);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒)
     * @return
     */
    public boolean lSet(String key, Object value) {
        try {
            redisTemplate.opsForList().rightPush(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒)
     * @return
     */
    public boolean lSet(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;
        }
    }

    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒)
     * @return
     */
    public boolean lSet(String key, List<Object> value) {
        try {
            redisTemplate.opsForList().rightPushAll(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒)
     * @return
     */
    public boolean lSet(String key, List<Object> value, long time) {
        try {
            redisTemplate.opsForList().rightPushAll(key, value);
            if (time > 0) expire(key, time);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 根据索引修改list中的某条数据
     *
     * @param key   键
     * @param index 索引
     * @param value 值
     * @return
     */
    public boolean lUpdateIndex(String key, long index, Object value) {
        try {
            redisTemplate.opsForList().set(key, index, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 移除N个值为value
     *
     * @param key   键
     * @param count 移除多少个
     * @param value 值
     * @return 移除的个数
     */
    public long lRemove(String key, long count, Object value) {
        try {
            Long remove = redisTemplate.opsForList().remove(key, count, value);
            return remove;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    
    /**
     *  分布式锁
     *
     * @param key key值
     * @return 是否获取到
     */
    @SuppressWarnings("unchecked")
	public boolean lock(String key){
        String lock = LOCK_PREFIX + key;
        return (Boolean) redisTemplate.execute((RedisCallback) connection -> {
  
            long expireAt = System.currentTimeMillis() + LOCK_EXPIRE + 1;
            Boolean acquire = connection.setNX(lock.getBytes(), String.valueOf(expireAt).getBytes());
  
  
            if (acquire) {
                return true;
            } else {
  
                byte[] value = connection.get(lock.getBytes());
  
                if (Objects.nonNull(value) && value.length > 0) {
  
                    long expireTime = Long.parseLong(new String(value));
                     // 如果锁已经过期
                    if (expireTime < System.currentTimeMillis()) {
                        // 重新加锁,防止死锁
                        byte[] oldValue = connection.getSet(lock.getBytes(), String.valueOf(System.currentTimeMillis() + LOCK_EXPIRE + 1).getBytes());
                        return Long.parseLong(new String(oldValue)) < System.currentTimeMillis();
                    }
                }
            }
            return false;
        });
    }
  
    /**
     * 删除锁
     *
     * @param key
     */
    public void delete(String key) {
        redisTemplate.delete(key);
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iava redis工具类 的相关文章

  • 使用 ProcessBuilder 运行 msys.bat

    我正在尝试使用 ProcessBuilder 在 java 中运行 msys bat 当我使用程序运行 bat 文件时 出现以下错误 找不到 rxvt exe 或 sh exe 二进制文件 正在中止 按任意键继续 这是代码 ProcessB
  • 批处理脚本一次运行多个 Jar 文件

    我有两个批处理文件 我想立即运行它们 所以我写了这个 echo off java jar happyjar jar java jar sadjar jar pause 当我运行脚本时 它首先运行 happyjar 然后运行 Sadjar 是
  • war文件可以部署在任何服务器上吗?

    如果这个问题很愚蠢 请原谅我 假设我使用 Spring 框架和 MS SQL Server 数据库以及 WebSphere 应用程序服务器开发一个 J2EE Web 应用程序 我后来为此应用程序创建了一个 WAR 文件 我可以在不更改代码的
  • 区域设置的 Java 日期格式

    我怎样才能找到DateFormat对于给定的Locale DateFormat getDateInstance int Locale 例如 import static java text DateFormat DateFormat f ge
  • Android Studio - 无法识别的 VM 选项“MaxPermSize=256m”

    我刚刚在 Elementary OS 0 3 Freya 上安装了 Android Studio 并使用终端运行它 然而 在我第一次启动时 显示一条错误消息 Gradle 测试 项目刷新失败 无法启动守护进程 这个问题可能是由 守护进程的配
  • JMS队列消息接收顺序

    我按顺序在同一目标中添加两条 JMS 消息 这两条消息的接收顺序是否与我添加它们的顺序相同 或者是否有可能进行相反的排序 即首先检索目的地中首先接收到的消息 我将添加到目的地 producer send Msg1 producer send
  • Spring中需要多个相同类型的bean

    将其标记为重复之前的请求 我浏览了论坛 但在任何地方都找不到该问题的解决方案 我正在使用 Spring 3 2 编写代码 一切都是纯粹基于注释的 该代码接收从不同 XSD 文件派生的 XML 文件 所以我们可以说 有五个不同的 XSD A1
  • Java,ASM:如何从ASM InsnNode获取操作码名称和TagValue?

    我正在研究一些类文件分析 并且正在研究使用 ASM 来读取类 在 Javap 中 操作码以及 tagName 和 tagValue 是内联打印的 但在每个 AbstractInsnNode 中 我只看到 int 的字段 而不是 tagVal
  • 递归 - 与 Java 中不重复的数组相结合

    所以我知道如何获取组合的大小 数组大小 在我的例子中 除以所需数组子集大小的阶乘 我遇到的问题是获取组合 到目前为止 我已经阅读了 stackoverflow 上的大部分问题 但一无所获 我认为我发现的问题是我想将创建的组合子集中的元素添加
  • 无法获取提供程序 androidx.core.content.FileProvider:java.lang.IllegalArgumentException:缺少 android.support.FILE_PROVIDER_PATHS 元数据?

    我看了很多这样的帖子 但还是不知道问题出在哪里 我尝试更改 file paths xml 中的路径和名称 文件路径 xml
  • HTML 解析和删除锚标记,同时使用 Jsoup 保留内部 html

    我必须解析一些html并删除锚标记 但我需要保留锚标记的innerHTML 例如 如果我的 html 文本是 String html div p some text a href some link text a p div 现在我可以解析
  • Spring 如何在登录网址上设置动态前缀

    我有一个始终以动态前缀开头的 Spring 应用程序 这是因为我需要该前缀来进行一些内部配置 问题是 当我尝试设置登录页面时 无法传递该前缀并使其工作 如何为我的登录页面设置动态前缀 这是我的 AppController 的一部分 我在其中
  • 光线追踪三角形

    我正在用java编写一个光线追踪器 并且我能够追踪球体 但我相信我追踪三角形的方式有问题 据我了解 这是基本算法 首先确定射线是否与plane三角形已打开 剪裁所有点 使它们与三角形位于同一平面上 因此xy以平面为例 根据沿着新平面向任意方
  • 用 org.Json 解析 Java 中的 JSON?

    我在这方面遇到了很多麻烦 我正在尝试进行更新 并且正在使用从 url 返回此内容的 api JSON downloadUrl URL fileName Name gameVersion Version name Name projectId
  • 当将 Eclipse 与 FindBugs 一起使用时,您可以将错误标记为非错误并将其从错误列表中删除吗?

    FindBugs 在我的代码中发现了潜在的错误 但这不是一个错误 是否可以将此事件标记为 不是错误 并将其从错误列表中删除 我已经非常清楚地记录了为什么每种情况都不是错误 例如 类实现类似的接口 它有compareTo方法 然而 我没有重写
  • 可以将矩形设置为显示边框吗?

    以下应用 public class Temp extends Application Override public void start Stage primaryStage StackPane root new StackPane Re
  • Java - 全局、可重用的加载对话框

    我正在尝试实现一个全局加载对话框 我想调用一些静态函数来显示对话框和一些静态函数来关闭它 与此同时 我正在主线程或子线程中做一些工作 我尝试以下操作 但对话框没有更新 最后一次 在再次隐藏之前 它会更新 private static Run
  • Java 8 中接口和抽象类之间的根本区别[重复]

    这个问题在这里已经有答案了 考虑到接口现在可以为其提供的方法提供实现 我无法正确合理地解释接口和抽象类之间的差异 有谁知道如何正确解释其中的差异 我还被告知 从性能角度来看 接口比抽象类更轻量 有人可以证实这一点吗 接口仍然不能有任何状态
  • Java 压缩字符串

    我需要创建一个接收字符串并返回字符串的方法 防爆输入 AAABBBCCC 防爆输出 3A4B2C 好吧 这很尴尬 我在今天的面试中无法做到这一点 我正在申请初级职位 现在 我在家尝试制作一些静态工作的东西 我的意思是 不使用循环有点无用 但
  • Java邮件,设置回复地址不起作用

    我用java写了一个小的电子邮件发送程序 它有from to and reply to地址 当客户端尝试回复邮件时 应该能够回复reply to地址 目前它不起作用 我的代码如下 File Name SendEmail java impor

随机推荐

  • ref绑定到不同元素获取到不同对象

    ref如果绑定在组件中 那么通过this ref refname获取到的是一个组建对象 ref如果绑定在普通的元素中 那么通过this ref refname获取到的是一个元素对象
  • 云呐

    科技大数据时代 企业的信息化规划刻不容缓 固定资产管理系统做为一款企业资产方案系统 可完成对企业资产的系统化管理 充分发挥资产更高的实用价值 固定资产管理系统可将企业內部全部资产融合在一起 根据对固定资产的增加 改动 退出 迁移 删除 使用
  • 2016年4月28日(6985小时时),第一次签合同,里程碑

    这周四 我觉得是个历史性的事件 是个里程碑 说明 锲而不舍 金石可镂 虽然不多 2万
  • win11/ win10 C盘扩容教程

    win11 win10 C 盘扩容教程 1 写在前面 10月5号微软官方正式发布了win11操作系统 作为一名科技星人 我也是第一时间升级体验了一番 如何升级win11我就不多说了 晚上一搜教程非常的多 这里推荐使用win11升级助手升级
  • 合宙ESP32系列

    目录 源文档见 ESP32系列编译文档 LuatOS 文档 本地编译详细步骤 准备环境 准备项目 获取源码 编译前的最后准备 编译 LuatOS SoC通用固件格式soc介绍 定制固件里的库 PS luat conf bsp h问题汇总 源
  • SGL STL源码剖析——迭代器

    SGL STL源码剖析 迭代器 迭代器 迭代器的型别 Traits的作用 迭代器相应的五种型别 type traits 迭代器 在我们使用STL容器的时候 迭代器是非常常见的 STL将容器和算法分开 彼此独立 然后通过迭代器相互关联 迭代器
  • U-Net: Convolutional Networks for Biomedical Image Seg-mentation

    Abstract 深度网络的成功训练需要数千个带注释的训练样本 这是一个很大的共识 在本文中 我们提出了一种网络和训练策略 它依赖于数据增强的强大使用 以更有效地使用可用的带注释的样本 该体系结构由捕获上下文的收缩路径和支持精确本地化的对称
  • 纯源码程序的执行

    QT Creator本身是个IDE安装的时候根据自己需要配置的又有对应的编译器 因此编写普通的程序也不再话下 选择Non Qt Project工程 并在右侧根据自己的需要选择C 应用还是C应用 新工程中工程管理文件和代码如下 执行结果如下
  • 表与表之间的关系

    一 表关系的概念 现实生活中 实体与实体之间肯定是有关系的 如 学生和老师 学生和课程 部门和员工 每个人和自己的身份证号码等 在设计表的时候 就应该体现出来表与表之间的这种关系 表与表之间的三种关系 一对多 最常用的关系 如部门和员工 多
  • 在ubuntu下如何搜索文件?

    1 whereis 文件名 特点 快速 但是是模糊查找 例如 找 whereis mysql 它会把mysql mysql ini mysql 所在的目录都找出来 我一般的查找都用这条命令 2 find name 文件名 特点 准确 但速度
  • 从端到端打通模型端侧部署流程(MNN)

    从端到端打通模型端侧部署流程 MNN MNN框架 MNN的官方介绍 MNN的架构 问题解决 MNN使用样例 MNN部署 一般流程 创建会话 运行会话 获取输出 流程汇总 总结 MNN框架 MNN的官方介绍 官方文档 有疑问一定要先查这里 M
  • 西门子 SCL 语言 模拟量转换小例程

    软硬件平台 软件是博图 TIA v15 硬件是西门子300系列 PLC 简介 使用scl语言编写一个FC子程序 对模拟量进行处理 对模拟数据进行转换 详细介绍 添加新块 添加一个FC块 语言选择scl 添加变量 输入型变量5个 一个运算后输
  • 信息学奥赛一本通 1177:奇数单增序列

    题目链接 http ybt ssoier cn 8088 problem show php pid 1177 include
  • 二进制思想及其应用

    两个经典面试题 二进制思想 1 你让工人为你工作7天 回报是一根金条 这个金条平分成相连的7段 每工作1天的回报就是1段 每天结束的时候 工人都有可能会向你要金条 如果只允许你两次把金条弄断 你如何给你的工人付费 2 有1000个苹果 将它
  • VTM配置并使用VTM对YUV视频帧进行编解码(基于windows系统)

    一 下载安装VTM H 266 VCC 参考软件VTM下载网址 https vcgit hhi fraunhofer de jvet VVCSoftware VTM 这里我选择的Tags是VTM 9 0 根据自己想用的VTM版本进行选择 然
  • 基于遗传算法的柔性生产调度研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 摘要 针对传统作业车间调度存在加工设备功能
  • Linux的时间函数

    2023年7月19日 周三下午 我今天基于GitHub搭建了自己的博客网站 欢迎大家来我的个人博客网站阅读我的博客 巨龙之路的GitHub个人博客 julongzhilu github io 目录 time 函数原型 使用方法 ctime
  • IIC接口介绍

    IIC接口介绍 本章节主要介绍IIC接口工作原理 what 简单介绍 a 术语定义 b 基本概念 why 优点 how 过程 可能出现的问题 a 以下情况 会出现无应答信号 NACK 的情况 本章节主要介绍IIC接口工作原理 what 简单
  • [创业之路-54] :CTO的主要职责与工作内容

    概述 首席技术官 外语词全称chief technology officer 外语词缩略语CTO 是技术资源的行政管理者 其职责是制订有关技术的愿景和战略 把握总体技术方向 监督技术研究与发展 R D 的活动 并对技术选型和具体技术问题进行
  • iava redis工具类

    redis工具类 package com customerNoPlatform configs import java util List import java util Map import java util Objects impo