当前位置: 首页 > news >正文

企业级-实现Redis封装层

作者:fyupeng
技术专栏:☞ https://github.com/fyupeng
项目地址:☞ https://github.com/fyupeng/distributed-blog-system-api


留给读者

封装 Redis 客户端Dao层、分布式锁等。

一、介绍

二、代码

DataInitialLoadRunner.java

/*** @ClassName: DataInitialLoadRunner* @Description: 程序启动时初始化加载操作**/
@Component
@Order(value = 1)
public class DataInitialLoadRunner implements CommandLineRunner {protected final static Logger logger = LoggerFactory.getLogger(DataInitialLoadRunner.class);@Autowiredprivate ApplicationContext context;/*** 执行程序启动时初始化加载操作* * @param args* @throws Exception* @see CommandLineRunner#run(String[])*/@Overridepublic void run(String... args) throws Exception {logger.info(">>>>>>>>>common系统初始化数据操作开始<<<<<<<<<<");// 开始时间long begin = System.currentTimeMillis();//获取当前启动参数CoreConstants.PROFILE_NAME = context.getEnvironment().getActiveProfiles()[0];logger.info(">>>>>>>>>当前启动参数:"+CoreConstants.PROFILE_NAME);// 加载redis连接池	RedisManager.init();// 加载获取gwssi-core.properties配置文件ResourceBundle torchBundle = ResourceBundle.getBundle("gwssi-core");//电子文书文件参数初始化设置CoreConstants.DOC_APPLY_DATASOURCE_KEY=torchBundle.getString("doc.apply.datasource.key"); //申请端电子文书数据源keyCoreConstants.DOC_REDIS_DBINDEX = Integer.parseInt(torchBundle.getString("doc.redis.index")); // redis库IDCoreConstants.DOC_CONFIG_PATH = torchBundle.getString("doc.config.path"); // 电子文书xml文件路径CoreConstants.DOC_BASE_URL_PATH = torchBundle.getString("doc.base.url.path");//CoreConstants.FILE_IDENTITY_PATH= torchBundle.getString("file.identity.path"); //身份认证文件上传路径String initLoad = torchBundle.getString("init.load");// 检查程序每次启动时是否都要再加载一遍XML文件放入缓存中if (StringUtil.isNotBlank(initLoad.trim()) && "true".equals(initLoad.trim())) {logger.info("文书配置加载完成");}long end = System.currentTimeMillis(); // 结束时间logger.info(">>>>>>>>>系统初始化数据操作结束:" + (end - begin) + "ms<<<<<<<<<<");}}

RedisManager.java

/*** redis连接池获取数据源连接**/
public class RedisManager {private static Pool<Jedis> pool;protected final static Logger logger = LoggerFactory.getLogger(RedisManager.class);/*** 初始化redis连接池连接*/public static void init() throws Exception {// 加载读取application.properties文件String profile = CoreConstants.PROFILE_NAME;String profilename = "application";if (StringUtils.isNotBlank(profile)) {profilename += ("-" + profile);}logger.info("profilename=" + profilename);ResourceBundle torchBundle = ResourceBundle.getBundle(profilename);//>>>>>>>>初始化Redis连接池<<<<<<<<if (torchBundle == null) {throw new RuntimeException("没有找到redis配置文件");}String host = torchBundle.getString("spring.redis.host"); // redis IP地址int port = Integer.valueOf(torchBundle.getString("spring.redis.port")); // 端口号String password = "";if (torchBundle.containsKey("spring.redis.password")) {password = torchBundle.getString("spring.redis.password"); // 密码}logger.info("redis.host=" + host + "----redis.port=" + port);// 创建jedis池配置实例JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();// 设置池配置项值// 最大连接数int poolMaxTotal = Integer.valueOf(torchBundle.getString("spring.redis.maxActive").trim());jedisPoolConfig.setMaxTotal(poolMaxTotal);// 最大空闲连接数int poolMaxIdle = Integer.valueOf(torchBundle.getString("spring.redis.maxIdle").trim());int poolMinIdle = Integer.valueOf(torchBundle.getString("spring.redis.MinIdle").trim());jedisPoolConfig.setMaxIdle(poolMaxIdle);jedisPoolConfig.setMinIdle(poolMinIdle);jedisPoolConfig.setMaxTotal(200);// 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1long poolMaxWaitMillis = Long.valueOf(torchBundle.getString("spring.redis.maxWaitMillis").trim());jedisPoolConfig.setMaxWaitMillis(poolMaxWaitMillis);//拿到连接的时候是否进行校验操作jedisPoolConfig.setTestOnBorrow(true);//连接归还池进行校验jedisPoolConfig.setTestOnReturn(true);
//表示idle object evitor两次扫描之间要sleep的毫秒数jedisPoolConfig.setTimeBetweenEvictionRunsMillis(30000);
//表示idle object evitor每次扫描的最多的对象数jedisPoolConfig.setNumTestsPerEvictionRun(10);
//表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义jedisPoolConfig.setMinEvictableIdleTimeMillis(60000);// 添加连接池if (StringUtils.isNotBlank(password)) {int timeOut = Integer.valueOf(torchBundle.getString("spring.redis.timeOut")); // 超时时间pool = new JedisPool(jedisPoolConfig, host, port, timeOut, password);} else {pool = new JedisPool(jedisPoolConfig, host, port);}logger.info("redis 初始化完成");}/*** 获取Jedis对象** @return*/public static Jedis getResource() {Jedis jedis = pool.getResource();return jedis;}/*** 获取Jedis对象** @param db 数据库序号* @return*/public static Jedis getResource(int db) {//索引0 =线程//索引1 =这个//索引2 =直接呼叫者,可以是自己。//索引3 ... n =相互调用以获得索引2及以下的类和方法。/*StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();for (int i = 0; i < stackTrace.length; i++){StackTraceElement s = stackTrace[i];System.out.format(" ClassName:%d\t%s\n", i, s.getClassName());System.out.format("MethodName:%d\t%s\n", i, s.getMethodName());System.out.format("  FileName:%d\t%s\n", i, s.getFileName());System.out.format("LineNumber:%d\t%s\n\n", i, s.getLineNumber());}*/Jedis jedis = pool.getResource();jedis.select(db);return jedis;}/*** 销毁** @throws Exception*/public static void destroy() throws Exception {pool.destroy();}
}

Redis工具类

/*** redis工具类**/
public class RedisUtils {protected final static Logger logger = LoggerFactory.getLogger(RedisUtils.class);private static final long sleepTime = 100L;/*** 根据dbindex删除缓存** @param dbIndex*/public static void flushDB(int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);jedis.flushDB();} catch (Exception e) {logger.error("redis-flushDB异常", e);} finally {if (jedis != null) {jedis.close();}}}/*** set集合** @param key* @param value*/public static void set(String key, Object value, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);if (value instanceof String) {jedis.set(key, String.valueOf(value));} else {jedis.set(key.getBytes(), serialize(value));}} catch (Exception e) {logger.error("redis-set异常", e);} finally {if (jedis != null) {jedis.close();}}}/*** set集合, 有过期时间** @param key* @param value* @param second*/public static void setex(String key, int second, Object value, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);if (value instanceof String) {jedis.setex(key, second, String.valueOf(value));} else {jedis.setex(key.getBytes(), second, serialize(value));}} catch (Exception e) {logger.error("redis-set异常", e);} finally {if (jedis != null) {jedis.close();}}}/*** @param 参数* @return void    返回类型* @throws* @Title: expire* @Description: 设置时间*/public static void expire(String key, int secends, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);jedis.expire(key.getBytes(), secends);} catch (Exception e) {logger.error("redis-expire异常", e);} finally {if (jedis != null) {jedis.close();}}}/*** 从redis缓存中获取key的值*/public static String get(String key, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);return jedis.get(key);} catch (Exception e) {logger.error("redis-get异常", e);} finally {if (jedis != null) {jedis.close();}}return null;}/*** @param 参数* @return Object    返回类型* @throws* @Title: get* @Description: key查询返回Object对象*/public static Object get(byte[] key, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);logger.info("redis取值:" + key.toString());return unserialize(jedis.get(key));} catch (Exception e) {logger.error("redis-get异常", e);} finally {if (jedis != null) {jedis.close();}}return null;}/*** 根据key删除缓存** @param key*/public static void delete(String[] key, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);logger.info("redis删除:" + key);jedis.del(key);} catch (Exception e) {logger.error("redis-delete异常", e);} finally {if (jedis != null) {jedis.close();}}}/*** 设置 map** @param <T>* @param key* @param value*/public static <T> void setMap(String key, Map<String, T> map, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);jedis.set(key.getBytes(), serialize(map));} catch (Exception e) {logger.error("redis-setMap异常", e);} finally {if (jedis != null) {jedis.close();}}}/*** 获取list** @param <T>* @param key* @return list*/public static <T> Map<String, T> getMap(String key, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);if (jedis == null || !jedis.exists(key.getBytes())) {return null;}byte[] in = jedis.get(key.getBytes());@SuppressWarnings("unchecked")Map<String, T> map = (Map<String, T>) unserialize(in);return map;} catch (Exception e) {logger.error("redis-getMap异常", e);} finally {if (jedis != null) {jedis.close();}}return null;}/*** 设置object** @param <T>* @param key* @param object*/public static <T> void setObject(String key, Object object, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);jedis.set(key.getBytes(), serialize(object));} catch (Exception e) {logger.error("redis-setObject异常", e);} finally {if (jedis != null) {jedis.close();}}}/*** 获取object** @param <T>* @param key* @return list*/public static <T> T getObject(String key, int dbIndex) {Jedis jedis = null;Object object = null;try {jedis = RedisManager.getResource(dbIndex);if (jedis == null || !jedis.exists(key.getBytes())) {return null;}byte[] in = jedis.get(key.getBytes());object = unserialize(in);} catch (Exception e) {logger.error("redis-getObject异常", e);} finally {if (jedis != null) {jedis.close();}}return object==null?null:(T)object;}/*** 设置 String** @param key* @param value*/public static void setString(String key, String value, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);// value = StringUtil.isNullOrEmpty(value) ? "" : value;jedis.set(key, value);} catch (Exception e) {logger.error("redis-setString异常", e);} finally {if (jedis != null) {jedis.close();}}}/*** 设置 过期时间** @param key* @param seconds 以秒为单位* @param value*/public static void setString(String key, int seconds, String value, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);// value = StringUtil.isNullOrEmpty(value) ? "" : value;jedis.setex(key, seconds, value);} catch (Exception e) {logger.error("redis-setString异常", e);} finally {if (jedis != null) {jedis.close();}}}/*** 获取String值** @param key* @return value*/public static String getString(String key, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);if (jedis == null || !jedis.exists(key)) {return null;}return jedis.get(key);} catch (Exception e) {logger.error("redis-getString异常", e);} finally {if (jedis != null) {jedis.close();}}return null;}/*** 设置 list** @param <T>* @param key* @param list*/public static <T> void setList(String key, List<T> list, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);jedis.set(key.getBytes(), serialize(list));} catch (Exception e) {logger.error("redis-setList异常", e);} finally {if (jedis != null) {jedis.close();}}}/*** 获取list** @param <T>* @param key* @return list*/@SuppressWarnings("unchecked")public static <T> List<T> getList(String key, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);if (jedis == null || !jedis.exists(key.getBytes())) {return null;}byte[] in = jedis.get(key.getBytes());List<T> list = (List<T>) unserialize(in);return list;} catch (Exception e) {logger.error("redis-getList异常", e);} finally {if (jedis != null) {jedis.close();}}return null;}public static byte[] getbyte(String key, int secends, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);if (null == jedis.get(key.getBytes())) {return null;} else {// 更新过期时间jedis.expire(key, secends);// 1小时}return jedis.get(key.getBytes());} catch (Exception e) {logger.error("session取Redis出现错误", e);return null;} finally {jedis.close();}}/** 序列化对象*/public static byte[] serialize(Object value) {if (value == null) {throw new NullPointerException("Can't serialize null");}byte[] rv = null;ByteArrayOutputStream bos = null;ObjectOutputStream os = null;try {bos = new ByteArrayOutputStream();os = new ObjectOutputStream(bos);os.writeObject(value);rv = bos.toByteArray();} catch (IOException e) {logger.error("redis-serialize异常", e);throw new IllegalArgumentException("Non-serializable object", e);} finally {try {if (os != null)os.close();if (bos != null)bos.close();} catch (Exception e2) {e2.printStackTrace();}}return rv;}/*** 反序列化对象** @return Object*/public static Object unserialize(byte[] in) {Object rv = null;ByteArrayInputStream bis = null;ObjectInputStream is = null;try {if (in != null) {bis = new ByteArrayInputStream(in);is = new ObjectInputStream(bis);rv = is.readObject();}} catch (Exception e) {logger.error("redis-unserialize异常", e);} finally {try {if (is != null)is.close();if (bis != null)bis.close();} catch (Exception e2) {e2.printStackTrace();}}return rv;}public static Long incr(String key, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);if (jedis == null) {return null;}return jedis.incr(key);} catch (Exception e) {logger.error("redis-getString异常", e);} finally {if (jedis != null) {jedis.close();}}return null;}/*** Jedis执行Lua脚本,获取结果** @param lua     Lua字符串* @param keys    keys* @param args    其他Lua需要参数* @param dbIndex 索引* @return*/public static Object evalLua(String lua, List<String> keys, List<String> args, int dbIndex) {Jedis jedis = null;try {jedis = RedisManager.getResource(dbIndex);if (jedis == null) {return null;}return jedis.eval(lua, keys, args);} catch (Exception e) {logger.error("redis-执行Lua异常", e);} finally {if (jedis != null) {jedis.close();}}return null;}/*** 自定义获取锁的超时时间** @param key* @param timeout* @param waitTime* @param timeUnit* @return* @throws InterruptedException*/public static boolean tryLock(String key, int timeout, long waitTime, TimeUnit timeUnit) throws InterruptedException {try (Jedis jedis = RedisManager.getResource(LOCK_DB_INDEX)) {long timeoutSeconds = timeUnit.toSeconds(timeout);long waitTimeMicroSeconds = timeUnit.toMicros(waitTime);while (waitTimeMicroSeconds >= 0) {String result = jedis.set(key, "1", "nx", "ex", timeoutSeconds);if ("OK".equals(result)) {return true;}waitTimeMicroSeconds -= sleepTime;Thread.sleep(sleepTime);}} catch (Exception e) {logger.error("redis-setString异常", e);}return false;}/*** 使用Lua脚本进行解锁操纵,解锁的时候验证value值** @param key* @return*/public static void unlock(String key) {try (Jedis jedis = RedisManager.getResource(LOCK_DB_INDEX)) {String luaScript = "if redis.call('get',KEYS[1]) == ARGV[1] then " +"return redis.call('del',KEYS[1]) else return 0 end";jedis.eval(luaScript, Collections.singletonList(key), Collections.singletonList("1")).equals(1L);} catch (Exception e) {logger.error("redis-setString异常", e);}}}

