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.pswp.cn/news/905643.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905643.shtml
英文地址,請注明出處:http://en.pswp.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&…