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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】压缩列表

目录 1、背景2、压缩列表【1】底层结构【2】特性【3】优缺点 1、背景 ziplist&#xff08;压缩列表&#xff09;是redis中一种特殊编码的双向链表数据结构&#xff0c;主要用于存储小型列表和哈希表。它通过紧凑的内存布局和特殊的编码方式来节省内存空间。 2、压缩列表 【1…

LocalDateTime类型的时间在前端页面不显示或者修改数据时因为LocalDateTime导致无法修改,解决方案

1.数据库中的时间数据&#xff0c;在控制台可以正常返回&#xff0c;在前端无法返回&#xff0c;即显示空白&#xff0c;如下图所示: 2.这种问题一般时由于数据库和我们实体类的名称不一致引起的&#xff0c;我们数据库一般采用_的方式命名&#xff0c;但是在Java中我们一般采用…

Spring框架核心技术深度解析:JDBC模板、模拟转账与事务管理

一、JDBC模板技术&#xff1a;简化数据库操作 在传统JDBC开发中&#xff0c;繁琐的资源管理和重复代码一直是开发者的痛点。Spring框架提供的 JDBC模板&#xff08;JdbcTemplate) 彻底改变了这一现状&#xff0c;它通过封装底层JDBC操作&#xff0c;让开发者仅需关注SQL逻辑&a…

Modern C++(一)基本概念

1、基本概念 1.1、注释 注释在翻译阶段3会被替换为单个空白字符从程序中移除 1.2、名字与标识符 标识符是一个由数字、下划线、大小写字符组成的任意长度序列。有效的标识符首个字符必须是以A-Z、a-z、下划线开头&#xff0c;。有效的标识符其他字符可以是0-9、A-Z、a-z、下…

STM32的TIMx中Prescaler和ClockDivision的区别

Prescaler预分频&#xff0c;以笔者目前的学习程度来说&#xff0c;这个参数&#xff0c;一般来说是对主时钟进行分频后的计数器时钟。这个预分频后的时钟主要是用于的计数的。 这个主时钟&#xff0c;对于时基单元来说可以是内部时钟&#xff0c;也可以是外部时钟。一般来说我…

前端性能指标及优化策略——从加载、渲染和交互阶段分别解读详解并以Webpack+Vue项目为例进行解读

按照加载阶段、渲染阶段和交互阶段三个维度进行系统性阐述&#xff1a; 在现代 Web 开发中&#xff0c;性能不再是锦上添花&#xff0c;而是决定用户体验与业务成败的关键因素。为了全面监控与优化网页性能&#xff0c;我们可以将性能指标划分为加载阶段、渲染阶段、和交互阶段…

MySQL——1、数据库基础

数据库基础 1、安装MySQL2、什么是数据库3、数据库使用案例4、MySQL架构与SQL分类5、存储引擎 1、安装MySQL 1、更新软件包列表 sudo apt update2、查看MySQL安装包 apt list | grep mysql-server3、安装MySQL # 默认安装最新版 sudo apt install -y mysql-server4、启动My…

ET MailBoxComponent类(实体) 分析

MailBoxComponent 作用是&#xff0c;用来接收Actor消息&#xff0c;处理Actor消息。这个没有存储能&#xff0c;收到消息后立即就处理了。ParentInstanceId 是MailBox所在的实体InstanceIdMailBoxType MailBox类型MailBoxInvoker 分发消息的包装Add 方法&#xff0c;看名字是…

Weblogic SSRF漏洞复现(CVE-2014-4210)【vulhub靶场】

漏洞概述&#xff1a; Weblogic中存在一个SSRF漏洞&#xff0c;利用该漏洞可以发送任意HTTP请求&#xff0c;进而攻击内网中redis、fastcgi等脆弱组件。 漏洞形成原因&#xff1a; WebLogic Server 的 UDDI 组件&#xff08;uddiexplorer.war&#xff09;中的 SearchPublicR…

js应用opencv

思路&#xff1a; 第一步&#xff1a;直方图 第二步&#xff1a;获得直方图的波峰 第三步&#xff1a;波峰胜负10&#xff0c;高于或低于变红色 1.引用import cv from ‘techstark/opencv-js’; 2.vue代码 <div class"historyLeft2"><div style"relat…