三、总结

简洁

相关文章:

企业级-实现Redis封装层

作者&#xff1a;fyupeng 技术专栏&#xff1a;☞ https://github.com/fyupeng 项目地址&#xff1a;☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 封装 Redis 客户端Dao层、分布式锁等。 一、介绍 二、代码 DataInitialLoadRunner.java /*** Clas…...

SpringBoot使用ApplicationContext.getBean启动报空指针处理记录

问题&#xff1a;项目启动报空指针 定位&#xff1a;新增filter中init方法使用getbean控制 解决&#xff1a;在新增filter上加注解 DependsOn({"applicationContextUtils"}) Component DependsOn({"applicationContextUtils"})//此处解决空指针问题 pu…...

MongoDB Shell 基本命令(三)聚合管道

管道含义 类似Linux中的管道&#xff0c;前一个命令的输出作为后一个命令的输入。 显示网络连接、路由表和网络接口统计信息 netstat -ano -netstat:network statistics 网络统计 -a:显示所有连接和监听端口&#xff0c;包括所有活动的TCP和UDP连接。 -n:以数字形式显示地址…...

Go语言的内置容器

文章目录 一、数组数组的定义数组声明数组特点数组元素修改 二、切片切片声明基于数组创建切片使用make()函数构造切片使用append()为切片动态添加元素\使用copy()复制新的切片数组与切片相互转换 三、Map映射Map定义使用make()函数创建map用切片作为map的值使用delete()函数删…...

