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

SSM项目集成redis、Linux服务器安装redis

在SSM(Spring + Spring MVC + MyBatis)项目中引入Redis主要分为以下步骤,确保配置正确并能在业务中灵活使用:

1. 添加Redis依赖​

在Maven的pom.xml中添加Spring Data Redis和Jedis(或Lettuce)依赖:

	<!-- Spring Data Redis --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.5.2.RELEASE</version></dependency><!-- Jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.1</version></dependency><dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>5.1.4.RELEASE</version></dependency>

​2. 配置Redis连接参数​

在Spring的配置文件(如srping-redis.xml)中配置Redis连接工厂和连接池:

	<!-- jedis 连接池配置 --><bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"><property name="maxIdle" value="${redis.maxIdle}"/><property name="maxWaitMillis" value="${redis.maxWait}"/><property name="testOnBorrow" value="${redis.testOnBorrow}"/></bean><!-- redis连接工厂 --><bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><property name="poolConfig" ref="poolConfig"/><property name="port" value="${redis.port}"/><property name="hostName" value="${redis.host}"/><property name="password" value="${redis.password}"/><property name="database" value="7"/><property name="timeout" value="${redis.timeout}"></property></bean><bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"><property name="connectionFactory" ref="connectionFactory"/><property name="keySerializer"><bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/></property><property name="valueSerializer"><bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/></property></bean><!-- 配置 key 和 value 的序列化器 --><bean id="jdkSerializationRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/><bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>

​3. Redis连工具类