用Python代码绘制动态3D爱心效果

引言 介绍Python在创意编程中的应用&#xff0c;特别是如何通过简单的代码实现视觉上的美感。引出本文将分享的爱心代码&#xff0c;并简要说明其实现原理。 爱心代码的基本实现 展示一个简单的Python代码示例&#xff0c;使用字符画的方式在控制台中绘制一个爱心图案。 pr…

使用Python开发经典俄罗斯方块游戏

使用Python开发经典俄罗斯方块游戏 在这篇教程中&#xff0c;我们将学习如何使用Python和Pygame库开发一个经典的俄罗斯方块游戏。这个项目将帮助你理解游戏开发的基本概念&#xff0c;包括图形界面、用户输入处理、碰撞检测等重要内容。 项目概述 我们将实现以下功能&…

兼顾长、短视频任务的无人机具身理解!AirVista-II:面向动态场景语义理解的无人机具身智能体系统

作者&#xff1a;Fei Lin 1 ^{1} 1, Yonglin Tian 2 ^{2} 2, Tengchao Zhang 1 ^{1} 1, Jun Huang 1 ^{1} 1, Sangtian Guan 1 ^{1} 1, and Fei-Yue Wang 2 , 1 ^{2,1} 2,1单位&#xff1a; 1 ^{1} 1澳门科技大学创新工程学院工程科学系&#xff0c; 2 ^{2} 2中科院自动化研究所…

【蓝桥杯省赛真题49】python偶数 第十五届蓝桥杯青少组Python编程省赛真题解析

python偶数 第十五届蓝桥杯青少组python比赛省赛真题详细解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解

鸿蒙(HarmonyOS)应用开发入门教程

目录 第一章:鸿蒙系统简介 1.1 什么是鸿蒙系统? 1.2 鸿蒙系统架构 第二章:开发环境搭建 2.1 安装DevEco Studio 步骤1:下载与安装 步骤2:首次配置 步骤3:设备准备 2.2 创建第一个项目 第三章:鸿蒙应用开发基础 3.1 核心概念:Ability与AbilitySlice 示例代码…

VM中 ubuntu 网卡不显示

1.添加网卡配置 #sudo nano /etc/netplan/01-netcfg.yaml network:version: 2renderer: networkdethernets:ens33:dhcp4: trueens37:dhcp4: trueens38:dhcp4: true#保存后 sudo netplan apply2.查看网络状态 sudo systemctl start systemd-networkd sudo systemctl status sy…

阿克曼-幻宇机器人系列教程3- 机器人交互实践(Message)

上一篇文章介绍了如何通过topic操作命令实现与机器人的交互&#xff0c;本篇我们介绍如何通过Message&#xff08;即topic的下一级&#xff09;实现与机器人的交互。 和topic一样&#xff0c;首先在一个终端通过ssh命令登录机器人、启动机器人&#xff0c;然后打开另外一个终端…

Python 调试扩展版本兼容问题解决纪实

在 Python 开发中&#xff0c;调试工具的正常使用对效率至关重要。近期在公司项目中&#xff0c;便遇到了 Python 调试扩展与版本不兼容的问题。公司 ERP 服务器采用 Ubuntu 18.04 系统&#xff0c;其标配 Python 版本为 3.6&#xff0c;而常用的 Python Debugger 扩展对版本有…

React 第四十二节 Router 中useLoaderData的用途详解

一、前言 useLoaderData&#xff0c;用于在组件中获取路由预加载的数据。它通常与路由配置中的 loader 函数配合使用&#xff0c;用于在页面渲染前异步获取数据&#xff08;如 API 请求&#xff09;&#xff0c;并将数据直接注入组件&#xff0c;从而简化数据流管理。 二、us…

Linux——mysql主从复制与读写分离

目录 一&#xff0c;理解什么是mysql主从复制 1&#xff0c;mysql支持的复制类型 2&#xff0c;mysql主从复制的工作流程 二&#xff0c;配置mysql主从复制 三&#xff0c;配置mysql主主复制 四&#xff0c;mysql读写分离 1&#xff0c;了解什么是mysql读写分离 2&…