HCIP考试怎样预约?随时可以考试吗?

HCIP&#xff08;华为认证互联网协议专家&#xff09;的考试并不是随时都能参加的&#xff0c;考生需要避开法定节假日来预约考试。具体的考试时间会根据所选的认证方向和考试中心有所变化。考生可以通过华为人才在线平台或者直接联系Pearson VUE来安排考试时间。 HCIP认证考试…...

香港航空 阿里滑块 acw_sc__v3 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…...

JS传统函数中常见的 this 绑定问题

在 JavaScript 中&#xff0c;传统函数的 this 绑定规则依赖于函数的调用方式&#xff0c;这常常导致一些意外的行为和常见的 this 绑定问题。以下是一些典型的 this 绑定问题及其解决方案。 1. 作为对象方法调用时的 this 丢失 当一个对象的方法被赋值给一个变量或作为回调函…...

跨域问题以及使用vscode的LiveServer插件跨域访问

目录 现象跨域问题的定义&#xff08;文心一言&#xff09;解决办法同源部署后端代理VS Code LiveServer 现象 以下前端代码部署后&#xff0c;在网页访问时报错&#xff1a;No ‘Access-Control-Allow-Origin’ header is present on the requested resource. $.ajax({url:…...

现代Web开发:WebSocket 实时通信详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 现代Web开发&#xff1a;WebSocket 实时通信详解 现代Web开发&#xff1a;WebSocket 实时通信详解 现代Web开发&#xff1a;WebS…...