import com.alibaba.fastjson.JSON;
import io.lettuce.core.RedisConnectionException;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import zjhuiwan.cn.controller.fontPage.IndexController;
import zjhuiwan.cn.entity.NullCacheValue;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** Redis工具类**/
@Service
public class RedisPMCacheService {private static final Logger log = LoggerFactory.getLogger(RedisPMCacheService.class);private final StringRedisSerializer serializer = new StringRedisSerializer();@Resourceprivate RedisTemplate<String, Object> redisTemplate;private ValueOperations<String, Object> valueOperations;private HashOperations<String, String, Object> hashOperations;@PostConstructpublic void init(){setRedisTemplate(redisTemplate);}public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {this.redisTemplate = redisTemplate;if (redisTemplate != null) {valueOperations = redisTemplate.opsForValue();hashOperations = redisTemplate.opsForHash();}}public RedisTemplate<String, Object> getRedisTemplate() {return redisTemplate;}public void setValueOperations(ValueOperations<String, Object> valueOperations) {this.valueOperations = valueOperations;}/*** 默认过期时长,单位:秒*/private final static long DEFAULT_EXPIRE = 60 * 60 * 24;/*** 不设置过期时长*/private final static long NOT_EXPIRE = -1;public void set(String key, Object value, long expire) {try {if (expire != NOT_EXPIRE) {expire = getExpire(key, expire);valueOperations.set(key, value, expire, TimeUnit.SECONDS);} else {valueOperations.set(key, value);}} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}}public void set(String key, Object value) {set(key, value, DEFAULT_EXPIRE);}public <V> V get(String key, Class<V> clazz, Callable<? extends V> callable, long expire) {Object value = null;try {value = valueOperations.get(key);} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("{}", ex);}if (value instanceof NullCacheValue) {V result = getDefault(callable);if (result == null) {return null;}set(key, result, expire);return result;}if (value != null) {if (clazz.isAssignableFrom(value.getClass())) {return (V) value;} else if (value instanceof String) {return parseToObj(value.toString(), clazz);}return null;}V result = getDefault(callable);if (result == null) {return null;}set(key, result, expire);return result;}public <V> V get(String key, Callable<? extends V> callable, long expire) {Object value = null;try {value = valueOperations.get(key);} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("{}", ex);}if (value instanceof NullCacheValue) {V result = getDefault(callable);if (result == null) {return null;}set(key, result, expire);return result;}if (value != null) {try {return (V) value;} catch (Exception e) {log.error("callable", e);}}V result = getDefault(callable);if (result == null) {return null;}set(key, result, expire);return result;}/*** 不存null 值** @param key* @param clazz* @param callable* @param <V>* @return*/public <V> V get(String key, Class<V> clazz, Callable<? extends V> callable) {Object value = null;try {value = valueOperations.get(key);} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("{}", ex);}if (value instanceof NullCacheValue) {V result = getDefault(callable);if (result != null) {set(key, result);}return result;}if (value != null) {if (clazz.isAssignableFrom(value.getClass())) {return (V) value;} else if (value instanceof String) {return parseToObj(value.toString(), clazz);}return null;}V result = getDefault(callable);if (result == null) {return null;}set(key, result);return result;}public static <T> T parseToObj(String content, Class<T> classz) {if (content == null || content.length() == 0){return null;}try {return JSON.parseObject(content, classz);} catch (Exception e) {log.error(" content:"+content+ "json反序列化失败", e);}return null;}public <V> V get(String key, Callable<? extends V> callable) {Object value = null;try {value = valueOperations.get(key);} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("{}", ex);}if (value instanceof NullCacheValue) {V result = getDefault(callable);if (result != null) {set(key, result);}return result;}if (value != null) {try {return (V) value;} catch (Exception e) {log.error("callable", e);}}V result = getDefault(callable);if (result == null) {return null;}set(key, result);return result;}public <T> T get(String key, Class<T> clazz, long expire) {Object value = get(key, expire);if (value == null) {return null;}if (clazz.isAssignableFrom(value.getClass())) {return (T) value;} else if (value instanceof String) {return parseToObj(value.toString(), clazz);}log.error("不能解析数据 key:{} value:{}", key, value);return null;}public <T> T get(String key, Class<T> clazz) {return get(key, clazz, NOT_EXPIRE);}public Object get(String key, long expire) {try {Object value = valueOperations.get(key);if (expire != NOT_EXPIRE) {expire = getExpire(key, expire);redisTemplate.expire(key, expire, TimeUnit.SECONDS);}if (value instanceof NullCacheValue) {return null;}return value;} catch (RedisConnectionException ex) {//连接失败次数increaseError();return null;} catch (Exception ex) {log.error("get from cache error", ex);return null;}}public Object get(String key) {return get(key, NOT_EXPIRE);}public void delete(String key) {try {redisTemplate.delete(key);} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("delete cache error", ex);}}public void matchingHashRemove(String key) {Set<String> keys = redisTemplate.keys(key);try {if(CollectionUtils.isNotEmpty(keys)){redisTemplate.delete(keys);}} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("delete cache error", ex);}}/*** todo 待完善* @param key* @param hashKeys*/public void matchingHashRemove(String key,String... hashKeys) {Set<String> keys = redisTemplate.keys(key);try {Object[] args = new Object[hashKeys.length];System.arraycopy(hashKeys, 0, args, 0, hashKeys.length);if(CollectionUtils.isNotEmpty(keys)){for(String val:keys){hashOperations.delete(val, args);}}} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("delete cache error", ex);}}public void clear(String key) {if (key == null || key.length() == 0) {return;}try {Set<String> sets = redisTemplate.keys(key);redisTemplate.delete(sets);} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("delete cache error", ex);}}public boolean hasKey(String key) {if (key == null || key.length() == 0) {return false;}try {Boolean sets = redisTemplate.hasKey(key);return sets;} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("hasKey cache error", ex);}return false;}/*** 使用随机过期时间,解除缓存压力** @param key 本地操作不能使用前缀* @return*/private long getExpire(String key, long expire) {if (expire == NOT_EXPIRE) {return expire;}//取一个过期随机码,随机取之空间为 expire 的0.5 ~ 1.5倍 + 5s,避免redis集中命中return ((Double) (5 + (Math.random() + 0.5) * expire)).longValue();}Random random = new Random();/*** 使用随机过期时间,解除缓存压力** @return*/private long getExpireRand10Minitus(long expire) {if (expire == NOT_EXPIRE) {return expire;}return random.nextInt(1) + expire;}/*** 如果无效,暂时停止五分钟** @return*/private boolean checkValid() {/*if (firstErrorTime > 0 && errorCount.get() > 0) {return false;}*/return true;}private synchronized void increaseError() {/* int count = errorCount.getAndIncrement();if (count <= 0) {firstErrorTime = System.currentTimeMillis();}*/}public Long getLongValue(final String key) {try {return (long) redisTemplate.execute((RedisCallback<Long>) connection -> {byte[] result = connection.get(serializer.serialize(key));String s = serializer.deserialize(result);return parseLong(s);});} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("delete cache error", ex);}return 0L;}public long getAndIncrement(String key) {try {long result = redisTemplate.opsForValue().increment(key,0l);if (result > Integer.MAX_VALUE) {redisTemplate.delete(key);result = 0;}return result;} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("delete cache error", ex);}return 0L;}public void flushDb() {redisTemplate.execute((RedisCallback) connection -> {connection.flushDb();return "ok";});}public void hashAdd(String key, String hashKey, Object value, Integer expired) {if (hashOperations == null) {return;}try {hashOperations.put(key, hashKey, value);if (expired != null && expired > 0) {Long time = getExpireRand10Minitus(expired);redisTemplate.expire(key, time, TimeUnit.SECONDS);}} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}}public Boolean hashExists(String key, String hashKey) {if (hashOperations == null) {return false;}try {return hashOperations.hasKey(key, hashKey);} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}return false;}public void hashAdd(String key, HashMap<String, Object> value) {if (hashOperations == null) {return;}try {hashOperations.putAll(key, value);} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}}private <V> V getDefault(Callable<? extends V> callable) {if (callable == null) {return null;}try {return callable.call();} catch (Exception e) {return null;}}public <V> V hashGet(String key, String hashKey, Class<V> tClass) {if (hashOperations == null || tClass == null) {return null;}try {Object value = hashOperations.get(key, hashKey);if (value instanceof NullCacheValue) {return null;}if (value != null) {if (tClass.isAssignableFrom(value.getClass())) {return (V) value;}}} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}return null;}public <V> V hashGet(String key, String hashKey, Callable<? extends V> callable,Integer expired) {if (hashOperations == null) {return getDefault(callable);}try {Object value = hashOperations.get(key, hashKey);if (value instanceof NullCacheValue) {V result = getDefault(callable);if (result != null) {hashOperations.put(key, hashKey, result);if (expired != null && expired > 0) {Long time = getExpireRand10Minitus(expired);redisTemplate.expire(key, time, TimeUnit.SECONDS);}}return result;}if (value != null) {try {return (V) value;} catch (Exception e) {log.error("callable", e);}}if (callable != null) {V result = callable.call();if (result != null) {hashOperations.put(key, hashKey, result);if (expired != null && expired > 0) {Long time = getExpireRand10Minitus(expired);redisTemplate.expire(key, time, TimeUnit.SECONDS);}}return result;}} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}return getDefault(callable);}public <V> V hashGetWithNull(String key, String hashKey, Callable<? extends V> callable) {if (hashOperations == null) {return getDefault(callable);}try {Object value = hashOperations.get(key, hashKey);if (value instanceof NullCacheValue) {return null;}if (value != null) {try {return (V) value;} catch (Exception e) {log.error("callable", e);}}if (callable != null) {V result = callable.call();hashOperations.put(key, hashKey, result);return result;}} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}return getDefault(callable);}public <V> List<V> hashGetList(String key, String hashKey, Callable<? extends List<V>> callable) {if (hashOperations == null) {return getDefault(callable);}try {Object value = hashOperations.get(key, hashKey);if (value instanceof NullCacheValue) {List<V> result = getDefault(callable);if (result == null) {return new LinkedList<>();}return null;}if (value != null) {try {return (List<V>) value;} catch (Exception e) {log.error("callable", e);}}if (callable != null) {List<V> result = callable.call();if (result == null) {return new LinkedList<>();}hashOperations.put(key, hashKey, result);return result;}} catch (RedisConnectionException ex) {//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}return getDefault(callable);}public Map<String, Object> getMap(String key) {if (hashOperations == null) {return new HashMap<>();}try {return hashOperations.entries(key);} catch (RedisConnectionException ex) {log.error("缓存加载异常", ex);//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}return new HashMap<>();}public void hashRemove(String key, String... hashKeys) {if (hashOperations == null || hashKeys == null || hashKeys.length == 0) {return;}Object[] args = new Object[hashKeys.length];System.arraycopy(hashKeys, 0, args, 0, hashKeys.length);try {hashOperations.delete(key, args);} catch (RedisConnectionException ex) {log.error("缓存加载异常", ex);//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}}/*** 向缓存中添加值** @param key* @param values*/public void setAdd(String key, Object... values) {if (redisTemplate == null || key == null) {return;}try {SetOperations<String, Object> setOperations = redisTemplate.opsForSet();setOperations.add(key, values);} catch (RedisConnectionException ex) {log.error("缓存加载异常", ex);//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}}/*** 判断缓存set中是否存在指定值** @param key* @param value* @return*/public Boolean setExists(String key, Object value) {if (redisTemplate == null || key == null) {return false;}try {SetOperations<String, Object> setOperations = redisTemplate.opsForSet();return setOperations.isMember(key, value);} catch (RedisConnectionException ex) {log.error("缓存加载异常", ex);//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}return false;}/*** 获取缓存 set** @param key* @return*/public Set<Object> setMembers(String key) {if (redisTemplate == null || key == null) {return new HashSet<>();}try {SetOperations<String, Object> setOperations = redisTemplate.opsForSet();return setOperations.members(key);} catch (RedisConnectionException ex) {log.error("缓存加载异常", ex);//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}return new HashSet<>();}public void expire(String key, Integer second) {if (redisTemplate == null || key == null) {return  ;}try {redisTemplate.expire(key,second,TimeUnit.SECONDS);} catch (RedisConnectionException ex) {log.error("缓存加载异常", ex);//连接失败次数increaseError();} catch (Exception ex) {log.error("缓存加载异常", ex);}}public static long parseLong(Object obj) {if (obj == null){return 0;}if (obj instanceof Integer) {return (long)((Integer) obj);} else if (obj instanceof Long) {return (Long) obj;}String s = obj.toString();if(StringUtils.isEmpty(s)){return 0L;}if(s.length()>=32){throw new SecurityException("长整数转换失败,GUID 转整数临时方案使用:"+s);}if (isNumeric(s)){return Long.parseLong(s);}return 0L;}public static Pattern NUMBER_PATTERN = Pattern.compile("(?:[0-9]*)|(?:-[0-9]*)");private static boolean isNumeric(String str) {Matcher isNum = NUMBER_PATTERN.matcher(str);if (isNum.matches()) {return true;} else {return false;}}}

​常见问题排查​

