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:远程连接失败
- 解决:
- 检查
bind 0.0.0.0
是否已配置。 - 确认防火墙已开放端口。
- 检查Redis服务是否监听正确IP:
- 检查
sudo netstat -tulnp | grep redis
云服务器安全组检查(关键!)
如果服务器位于云平台(如阿里云、腾讯云),即使本地防火墙已开放端口,仍需检查云厂商的安全组规则:
- 登录云控制台,找到对应服务器的安全组配置。
- 添加规则:协议
TCP
,端口6379
,来源0.0.0.0/0
(测试用)或指定客户端 IP。
相关文章:
SSM项目集成redis、Linux服务器安装redis
在SSM(Spring Spring MVC MyBatis)项目中引入Redis主要分为以下步骤,确保配置正确并能在业务中灵活使用: 1. 添加Redis依赖 在Maven的pom.xml中添加Spring Data Redis和Jedis(或Lettuce)依赖&#…...
sqli-labs靶场第七关——文件导出注入
一:目标 通过sql注入将php代码写入网站目录,通过这个php文件执行命令 二:确认前置条件 %secure_file_priv% 首先我们需要Mysql是否允许导出文件 先尝试在网页中sql注入,检查导出权限 ?id1)) union select 1,secure_file_pr…...
python使用matplotlib无法显示中文字体报错
python使用matplotlib字体报错 当我们使用python使用matplotlib总是出现报错,图片中文变成方框 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(VXLAN Tunnel Endpoint,VXLAN 隧道端点)是 VXLAN(Virtual Extensible LAN)网络中的关键组件,用于处理 VXLAN 流量的封装和解封装。以下以可读的 Markdown 格式详细解释 VTEP 的定义、功能、实现方式以…...
React Native简介
React Native 是由 Meta(原 Facebook)开源的跨平台移动应用开发框架,基于 React 和 JavaScript,允许开发者使用同一套代码库构建 iOS 和 Android 原生应用。通过 JavaScript 调用原生组件实现高性能渲染。 跨平台开发 共享 80%-9…...
边缘计算模块
本文来源 :腾讯元宝 边缘计算模块是一种部署在网络边缘(靠近数据源)的集成化硬件/软件设备,用于实时处理本地数据,减少云端依赖,提升响应速度与安全性。以下是其核心要点: 1. 核心组成 …...
策略模式-枚举实现
策略模式的实现方法有很多,可以通过策略类if,else实现。下面是用枚举类实现策略模式的方法。 定义一个枚举类,枚举类有抽象方法,每个枚举都实现抽象方法。这个策略,实现方法是工具类的很实现,代码简单好理解 枚举实现…...
C++算法(22):二维数组参数传递,从内存模型到高效实践
引言 在C程序设计中,二维数组的参数传递是许多开发者面临的棘手问题。不同于一维数组的相对简单性,二维数组在内存结构、类型系统和参数传递机制上都存在独特特性。本文将深入探讨静态数组、动态数组以及STL容器三种实现方式,通过底层原理分…...
LeetCode LCR 015. 找到字符串中所有字母异位词 (Java)
LCR 015. 找到字符串中所有字母异位词 题目描述 给定两个字符串 s 和 p,要求找到 s 中所有是 p 的变位词(字母相同但排列不同)的子串,并返回这些子串的起始索引。例如: 输入 s "cbaebabacd", p "a…...
幼儿学前教育答辩词答辩技巧问题答辩自述稿
### 📘《幼儿园大班活动开展存在的问题及解决策略》📝 我的论文题目是《幼儿园大班活动开展存在的问题及解决策略》📖。我将从论文框架、研究内容、需要解决的问题、研究结论这四部分来阐述我的论文📝。 论文框架由绪论Ǵ…...
双目立体视觉
文章目录 1,前言2,原理3,组成部分3.1,数字图像采集。3.2 ,相机标定。3.3,图像预处理与特征提取。3.4 ,图像校正。3.5 ,立体匹配。3.6 ,三维重建。 4,主要的算…...
机器人弧焊二八混合气体节约
焊接技术在现代工业生产中作为关键环节之一,其效率和成本直接影响到整个制造流程的经济性与环保性。近年来,随着节能减排理念深入人心,各行业都在积极探索绿色制造方案。在焊接领域,二八混合气体的应用结合WGFACS智能流量调节系统…...
Linux进程通讯和原子性
在Linux系统中,进程间通信(IPC)和原子性是并发编程中的核心问题。以下是对这些概念的详细分步解释: 一、进程间通信(IPC)方法 1. 管道(Pipe) 匿名管道:用于父子进程等有…...
深度学习之用CelebA_Spoof数据集搭建一个活体检测-一些模型训练中的改动带来的改善
实验背景 在前面的深度学习之用CelebA_Spoof数据集搭建一个活体检测-模型搭建和训练,我们基于CelebA_Spoof数据集构建了一个用SqueezeNe框架进行训练的活体2D模型,采用了蒸馏法进行了一些简单的工作。在前面提供的训练参数中,主要用了以下几…...
Oracle APEX IR报表列宽调整
1. 问题:如何调整Oracle APEX IR报表列宽 1-1. 防止因标题长而数据短,导致标题行的文字都立起来了,不好看。 1-2. 防止因数据太长而且中间还没有空格,把列撑开的太宽也不换行,不好看。 2. 解决办法 针对如上问题解…...
6大核心记忆方法
以下是结合脑科学原理和高效学习策略总结的 6大核心记忆方法,帮助你摆脱“学完就忘”的困境: 一、间隔重复与分散学习 遵循艾宾浩斯遗忘曲线:学习后20分钟遗忘58%,1天后遗忘66%。通过设定复习节点(如学后1天、3天、1周…...
conda更换清华源
1、概览 anaconda更换速度更快、更稳定的下载源,在linux环境测试通过。 2、conda源查看 在修改之前可以查看下现有conda源是什么,查看conda配置信息,如下: cat ~/.condarc 可以看到你的conda源,以我的conda源举例&am…...
5月15日星期四今日早报简报微语报早读
5月15日星期四,农历四月十八,早报#微语早读。 1、中国至越南河内国际道路运输线路正式开通; 2、免签国1,中乌(兹别克斯坦)互免签证协定6月生效; 3、杭州“放大招”支持足球发展:足…...
网络损伤仪功能介绍与应用场景剖析
以下是关于 网络损伤仪(Network Impairment Emulator) 的核心功能介绍及其应用场景的详细说明: 一、网络损伤仪的核心功能 带宽限制(Bandwidth Throttling) 模拟不同网络带宽(如从1Mbps到10Gbps)…...
超时检测机制和心跳包机制(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:开启 CNN 先河 三、AlexNet:突破性进展 四、ZFNet:继承与优化 五、GoogLeNet:引入 Inception 模块 六、VggNet:深度与简单结构的融合 七、ResNet&a…...
Reactor模型详解与C++实现
Reactor模型详解与C实现 一、Reactor模型核心思想 Reactor模式是一种事件驱动的并发处理模型,核心通过同步I/O多路复用实现对多个I/O源的监听,当有事件触发时,派发给对应处理器进行非阻塞处理。 关键特征: 非阻塞I/Oÿ…...
观测云产品更新 | 安全监测、事件中心、仪表板AI智能分析等
观测云更新 安全监测 新增 SIEM 功能模块:实时分析企业各类系统(如服务器、应用、网络设备)的日志和事件数据,自动发现潜在威胁,帮助团队迅速定位异常,充分发挥安全监控中枢的作用。 注意:目…...
【HTML】个人博客页面
目录 页面视图编辑 页面代码 解释: HTML (<body>): 使用了更加语义化的HTML5标签,例如<header>, <main>, <article>, <footer>。文章列表使用了<article>包裹,结构清晰。添加了分页导航。使用了Font…...
OrangePi Zero 3学习笔记(Android篇)10 - SPI和从设备
目录 1. 配置内核 2. 修改设备数 3. 修改权限 4. 验证 Zero 3的板子有2个SPI Master接口,其中SPI0接的是板载16MB大小的SPI Nor Flash,SPI1则是导出到26pin的接口上。 spi和i2c有点不同,spi是直接生成spi虚拟设备,所以在dev里…...
《Java 大视界——Java 大数据在智能电网分布式能源协同调度中的应用与挑战》
随着风电、光伏等分布式能源大规模接入电网,传统调度系统面临数据规模激增、响应延迟显著、多源异构数据融合困难等核心问题。本文聚焦Java生态下的大数据技术体系,深入探讨其在智能电网实时监测、负荷预测、资源优化配置等场景中的落地实践。通过分析Sp…...
基于正点原子探索者开发板的简易音乐播放器
1、概述 本次实验的名称叫做“基于正点原子探索者开发板的简易音乐播放器”。本实验的功能框图如下: 从图上我们可以清晰的看到本实验所需的实现的功能、以及每个功能需要怎么实现。 这次实验使用的是正点原子的探索者开发板,此开发板采用的MCU是STM32F4…...
【CF】Day59——Codeforces Round 914 (Div. 2) D
D. Set To Max 题目: Easy 思路: 简单题 由于题目的数据给的很小,所以我们可以用 n 的复杂度过,那我们来观察一下我们应该怎么操作 显然,如果 a[i] > b[i] 时是无法构造的,同时 a[i] b[i] 时就不用管…...
【Linux专栏】Linux进程间关系和守护进程
文章目录 1、进程间关系1.1 进程组1.2 组长进程 2、会话?2.1 查看会话2.2 创建会话 3、控制终端4、作业控制4.1 前台/后台进程 5、守护进程5.1 如何创建守护进程?5.2 杀掉守护进程 1、进程间关系 主要描述两个名称概念:即进程组和组长进程。…...
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(分析main.go的依赖树)什么是服务间的隐式耦合?分析main.go的依赖树方法1. godepgraph (配合 Graphviz 可视化) - 最直观【推荐】方法2. go list go依赖查询工具之godepgraph(分析main.go的依…...
市场差分探头信号输出形式的一些因素考量
在5G/6G通信、新能源汽车电控等高频测量场景中,差分探头的信号输出架构直接影响测试系统的信噪比与可靠性。根据IEEE仪器与测量协会2024年度报告,单端输出方案的市场渗透率较2020年提升42%,这一趋势背后蕴含着深刻的技术变革逻辑。 一、核心…...
SQL练习——day01
力扣——SQL练习总结 DENSE_RANK()窗口函数 这是排名函数的一种,它在处理相同值时,会给相同的值分配相同的排名,并且后续的排名不会跳过。比如有三个分数并列第一,那么它们的排名都是 1,接下来的分数排名就是 2&#…...
断点续传使用场景,完整前后端实现示例,包括上传,下载,验证
断点续传在多个场景中非常有用,包括但不限于大文件上传、跨国或跨区域文件传输、移动设备文件传输、备份和同步以及软件更新等。接下来,我将为你提供一个基于Java的后端实现示例,结合前端逻辑来完成整个断点续传的功能,包括上传、…...
Xinference推理框架
概述 GitHub,官方文档。 核心优势 性能优化:通过vLLM、SGLang等引擎实现低延迟推理,吞吐量提升2-3倍;企业级支持:支持分布式部署、国产硬件适配及模型全生命周期管理;生态兼容:无缝对接LangC…...
技术更新频繁,团队如何适应变化
构建持续学习机制、引入技术雷达与预研机制、通过敏捷方法快速响应变化、推动跨团队知识协作与传承 是应对技术更新频繁、团队保持适应力的核心策略。其中,构建持续学习机制尤为关键。通过制度化、场景化的学习安排,团队可以主动追踪新技术趋势ÿ…...
解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-MCP大模型上下文解析
解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-MCP大模型上下文解析 我们首先来看一下 整个MCP的一个基本的一个流程,他解决的一个问题。我们回到这里,他解决的一个问题是什么呢?他解决这个问题就是你的大…...
游戏代码混淆的作用与应用分析
1. 防止逆向工程 核心保护对象:游戏引擎、算法(如物理模拟、AI行为树)、加密逻辑等。实例:Unity游戏使用 ConfuserEx 混淆C#代码,使反编译工具(如dnSpy)只能显示杂乱命名,难以理解逻…...
信息系统运行管理员:临阵磨枪版
信息系统运行管理员考试 - 全覆盖详细背诵大纲 (根据考情分析和原始材料,力求完整覆盖考点细节) 第一部分:基础知识与运维概览 Chapter 1: 信息系统运维概述 (上午题 5分) 信息: 含义:香农 - 减少随机不确定性的东西;…...
PWM(脉宽调制)的配置参数[预分频器\自动重载值]的自动计算
文章目录 前言一、数据结构二、二分法搜索最佳预分频器和自动重载值三、示例 前言 pwm是嵌入式开发过程中很常见的一个模块,而配置pwm的过程中就少不了频率参数的计算,大多数32位机的pwm频率都由时钟、预分频器(prescaler)、自动…...
manuskript开源程序是面向作家的开源工具
一、软件介绍 文末提供程序和源码下载 manuskript开源程序是面向作家的开源工具,Manuskript 可在 GNU/Linux、Mac OS X 和 Windows 上运行。 二、Features 特征 Manuskript provides a rich environment to help writers create their first draft and then furt…...
antd 主题色定制
定制方案: 1. 全局定制 整个应用范围内的组件都生效 全局文件 theme.css :root:root {--adm-color-primary: #a062d4; } antd-mobile 中的主题变量也是在 :root 下声明的,所以在有些情况会由于优先级的问题无法覆盖。通过 :root:root 显式地让你所…...
召回11:地理位置召回、作者召回、缓存召回
GeoHash 召回 属于地理位置召回,用户可能对附近发生的事情感兴趣。GeoHash 是一种对经纬度的编码,地图上每个单位矩形的 GeoHash 的前几位是相同的,GeoHash 编码截取前几位后,将相同编码发布的内容按时间顺序(先是时间…...
leetcode0767. 重构字符串-medium
1 题目:重构字符串 官方标定难度:中 给定一个字符串 s ,检查是否能重新排布其中的字母,使得两相邻的字符不同。 返回 s 的任意可能的重新排列。若不可行,返回空字符串 “” 。 示例 1: 输入: s “aab” 输出: “…...
vue基本介绍
Vue是一款流行的JavaScript前端框架,以下是其基本介绍: 发展历程 - 2014年,尤雨溪发布了Vue的第一个版本。 - 此后,Vue不断发展和完善,陆续发布了多个版本,功能逐渐强大,社区也日益活跃。 …...
【vue】【环境配置】项目无法npm run serve,显示node版本过低
解决方案:安装高版本node,并且启用高版本node 步骤: 1、查看当前版本 node -v2、配置nvm下载镜像源 1)查看配置文件位置 npm root2)找到settings.txt文件 修改镜像源为: node_mirror: https://npmmirro…...
第35周Zookkeeper+Dubbo JDK不同版本介绍
一、JDK 新特性全解析 JDK9 - 模块化:化繁为简的魔法 模块化特性:JDK9 给 Java 程序带来模块化特性,就像把一个大公司划分成多个部门,每个部门(模块)各司其职。模块比包更大,一个模块包含多个…...
【ORB-SLAM3】CreateNewKeyFrame()函数阅读
void Tracking::CreateNewKeyFrame() void Tracking::CreateNewKeyFrame() {// 如果局部建图线程正在初始化且没做完或关闭了,就无法插入关键帧if(mpLocalMapper->IsInitializing() && !mpAtlas->isImuInitialized())return;if(!mpLocalMapper->SetNotStop(t…...
腾讯开源实时语音大模型VITA-audio,92mstoken极速响应,支持多语言~
简介 VITA-Audio 是一个由腾讯优图实验室(Tencent Youtu Lab)、南京大学和厦门大学的研究人员共同开发的项目,旨在解决现有语音模型在流式生成(streaming)场景下生成第一个音频令牌(token)时的高…...
使用 TypeScript + dhtmlx-gantt 在 Next.js 中实现
1. 安装依赖(确保已安装) 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…...