《深度学习》——深度学习基础知识(全连接神经网络)

文章目录 1.神经网络简介2.什么是神经网络3.神经元是如何工作的3.1激活函数3.2参数的初始化3.2.1随机初始化3.2.2标准初始化3.2.3Xavier初始化&#xff08;tf.keras中默认使用的&#xff09;3.2.4He初始化 4.神经网络的搭建4.1通过Sequential构建神经网络4.2通过Functional API…...

nginx 部署2个相同的vue

起因&#xff1a; 最近遇到一个问题&#xff0c;在前端用nginx 部署 vue&#xff0c; 发现如果前端有改动&#xff0c;如果不适用热更新&#xff0c;而是直接复制项目过去&#xff0c;会404 因此想到用nginx 负载两套相同vue项目&#xff0c;然后一个个复制vue项目就可以了。…...

利用Java easyExcel库实现高效Excel数据处理

在Java应用程序中&#xff0c;处理Excel文件是一项常见任务&#xff0c;尤其是在需要读取、写入或分析大量数据时。easyExcel是一个基于Java的高性能Excel处理库&#xff0c;它提供了简洁的API和优化的性能&#xff0c;以简化Excel文件的处理。本文将指导您如何使用easyExcel库…...

Vulnhub靶场 Metasploitable: 1 练习(上)