  • ​连接失败​​:检查Redis服务是否启动、防火墙是否开放端口(默认6379)。
  • ​序列化错误​​:确保Key和Value的序列化方式一致,避免使用默认JDK序列化。
  • ​依赖冲突​​:调整Spring Data Redis与Jedis的版本,确保兼容性。(我的spring版本是4.1.7)

在Linux系统上安装并启动Redis的步骤如下:

下载Redis源码​

从官网下载最新稳定版(以7.0.12为例):

wget https://download.redis.io/releases/redis-7.0.12.tar.gz
tar xzf redis-7.0.12.tar.gz
cd redis-7.0.12

编译并安装Redis​

# 编译源码
make# 安装到系统目录(默认路径:/usr/local/bin)
sudo make install

配置Redis​

​1 创建配置文件目录和数据目录​
sudo mkdir /etc/redis
sudo mkdir /var/lib/redis
2 复制默认配置文件​
sudo cp redis.conf /etc/redis/redis.conf

3 修改配置文件​

编辑 /etc/redis/redis.conf,调整以下参数:

# 允许后台运行
daemonize yes# 数据存储路径
dir /var/lib/redis# 绑定IP(默认只能本地访问,如需远程访问改为 0.0.0.0)
bind 127.0.0.1# 设置密码(可选)
requirepass yourpassword# 日志文件路径
logfile /var/log/redis/redis-server.log

启动Redis​

直接启动​
redis-server /etc/redis/redis.conf

验证Redis运行状态

# 检查服务状态
sudo systemctl status redis# 测试连接
redis-cli ping
# 若设置了密码,需先认证
redis-cli -a yourpassword ping

输出 PONG 表示成功。

常用命令​

启动/停止/重启服务​​:

sudo systemctl start redis
sudo systemctl stop redis
sudo systemctl restart redis

​查看日志​​:

tail -f /var/log/redis/redis-server.log

常见问题​

Q1:编译时报错“jemalloc/jemalloc.h: No such file”​
  • ​解决​​:清理后重新编译:
make distclean
make
Q2:启动失败提示“Permission denied”​
  • ​解决​​:确保Redis用户有数据目录权限:
​sudo chown -R redis:redis /var/lib/redis