目录 0x00 准备0x01 主机信息收集0x02 Samba服务&#xff08;CVE-2007-2447&#xff09;0x03 Distccd&#xff08;CVE-2004-2687&#xff09;0x04 Mysql弱口令0x05 Postgresql弱口令0x06 Telnet弱口令0x07 Tomcat 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/…...

《Python编程实训快速上手》第二天--列表与元组

一、列表 1、理解 列表是一个值&#xff0c;包含由多个值构成的序列 2、元素查找 1&#xff09;索引--取列表中的单个值 正数索引&#xff1a;同c语言中的数组 spam [[1,2,3,4],["cat","dog"]] print(spam[0][1]) #结果&#xff1a;2 负数索引&…...

jangow靶机

先改jangow的ip设置&#xff0c;无ip地址&#xff0c;重启jangow虚拟机时候快速按E这个键盘&#xff0c;进入到编辑模式&#xff0c;找到ro这个位置&#xff0c;写入ro rw signin init/bin/bash ​&#xff0c;ctrlx保存 下一步需要更改网卡名字为ens33&#xff0c;可以直接…...

使用UDP协议传输视频流!(分片、缓存)

背景 最近在开发工作中遇到需要两台本地设备之间进行视频流的传输的情况。但是团队一来没有这方面的专业人才&#xff0c;二来视频流的传续数据量很大&#xff0c;针对TCP和UDP的具体选择也不明确。 本文是在上诉背景之下进行的研究和开发工作。 目录 背景 UDP和TCP协议的…...

Pinia小菠萝(状态管理器)

Pinia 是一个专为 Vue 3 设计的状态管理库&#xff0c;它借鉴了 Vuex 的一些概念&#xff0c;但更加轻量灵活。下面将详细介绍如何使用 Pinia 状态管理库&#xff1a; 安装 Pinia 使用 npm&#xff1a;在项目目录下运行npm install pinia。使用 yarn&#xff1a;在项目目录下运…...

Python知识点:基于Python工具,如何使用Web3.py进行以太坊智能合约开发

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 基于Python工具Web3.py进行以太坊智能合约开发 简介 智能合约是区块链技术的核…...

【简信CRM-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

ssm+vue694基于Java的药店药品信息管理系统的设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…...

电脑安装双系统

电脑安装双系统 本次是在Windows 10的环境下安装Ubuntu的系统。 1、可能需要的准备工作 首先打开cmd输入msinfo32的命令查看电脑的BIOS的模式是不是UEFI,如下所示&#xff1a; 本次安装系统基于以上的BIOS模式下。此外如果遇到安装之后不能跳转到ubuntu系统的问题&#xff…...

嵌入式网络开发避坑:LwIP软件定时器溢出处理与链表排序的实战细节

嵌入式网络开发避坑&#xff1a;LwIP软件定时器溢出处理与链表排序的实战细节 在嵌入式网络开发中&#xff0c;LwIP协议栈因其轻量级和高度可裁剪性成为众多开发者的首选。然而&#xff0c;在实际应用中&#xff0c;软件定时器的溢出处理和链表排序逻辑往往是引发隐蔽问题的重灾…...

解决Claude Code频繁封号与Token不足问题转向Taotoken

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 解决Claude Code频繁封号与Token不足问题转向Taotoken 对于依赖Claude Code作为日常编程助手的开发者而言&#xff0c;服务中断是影…...

手把手教你改造10块钱的USBASP烧录器,让它兼容Arduino IDE和AVRDUDESS

10元USBASP烧录器改造实战&#xff1a;解锁Arduino与AVRDUDESS全兼容方案 从闲置到全能&#xff1a;低成本硬件改造的价值探索 在电子制作和嵌入式开发领域&#xff0c;专业烧录工具往往价格不菲。但你可能不知道&#xff0c;手头那台吃灰的"智峰"版USBASP烧录器&…...

免费模组管理器终极指南:快速配置BG3ModManager提升游戏体验

免费模组管理器终极指南&#xff1a;快速配置BG3ModManager提升游戏体验 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. This is the only official source! 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager BG3ModManager是一款专为《…...

MCUXPresso for VS Code插件实战:从零构建NXP MCU的HelloWorld项目

1. 项目概述&#xff1a;为什么选择MCUXPresso for VS Code&#xff1f;如果你是一位嵌入式开发者&#xff0c;尤其是使用恩智浦&#xff08;NXP&#xff09;MCU的工程师&#xff0c;那么你大概率对MCUXpresso IDE不陌生。它是一个功能强大的集成开发环境&#xff0c;但有时我们…...

51单片机计算器DIY:除了加减乘除,你的LCD1602和矩阵键盘还能这样玩?

51单片机计算器进阶指南&#xff1a;解锁LCD1602与矩阵键盘的隐藏玩法 当你在51单片机上成功实现了一个基础计算器后&#xff0c;是否想过这两个核心外设——LCD1602液晶屏和4x4矩阵键盘——还能玩出什么新花样&#xff1f;本文将带你超越简单的加减乘除&#xff0c;探索硬件模…...

Midscene.js:3大技术突破解决跨平台UI自动化的核心痛点

Midscene.js&#xff1a;3大技术突破解决跨平台UI自动化的核心痛点 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 在当今多平台应用爆发的时代&#xff0c;你是…...

好想来万店扩张背后的数据新底座

在中国量贩零食行业的版图上&#xff0c;好想来正以雷霆之势重塑市场格局。作为万辰集团旗下的头部品牌&#xff0c;好想来已在全国布局超过 1.5 万家门店&#xff0c;注册会员超过 1.5 亿&#xff0c;年营收突破 365 亿元&#xff0c;成为名副其实的零售巨擘。这些令人瞩目的数…...

能力本位招聘:打破学历地域限制,聚焦实战技能与远程协作

1. 项目概述&#xff1a;一次非典型的团队组建实验最近&#xff0c;我身边不少朋友和读者都在讨论一个挺有意思的招聘启事&#xff0c;标题就是“朱老师研发团队招人了&#xff01;学历学校不限&#xff0c;地域不限&#xff01;”。这和我们平时在招聘网站上看到的那些要求“9…...