 Q3:远程连接失败​

  • ​解决​​:
    1. 检查 bind 0.0.0.0 是否已配置。
    2. 确认防火墙已开放端口。
    3. 检查Redis服务是否监听正确IP:
sudo netstat -tulnp | grep redis

云服务器安全组检查(关键!)

如果服务器位于云平台(如阿里云、腾讯云),即使本地防火墙已开放端口,仍需检查云厂商的安全组规则

  • 登录云控制台,找到对应服务器的安全组配置。
  • 添加规则:协议 TCP,端口 6379,来源 0.0.0.0/0(测试用)或指定客户端 IP。

相关文章:

SSM项目集成redis、Linux服务器安装redis

在SSM&#xff08;Spring Spring MVC MyBatis&#xff09;项目中引入Redis主要分为以下步骤&#xff0c;确保配置正确并能在业务中灵活使用&#xff1a; 1. 添加Redis依赖​​ 在Maven的pom.xml中添加Spring Data Redis和Jedis&#xff08;或Lettuce&#xff09;依赖&#…...

sqli-labs靶场第七关——文件导出注入

一&#xff1a;目标 通过sql注入将php代码写入网站目录&#xff0c;通过这个php文件执行命令 二&#xff1a;确认前置条件 %secure_file_priv% 首先我们需要Mysql是否允许导出文件 先尝试在网页中sql注入&#xff0c;检查导出权限 ?id1)) union select 1,secure_file_pr…...

python使用matplotlib无法显示中文字体报错

python使用matplotlib字体报错 当我们使用python使用matplotlib总是出现报错&#xff0c;图片中文变成方框 findfont: Font family WenQuanYi Micro Hei not found. findfont: Font family Heiti TC not found. findfont: Font family [SimHei] not found. Falling back to De…...

VTEP是什么

VTEP&#xff08;VXLAN Tunnel Endpoint&#xff0c;VXLAN 隧道端点&#xff09;是 VXLAN&#xff08;Virtual Extensible LAN&#xff09;网络中的关键组件&#xff0c;用于处理 VXLAN 流量的封装和解封装。以下以可读的 Markdown 格式详细解释 VTEP 的定义、功能、实现方式以…...

React Native简介

React Native 是由 Meta&#xff08;原 Facebook&#xff09;开源的跨平台移动应用开发框架&#xff0c;基于 React 和 JavaScript&#xff0c;允许开发者使用同一套代码库构建 iOS 和 Android 原生应用。通过 JavaScript 调用原生组件实现高性能渲染。 跨平台开发 共享 80%-9…...

边缘计算模块

本文来源 &#xff1a;腾讯元宝 边缘计算模块是一种部署在网络边缘&#xff08;靠近数据源&#xff09;的集成化硬件/软件设备&#xff0c;用于实时处理本地数据&#xff0c;减少云端依赖&#xff0c;提升响应速度与安全性。以下是其核心要点&#xff1a; ​​1. 核心组成​​ …...

策略模式-枚举实现

策略模式的实现方法有很多&#xff0c;可以通过策略类if,else实现。下面是用枚举类实现策略模式的方法。 定义一个枚举类&#xff0c;枚举类有抽象方法&#xff0c;每个枚举都实现抽象方法。这个策略&#xff0c;实现方法是工具类的很实现&#xff0c;代码简单好理解 枚举实现…...

C++算法(22):二维数组参数传递,从内存模型到高效实践

引言 在C程序设计中&#xff0c;二维数组的参数传递是许多开发者面临的棘手问题。不同于一维数组的相对简单性&#xff0c;二维数组在内存结构、类型系统和参数传递机制上都存在独特特性。本文将深入探讨静态数组、动态数组以及STL容器三种实现方式&#xff0c;通过底层原理分…...

LeetCode LCR 015. 找到字符串中所有字母异位词 (Java)

LCR 015. 找到字符串中所有字母异位词 题目描述 给定两个字符串 s 和 p&#xff0c;要求找到 s 中所有是 p 的变位词&#xff08;字母相同但排列不同&#xff09;的子串&#xff0c;并返回这些子串的起始索引。例如&#xff1a; 输入 s "cbaebabacd", p "a…...

幼儿学前教育答辩词答辩技巧问题答辩自述稿

### &#x1f4d8;《幼儿园大班活动开展存在的问题及解决策略》&#x1f4dd; 我的论文题目是《幼儿园大班活动开展存在的问题及解决策略》&#x1f4d6;。我将从论文框架、研究内容、需要解决的问题、研究结论这四部分来阐述我的论文&#x1f4dd;。 论文框架由绪论&#x1f4…...

双目立体视觉

文章目录 1&#xff0c;前言2&#xff0c;原理3&#xff0c;组成部分3.1&#xff0c;数字图像采集。3.2 &#xff0c;相机标定。3.3&#xff0c;图像预处理与特征提取。3.4 &#xff0c;图像校正。3.5 &#xff0c;立体匹配。3.6 &#xff0c;三维重建。 4&#xff0c;主要的算…...

机器人弧焊二八混合气体节约

焊接技术在现代工业生产中作为关键环节之一&#xff0c;其效率和成本直接影响到整个制造流程的经济性与环保性。近年来&#xff0c;随着节能减排理念深入人心&#xff0c;各行业都在积极探索绿色制造方案。在焊接领域&#xff0c;二八混合气体的应用结合WGFACS智能流量调节系统…...

Linux进程通讯和原子性

在Linux系统中&#xff0c;进程间通信&#xff08;IPC&#xff09;和原子性是并发编程中的核心问题。以下是对这些概念的详细分步解释&#xff1a; 一、进程间通信&#xff08;IPC&#xff09;方法 1. 管道&#xff08;Pipe&#xff09; 匿名管道&#xff1a;用于父子进程等有…...

深度学习之用CelebA_Spoof数据集搭建一个活体检测-一些模型训练中的改动带来的改善

实验背景 在前面的深度学习之用CelebA_Spoof数据集搭建一个活体检测-模型搭建和训练&#xff0c;我们基于CelebA_Spoof数据集构建了一个用SqueezeNe框架进行训练的活体2D模型&#xff0c;采用了蒸馏法进行了一些简单的工作。在前面提供的训练参数中&#xff0c;主要用了以下几…...

Oracle APEX IR报表列宽调整

1. 问题&#xff1a;如何调整Oracle APEX IR报表列宽 1-1. 防止因标题长而数据短&#xff0c;导致标题行的文字都立起来了&#xff0c;不好看。 1-2. 防止因数据太长而且中间还没有空格&#xff0c;把列撑开的太宽也不换行&#xff0c;不好看。 2. 解决办法 针对如上问题解…...

6大核心记忆方法

以下是结合脑科学原理和高效学习策略总结的 6大核心记忆方法&#xff0c;帮助你摆脱“学完就忘”的困境&#xff1a; 一、间隔重复与分散学习 遵循艾宾浩斯遗忘曲线&#xff1a;学习后20分钟遗忘58%&#xff0c;1天后遗忘66%。通过设定复习节点&#xff08;如学后1天、3天、1周…...

conda更换清华源

1、概览 anaconda更换速度更快、更稳定的下载源&#xff0c;在linux环境测试通过。 2、conda源查看 在修改之前可以查看下现有conda源是什么&#xff0c;查看conda配置信息&#xff0c;如下&#xff1a; cat ~/.condarc 可以看到你的conda源&#xff0c;以我的conda源举例&am…...

5月15日星期四今日早报简报微语报早读

5月15日星期四&#xff0c;农历四月十八&#xff0c;早报#微语早读。 1、中国至越南河内国际道路运输线路正式开通&#xff1b; 2、免签国1&#xff0c;中乌&#xff08;兹别克斯坦&#xff09;互免签证协定6月生效&#xff1b; 3、杭州“放大招”支持足球发展&#xff1a;足…...

网络损伤仪功能介绍与应用场景剖析

以下是关于 网络损伤仪&#xff08;Network Impairment Emulator&#xff09; 的核心功能介绍及其应用场景的详细说明&#xff1a; 一、网络损伤仪的核心功能 带宽限制&#xff08;Bandwidth Throttling&#xff09; 模拟不同网络带宽&#xff08;如从1Mbps到10Gbps&#xff09…...

超时检测机制和心跳包机制(Heartbeat)

一、超时检测机制 1. I/O 函数超时设置 1.1 select/poll/epoll 的超时参数 select c struct timeval timeout {3, 0}; // 3秒超时 int n select(maxfd1, &readfds, NULL, NULL, &timeout); if (n 0) printf("select timeout\n"); // 超时无事件poll c …...

经典卷积神经网络

目录 经典卷积神经网络 一、卷积神经网络基础回顾 二、LeNet&#xff1a;开启 CNN 先河 三、AlexNet&#xff1a;突破性进展 四、ZFNet&#xff1a;继承与优化 五、GoogLeNet&#xff1a;引入 Inception 模块 六、VggNet&#xff1a;深度与简单结构的融合 七、ResNet&a…...

Reactor模型详解与C++实现

Reactor模型详解与C实现 一、Reactor模型核心思想 Reactor模式是一种事件驱动的并发处理模型&#xff0c;核心通过同步I/O多路复用实现对多个I/O源的监听&#xff0c;当有事件触发时&#xff0c;派发给对应处理器进行非阻塞处理。 关键特征&#xff1a; 非阻塞I/O&#xff…...

观测云产品更新 | 安全监测、事件中心、仪表板AI智能分析等

观测云更新 安全监测 新增 SIEM 功能模块&#xff1a;实时分析企业各类系统&#xff08;如服务器、应用、网络设备&#xff09;的日志和事件数据&#xff0c;自动发现潜在威胁&#xff0c;帮助团队迅速定位异常&#xff0c;充分发挥安全监控中枢的作用。 注意&#xff1a;目…...

【HTML】个人博客页面

目录 页面视图​编辑 页面代码 解释&#xff1a; HTML (<body>): 使用了更加语义化的HTML5标签&#xff0c;例如<header>, <main>, <article>, <footer>。文章列表使用了<article>包裹&#xff0c;结构清晰。添加了分页导航。使用了Font…...

OrangePi Zero 3学习笔记(Android篇)10 - SPI和从设备

目录 1. 配置内核 2. 修改设备数 3. 修改权限 4. 验证 Zero 3的板子有2个SPI Master接口&#xff0c;其中SPI0接的是板载16MB大小的SPI Nor Flash&#xff0c;SPI1则是导出到26pin的接口上。 spi和i2c有点不同&#xff0c;spi是直接生成spi虚拟设备&#xff0c;所以在dev里…...

《Java 大视界——Java 大数据在智能电网分布式能源协同调度中的应用与挑战》

随着风电、光伏等分布式能源大规模接入电网&#xff0c;传统调度系统面临数据规模激增、响应延迟显著、多源异构数据融合困难等核心问题。本文聚焦Java生态下的大数据技术体系&#xff0c;深入探讨其在智能电网实时监测、负荷预测、资源优化配置等场景中的落地实践。通过分析Sp…...

基于正点原子探索者开发板的简易音乐播放器

1、概述 本次实验的名称叫做“基于正点原子探索者开发板的简易音乐播放器”。本实验的功能框图如下&#xff1a; 从图上我们可以清晰的看到本实验所需的实现的功能、以及每个功能需要怎么实现。 这次实验使用的是正点原子的探索者开发板&#xff0c;此开发板采用的MCU是STM32F4…...

【CF】Day59——Codeforces Round 914 (Div. 2) D

D. Set To Max 题目&#xff1a; Easy 思路&#xff1a; 简单题 由于题目的数据给的很小&#xff0c;所以我们可以用 n 的复杂度过&#xff0c;那我们来观察一下我们应该怎么操作 显然&#xff0c;如果 a[i] > b[i] 时是无法构造的&#xff0c;同时 a[i] b[i] 时就不用管…...

【Linux专栏】Linux进程间关系和守护进程

文章目录 1、进程间关系1.1 进程组1.2 组长进程 2、会话&#xff1f;2.1 查看会话2.2 创建会话 3、控制终端4、作业控制4.1 前台/后台进程 5、守护进程5.1 如何创建守护进程&#xff1f;5.2 杀掉守护进程 1、进程间关系 主要描述两个名称概念&#xff1a;即进程组和组长进程。…...

AutoVACUUM (PostgreSQL) 与 DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC (Oracle) 对比

AutoVACUUM (PostgreSQL) 与 DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC (Oracle) 对比 核心功能对比 特性PostgreSQL AutoVACUUMOracle GATHER_DATABASE_STATS_JOB_PROC主要目的空间回收 统计信息更新仅优化器统计信息收集底层机制MVCC(多版本并发控制)维护CBO(基于成本的…...

go依赖查询工具之godepgraph(分析main.go的依赖树)

文章目录 go依赖查询工具之godepgraph&#xff08;分析main.go的依赖树&#xff09;什么是服务间的隐式耦合&#xff1f;分析main.go的依赖树方法1. godepgraph (配合 Graphviz 可视化) - 最直观【推荐】方法2. go list go依赖查询工具之godepgraph&#xff08;分析main.go的依…...

市场差分探头信号输出形式的一些因素考量

在5G/6G通信、新能源汽车电控等高频测量场景中&#xff0c;差分探头的信号输出架构直接影响测试系统的信噪比与可靠性。根据IEEE仪器与测量协会2024年度报告&#xff0c;单端输出方案的市场渗透率较2020年提升42%&#xff0c;这一趋势背后蕴含着深刻的技术变革逻辑。 一、核心…...

SQL练习——day01

力扣——SQL练习总结 DENSE_RANK()窗口函数 这是排名函数的一种&#xff0c;它在处理相同值时&#xff0c;会给相同的值分配相同的排名&#xff0c;并且后续的排名不会跳过。比如有三个分数并列第一&#xff0c;那么它们的排名都是 1&#xff0c;接下来的分数排名就是 2&#…...

断点续传使用场景,完整前后端实现示例,包括上传,下载,验证

断点续传在多个场景中非常有用&#xff0c;包括但不限于大文件上传、跨国或跨区域文件传输、移动设备文件传输、备份和同步以及软件更新等。接下来&#xff0c;我将为你提供一个基于Java的后端实现示例&#xff0c;结合前端逻辑来完成整个断点续传的功能&#xff0c;包括上传、…...

Xinference推理框架

概述 GitHub&#xff0c;官方文档。 核心优势 性能优化&#xff1a;通过vLLM、SGLang等引擎实现低延迟推理&#xff0c;吞吐量提升2-3倍&#xff1b;企业级支持&#xff1a;支持分布式部署、国产硬件适配及模型全生命周期管理&#xff1b;生态兼容&#xff1a;无缝对接LangC…...

技术更新频繁,团队如何适应变化

构建持续学习机制、引入技术雷达与预研机制、通过敏捷方法快速响应变化、推动跨团队知识协作与传承 是应对技术更新频繁、团队保持适应力的核心策略。其中&#xff0c;构建持续学习机制尤为关键。通过制度化、场景化的学习安排&#xff0c;团队可以主动追踪新技术趋势&#xff…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-MCP大模型上下文解析

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs-MCP大模型上下文解析 我们首先来看一下 整个MCP的一个基本的一个流程&#xff0c;他解决的一个问题。我们回到这里&#xff0c;他解决的一个问题是什么呢&#xff1f;他解决这个问题就是你的大…...

游戏代码混淆的作用与应用分析

1. 防止逆向工程 核心保护对象&#xff1a;游戏引擎、算法&#xff08;如物理模拟、AI行为树&#xff09;、加密逻辑等。实例&#xff1a;Unity游戏使用 ConfuserEx 混淆C#代码&#xff0c;使反编译工具&#xff08;如dnSpy&#xff09;只能显示杂乱命名&#xff0c;难以理解逻…...

信息系统运行管理员:临阵磨枪版

信息系统运行管理员考试 - 全覆盖详细背诵大纲 (根据考情分析和原始材料&#xff0c;力求完整覆盖考点细节) 第一部分&#xff1a;基础知识与运维概览 Chapter 1: 信息系统运维概述 (上午题 5分) 信息&#xff1a; 含义&#xff1a;香农 - 减少随机不确定性的东西&#xff1b…...

PWM(脉宽调制)的配置参数[预分频器\自动重载值]的自动计算

文章目录 前言一、数据结构二、二分法搜索最佳预分频器和自动重载值三、示例 前言 pwm是嵌入式开发过程中很常见的一个模块&#xff0c;而配置pwm的过程中就少不了频率参数的计算&#xff0c;大多数32位机的pwm频率都由时钟、预分频器&#xff08;prescaler&#xff09;、自动…...

manuskript开源程序是面向作家的开源工具

一、软件介绍 文末提供程序和源码下载 manuskript开源程序是面向作家的开源工具&#xff0c;Manuskript 可在 GNU/Linux、Mac OS X 和 Windows 上运行。 二、Features 特征 Manuskript provides a rich environment to help writers create their first draft and then furt…...

antd 主题色定制

定制方案&#xff1a; 1. 全局定制 整个应用范围内的组件都生效 全局文件 theme.css :root:root {--adm-color-primary: #a062d4; } antd-mobile 中的主题变量也是在 :root 下声明的&#xff0c;所以在有些情况会由于优先级的问题无法覆盖。通过 :root:root 显式地让你所…...

召回11:地理位置召回、作者召回、缓存召回

GeoHash 召回 属于地理位置召回&#xff0c;用户可能对附近发生的事情感兴趣。GeoHash 是一种对经纬度的编码&#xff0c;地图上每个单位矩形的 GeoHash 的前几位是相同的&#xff0c;GeoHash 编码截取前几位后&#xff0c;将相同编码发布的内容按时间顺序&#xff08;先是时间…...

leetcode0767. 重构字符串-medium

1 题目&#xff1a;重构字符串 官方标定难度&#xff1a;中 给定一个字符串 s &#xff0c;检查是否能重新排布其中的字母&#xff0c;使得两相邻的字符不同。 返回 s 的任意可能的重新排列。若不可行&#xff0c;返回空字符串 “” 。 示例 1: 输入: s “aab” 输出: “…...

vue基本介绍

Vue是一款流行的JavaScript前端框架&#xff0c;以下是其基本介绍&#xff1a; 发展历程 - 2014年&#xff0c;尤雨溪发布了Vue的第一个版本。 - 此后&#xff0c;Vue不断发展和完善&#xff0c;陆续发布了多个版本&#xff0c;功能逐渐强大&#xff0c;社区也日益活跃。 …...

【vue】【环境配置】项目无法npm run serve,显示node版本过低

解决方案&#xff1a;安装高版本node&#xff0c;并且启用高版本node 步骤&#xff1a; 1、查看当前版本 node -v2、配置nvm下载镜像源 1&#xff09;查看配置文件位置 npm root2&#xff09;找到settings.txt文件 修改镜像源为&#xff1a; node_mirror: https://npmmirro…...

第35周Zookkeeper+Dubbo JDK不同版本介绍

一、JDK 新特性全解析 JDK9 - 模块化&#xff1a;化繁为简的魔法 模块化特性&#xff1a;JDK9 给 Java 程序带来模块化特性&#xff0c;就像把一个大公司划分成多个部门&#xff0c;每个部门&#xff08;模块&#xff09;各司其职。模块比包更大&#xff0c;一个模块包含多个…...

【ORB-SLAM3】CreateNewKeyFrame()函数阅读

void Tracking::CreateNewKeyFrame() void Tracking::CreateNewKeyFrame() {// 如果局部建图线程正在初始化且没做完或关闭了,就无法插入关键帧if(mpLocalMapper->IsInitializing() && !mpAtlas->isImuInitialized())return;if(!mpLocalMapper->SetNotStop(t…...

腾讯开源实时语音大模型VITA-audio,92mstoken极速响应,支持多语言~

简介 VITA-Audio 是一个由腾讯优图实验室&#xff08;Tencent Youtu Lab&#xff09;、南京大学和厦门大学的研究人员共同开发的项目&#xff0c;旨在解决现有语音模型在流式生成&#xff08;streaming&#xff09;场景下生成第一个音频令牌&#xff08;token&#xff09;时的高…...

使用 TypeScript + dhtmlx-gantt 在 Next.js 中实现

1. 安装依赖&#xff08;确保已安装&#xff09; npm install dhtmlx-gantt2. 创建 pages/gantt.tsx use clientimport { useRef, useEffect } from react import { gantt } from dhtmlx-gantt import dhtmlx-gantt/codebase/dhtmlxgantt.cssinterface Task {id: number | st…...