Redis-基礎篇

Redis是一個開源、高性能、內存鍵值存儲數據庫,由 Salvatore Sanfilippo(網名antirez)創建,并在BSD許可下發布。它不僅可以用作緩存系統來加速數據訪問,還可以作為持久化的主數據存儲系統或消息中間件使用。Redis因其數據結構豐富、性能優異和高可用性而被廣泛應用在現代分布式架構中。

目錄

一、認識Redis

1.1、認識NoSQL

1.2、認識Redis

1.3、安裝Redis

二、Redis的常見命令

2.1、5種常見的數據結構

2.2、通用命令

2.3、不同數據結構的操作命令

三、Redis的Java客戶端

3.1、Jedis客戶端

3.2、SpringDataRedis客戶端


一、認識Redis

1.1、認識NoSQL

SQL:結構化、表有關聯、支持SQL查詢、滿足事務的ACID、存儲在磁盤、垂直擴展、適用于數據結構固定,相關業務的數據安全性與一致性要求高的場合

NoSQL:非結構、無關聯的、非SQL、滿足基本一致性、存儲在內存、水平擴展、適用于數據結構不固定,對一致性與安全性要求不高,但是對性能要求較高的場合

常見的NoSQL有:鍵值對類型的Redis、文檔類型的MongoDB

1.2、認識Redis

Redis(?Remote Dictionary Server)的全程是遠程字典服務器,是一個基于內存的非關系型數據庫。

redis的特征:
1.鍵值對類型的數據庫,支持豐富的數據類型

2.單線程,每個命令具備原子性

3.低延遲,速度快(基于內存、IO多路復用、良好的編碼)

4.支持數據的持久化

5.支持主從集群與分片集群

6.支持多語言客戶端

1.3、安裝Redis

這個不過多介紹,直接下載安裝即可。

安裝redis服務器和客戶端,并安裝redis可視化管理工具Another Redis Desktop Manager。

二、Redis的常見命令

2.1、5種常見的數據結構

redis是一個鍵值對類型的數據庫,key的類型一般是String,value的類型就多種多樣:

基本數據類型:

String類型:緩存用戶信息、計數器(例如點贊數、瀏覽量)、簡單的鍵值對存儲等。

Hash類型:存儲用戶屬性集合(如用戶的姓名、年齡、地址等)、產品詳情等多字段數據結構。

List類型:存儲用戶屬性集合(如用戶的姓名、年齡、地址等)、產品詳情等多字段數據結構。

Set類型:適用于標簽系統(給一篇文章打上多個標簽)、唯一事件記錄等。

SortedSet類型:跳躍表提供O(log N)級別的插入、刪除和查找操作,并按分數排序。

特殊數據類型:

GEO類型:Geo數據類型允許用戶存儲地理位置信息,并執行地理半徑查詢、鄰近點搜索等操作。

BitMap類型:用于用戶在線狀態跟蹤、訪問統計(例如用戶是否讀過某篇文章)。

HyperLog類型:日活用戶統計、網站獨立訪客統計、廣告點擊去重等需要估算大量唯一元素數量而不需精確存儲所有元素的場景。

2.2、通用命令

通用命令常見的有:

KEYS:查看符合模板的所有key,不建議在生產環境上使用

DEL:刪除一個指定的key

EXISTS:判斷一個key是否存在

EXPIRE:為一個key設置有效期,有效期到了key會自動刪除

TTL:查看key的剩余有效期

2.3、不同數據結構的操作命令

String類型:字符串類型,包括普通字符串,整數,浮點數

API如下:

SET:添加或者修改string類型的鍵值對

GET:根據key獲取string類型的value

MSET:批量添加多個string類型的鍵值對

MGET:根據string類型的key獲取多個string類型的值

INCR:讓整型的key自增1

INCREBY:整數設置步長的自增

INCREBYFLOAT:按照指定步長的浮點型自增

SETNX:添加一個string類型的鍵值對,前提是key不存在,否則不執行

SETEX:添加一個string類型的鍵值對,并指定有效期

redis的key允許有多個單詞形成層級結構,多個單詞用“:”隔開,如果value是一個Java對象,則可以將對象序列化成JSON字符串后存儲:
例如key可以為? 項目名:業務名:類型:id? ? ? value為{“id”:1,"product":"小米手機","price":"2999"}

這樣redis會根據冒號:進行層級劃分。

Hash類型:也稱為散列,value是一個無序字典,類似于Java中的HashMap結構。之前的string類型的value是將對象序列化成JSON字符串后存儲,當需要修改某個字段時很不方便。

Hash結構可以將每個字段獨立存儲,可以針對每個字段進行操作。

相關的API:

HSET key field value:添加或者修改hash類型的key的field值

HGET key field:獲取一個hash類型的key的field值

HMSET:批量添加多個hash類型key的field值

HMGET:批量查詢多個hash類型key的field值

HGETALL:獲取一個hash類型key的所有feild的值

HKEYS:獲取一個hash類型的key中的所有feild

HVALS:獲取一個hash類型的key中的所有value

HINCREBY:讓hash類型的key自增并指定步長

HSETNX:添加一個hash類型的field,前提是field不存在,否則不執行

List類型:List類型與Java中的LinkedList類似,可以看作是一個雙向鏈表,支持正向與反向檢索。

特征:有序、允許元素重復、插入刪除快、查詢速度一般

List的常見命令如下:

LPUSH key element...:向列表左側插入一個或者多個元素

LPOP key :移除并返回列表左側額第一個元素,沒有則返回nil

RPUSH key element...:向列表右側插入一個或者多個元素

RPOP key:移除并返回列表右側的第一個元素

LRANGE key? start end:返回一段角標范圍內的所有元素

BLPOP與BRPOP:移除指定的元素,沒有元素時并設置等待時間,而不是直接返回nil

List模擬棧:lpush與lpop? rpush與rpop

List模擬隊列:lpush與rpop

List模擬阻塞隊列:blpop與brpop

Set類型:Redis中的set與Java中的HashSet類似,具有如下特征:無序、元素不可重復、查找快

、支持交集、并集差集等操作。

SET類型的常見命令:

SADD key member...:向set中添加一個或者多個元素

SREM key member...:向set中移除指定元素

SCARD key:返回set中的元素個數

SISMEMBER key member:判斷一個元素是否在set中

SMEMBERS:獲取set中的所有元素

SINTER key1 key2:求兩個key的交集

SDIFF:求兩個集合的差集

SUNION:求兩個集合的并集

SortedSet類型:有序的集合,每個元素都帶有一個score屬性,可以根據score屬性進行排序,底層是一個跳表+hash表的實現。跳躍表提供O(log N)級別的插入、刪除和查找操作,并按分數排序;hash表用于快速查找成員的存在性。

跳表是通過隨機函數維護平衡性的,當我們在跳表中插入數據的時候,我們通過選擇同時將這個數據插入到部分索引層中,如何選擇索引層,可以通過一個隨機函數來決定這個節點插入到哪幾級索引中,比如隨機生成了k,那么就將這個索引加入到,第一級到第k級索引中。

SortedSet具有以下特點:

1、可排序 2、元素不重復 3、查詢速度快

常見的SortedSort的api如下:默認是升序,如果向降序前綴由Z改成ZREV

三、Redis的Java客戶端

3.1、Jedis客戶端

常見的Redis的Java客戶端有Jedis、Lettuce、Redisson三種,具體如下。

下面我們通過jedis客戶端連接redis服務器,并進行單元測試,具體如下:

1.首先添加三方依賴。

    <!--jedis客戶端依賴--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency><!-- junit測試依賴 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.7.0</version><scope>test</scope></dependency>

2.編寫單元測試模塊,jedis客戶端連接redis服務器,并進行crud基本操作,最后釋放連接。

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;import java.util.Map;/*** @author nuist__NJUPT* @ClassName JedisTest* @description: jedis測試類* @date 2024/03/02*/
public class JedisTest {private Jedis jedis ;@BeforeEachvoid setUp(){// 1.建立連接jedis = new Jedis("localhost", 6379) ;// 2.設置密碼jedis.auth("123456") ;// 3.選擇庫jedis.select(0) ;}@Testvoid testString(){// 存入數據String result = jedis.set("name", "mandy");System.out.println(result);// 獲取數據String name = jedis.get("name");System.out.println("name : " + name );}@Testvoid testHash(){// 存值jedis.hset("user:1", "name", "jack") ;jedis.hset("user:1", "age", "21") ;// 取值Map<String, String> stringStringMap = jedis.hgetAll("user:1");System.out.println(stringStringMap);}@AfterEachvoid tearDown(){if(jedis != null){jedis.close();}}}

jedis本身是線程不安全的,而且頻繁的創建與銷毀jedis連接會有性能損耗,因此推薦使用jedis連接池的方式代替直連的方式。

1.定義一個連接池工具類,用于建立jedis連接,并返回jedis對象,jedis使用完放回連接池而不是直接銷毀。

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;/*** @author nuist__NJUPT* @ClassName JedisConnectionFactory* @description: Jedis連接池* @date 2024/03/02*/
public class JedisConnectionFactory {private static final JedisPool jedisPool ;static {// 配置連接池JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(8);jedisPoolConfig.setMaxIdle(8);jedisPoolConfig.setMinIdle(0);jedisPoolConfig.setMaxWaitMillis(1000);// 創建連接池對象jedisPool= new JedisPool(jedisPoolConfig, "localhost", 6379, 1000, "123456");}public static Jedis getJedis(){return jedisPool.getResource() ;}}

2.客戶端直接通過連接池獲取jedis對象就可以,不用直接newjedis對象進行直連了。

import com.alibaba.jedis.util.JedisConnectionFactory;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;import java.util.Map;/*** @author nuist__NJUPT* @ClassName JedisTest* @description: jedis測試類* @date 2024/03/02*/
public class JedisTest {private Jedis jedis ;@BeforeEachvoid setUp(){// 1.建立連接// jedis = new Jedis("localhost", 6379) ;jedis = JedisConnectionFactory.getJedis() ;// 2.設置密碼jedis.auth("123456") ;// 3.選擇庫jedis.select(0) ;}@Testvoid testString(){// 存入數據String result = jedis.set("name", "mandy");System.out.println(result);// 獲取數據String name = jedis.get("name");System.out.println("name : " + name );}@Testvoid testHash(){// 存值jedis.hset("user:1", "name", "jack") ;jedis.hset("user:1", "age", "21") ;// 取值Map<String, String> stringStringMap = jedis.hgetAll("user:1");System.out.println(stringStringMap);}@AfterEachvoid tearDown(){if(jedis != null){jedis.close();}}}

3.2、SpringDataRedis客戶端

SpringData是Spring中數據操作的模塊,包含了對多種數據庫的集成,其中對redis的集成就是SpringDataRedis。它提供了對不同redis客戶端的整合(jedis、Lettuce),提供了RedisTemplate統一API來操作Redis,支持redis的發布訂閱模型,支持redis哨兵和redis集群,支持基于Lettuce的響應式編程,支持序列化與反序列化。

下面看一下SpringDataRedis提供的工具類RedisTemplate的應用,首先創建springboot項目并導入redis依賴。

  <!--	jackson依賴	--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.5</version></dependency><!--redis依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 連接池依賴 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>

然后在yml文件中進行配值,配值redis的數據源信息。

spring:redis:host: 127.0.0.1port: 6379password: 123456lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: 100

編寫redisTemplate的配值類,防止在redis在接收Object類型時,把Object對象序列化成字節形式,變成一串亂碼,可讀性差,占用內存。


/*** @author nuist__NJUPT* @ClassName RedisConfig* @description: redis配置類* @date 2024/03/02*/import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;@Configuration
public class RedisConfig {/*** RedisTemplate可以接收任意Object作為值寫入Redis,* 只不過寫入前會把Object序列化為字節形式,默認是采用JDK序列化,得到的一串很長的值* 缺點:可讀性查、浪費存儲空間*/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){// 1.創建 redisTemplateRedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 2.設置連接工廠redisTemplate.setConnectionFactory(redisConnectionFactory);// 3.設置序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// key 采用 String 序列化redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// value 采用 json 序列化redisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);return  redisTemplate;}
}

定義一個實體類。

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author nuist__NJUPT* @ClassName User* @description: 實體類* @date 2024/03/02*/@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private String name ;private Integer age ;}

最后編寫單元測試模塊,利用redisTemplate進行測試。

import com.alibaba.redisdemo.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest
class RedisDemoApplicationTests {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Testvoid testString(){// 添加一個元素redisTemplate.opsForValue().set("name", "Jack");// 獲取元素Object object = redisTemplate.opsForValue().get("name");System.out.println(object);}@Testvoid testSaveUser(){//寫入數據redisTemplate.opsForValue().set("user:2", new User("wang", 18));// 讀取數據User user = (User) redisTemplate.opsForValue().get("user:2");System.out.println(user);}@Testvoid testHash(){stringRedisTemplate.opsForHash().put("user:3","name", "liu");stringRedisTemplate.opsForHash().put("user:3","age","18") ;Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:3");System.out.println("entries = " + entries);}}

上述盡管Json序列化的方式滿足要求,但是會發現仍然存在一些問題,比如JSON序列化器將類型class寫入了json中,存入redis會導致額外的內存開銷。

為了節省內存空間,不使用JSON序列化來處理value,而是處理String序列化器,要求只能存儲String類型的key與value,當存儲Java對象的時候需要手動的序列化與反序列化。

可以采用如下寫法:
?

 @Autowiredprivate StringRedisTemplate stringRedisTemplate ;private static final ObjectMapper mapper = new ObjectMapper() ;@Testvoid testSave() throws JsonProcessingException {// 創建對象User user = new User("wang", 18);// 手動序列化String s = mapper.writeValueAsString(user);//寫入數據stringRedisTemplate.opsForValue().set("user:2",s);// 讀取數據String user1 = stringRedisTemplate.opsForValue().get("user:2");// s手動反序列化User user2 = mapper.readValue(user1, User.class);System.out.println(user2);}

使用fastJson進行序列化與反序列化也可以,需要添加依賴。

    @Autowiredprivate StringRedisTemplate stringRedisTemplate ;@Testvoid testSave() throws JsonProcessingException {// 創建對象User user = new User("wang", 19);// 手動序列化String s = JSON.toJSONString(user) ;//寫入數據stringRedisTemplate.opsForValue().set("user:2",s);// 讀取數據String user1 = stringRedisTemplate.opsForValue().get("user:2");// s手動反序列化User user2 = JSON.parseObject(user1, User.class) ;System.out.println(user2);}

添加fastJson依賴。

<!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.32</version>
</dependency>

總結:redis中有兩種序列化方式,推薦使用第二種。

1.第一種是自定義RedisTemplate,修改其序列化器,相對方便,但是寫入redis會存class對象,占用額外的內存空間。

2.使用StringRedisTemplate,默認使用String序列化器,寫入redis需要將Java對象手動序列化為json,讀取redis需要將讀取到的json反序列化為Java對象。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716121.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716121.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode:37.解數獨

題目理解&#xff1a;本題中棋盤的每一個位置都要放一個數字&#xff08;而N皇后是一行只放一個皇后&#xff09;&#xff0c;并檢查數字是否合法&#xff0c;解數獨的樹形結構要比N皇后更寬更深。 代碼實現&#xff1a;

SpringBoot+Redis 解決海量重復提交問題,yyds!

在實際的開發項目中,一個對外暴露的接口往往會面臨很多次請求&#xff0c;我們來解釋一下冪等的概念&#xff1a;任意多次執行所產生的影響均與一次執行的影響相同。按照這個含義&#xff0c;最終的含義就是 對數據庫的影響只能是一次性的&#xff0c;不能重復處理。如何保證其…

?動類型轉換、強制類型轉換

為何short s1 1;是對的&#xff0c;而float f3.4;是錯的&#xff1f; 整數直接量&#xff0c;默認是int型。所以int a 4L; 會報錯&#xff0c;但是long l 4; 這樣不會&#xff0c;因為這樣會形成一個自動類型的轉換&#xff0c;int類型自動轉換為long類型 小數直接量&#…

JetBrains Gateway Github Copilot 客戶端插件和主機插件

JetBrains Gateway可以通過插件支持Github Copilot&#xff08;需另行注冊&#xff09;。 需要安裝插件 客戶端&#xff0c;而非插件 主機&#xff0c;如圖所示&#xff1a; 大概是因為代碼顯示在客戶端&#xff08;運行在本地的IDE&#xff09;&#xff1f;

NOC2023軟件創意編程(學而思賽道)python初中組復賽真題

目錄 下載打印原文檔做題: 軟件創意編程 一、參賽范圍 1.參賽組別:小學低年級組(1-3 年級)、小學高年級組(4-6 年級)、初中組。 2.參賽人數:1 人。 3.指導教師:1 人(可空缺)。 4.每人限參加 1 個賽項。 組別確定:以地方教育行政主管部門(教委、教育廳、教育局) 認…

Python 潮流周刊#40:白宮建議使用 Python 等內存安全的語言

△△請給“Python貓”加星標 &#xff0c;以免錯過文章推送 你好&#xff0c;我是貓哥。這里每周分享優質的 Python、AI 及通用技術內容&#xff0c;大部分為英文。本周刊開源&#xff0c;歡迎投稿[1]。另有電報頻道[2]作為副刊&#xff0c;補充發布更加豐富的資訊&#xff0c;…

三層靶機靶場之環境搭建

下載&#xff1a; 鏈接&#xff1a;百度網盤 請輸入提取碼 提取碼&#xff1a;f4as 簡介 2019某CTF線下賽真題內網結合WEB攻防題庫&#xff0c;涉 及WEB攻擊&#xff0c;內網代理路由等技術&#xff0c;每臺服務器存在一個 Flag&#xff0c;獲取每一 個Flag對應一個積分&…

在docker中搭建selenium 爬蟲環境(3分鐘快速搭建)

1、安裝docker 省略 2、拉取鏡像 docker pull selenium/standalone-chrome-debug 3、運行容器 docker run -d -p 4444:4444 -p 5900:5900 -v C:\Users\Public\VNC_Donwnloads:/home/seluser/Downloads --memory6g --name selenium_chrome selenium/standalone-chrome-debu…

Vue中commit和dispatch區別及其用法辨析

在Vue中&#xff0c;commit和dispatch是兩個用于觸發 Vuex store 中的 mutations 和 actions 的方法。 區別 commit: 用于觸發 mutations&#xff0c;即直接修改 state 的同步操作。通過commit方法可以調用 store 中的 mutations&#xff0c;并且只能同步地執行。使用方式如下…

大數據核心技術概論

大數據核心技術概述 大數據基石三大論文&#xff1a;GFS&#xff08;Hadoop HDFS&#xff09;、BigTable&#xff08;Apache HBase&#xff09;、MapReduce&#xff08;Hadoop MapReduce&#xff09;。 搜索引擎的核心任務&#xff1a;一是數據采集&#xff0c;也就是網頁的爬…

matlab 感知器算法

1. 原理 兩類線性可分的模式類&#xff1a;&#xff0c;設判別函數為&#xff1a;。 對樣本進行規范化處理&#xff0c;即類樣本全部乘以(-1)&#xff0c;則有&#xff1a; 感知器算法通過對已知類別的訓練樣本集的學習&#xff0c;尋找一個滿足上式的權向量。 2. 過程 2.1 …

力扣 分割回文串

輸出的是不同的分割方案 class Solution { public:vector<vector<bool>>flag;vector<string>ans;vector<vector<string>>nums;void dfs(string &s,int i){int ns.size();if(in){i表示s長度&#xff0c;等于即全部分割完畢nums.push_back(ans…

第十三篇【傳奇開心果系列】Python的文本和語音相互轉換庫技術點案例示例:Microsoft Azure的Face API開發人臉識別門禁系統經典案例

傳奇開心果博文系列 系列博文目錄Python的文本和語音相互轉換庫技術點案例示例系列 博文目錄前言一、實現步驟和雛形示例代碼二、擴展思路介紹三、活體檢測深度解讀和示例代碼四、人臉注冊和管理示例代碼五、實時監控和報警示例代碼六、多因素認證示例代碼七、訪客管理示例代碼…

mac m3安裝nvm安裝說明;mac安裝xbrew

安裝說明說明&#xff1a; 1.安裝brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"2.安裝nvm brew install nvm3.創建.nvm目錄 mkdir ~/.nvm4.編輯 ~/.zshrc 配置文件 vi ~/.zshrc5.在 ~/.zshrc 配置文件內添加內…

03-JNI 類型和數據結構

上一篇&#xff1a; 02-設計概述 本章討論 JNI 如何將 Java 類型映射為本地 C 類型。 3.1 原始類型 下表描述了 Java 原始類型及其與機器相關的本地等價類型。 為方便起見&#xff0c;定義如下&#xff1a; #define JNI_FALSE 0 #define JNI_TRUE 1 jsize 整數類型用于描述…

邏輯回歸與決策邊界解析

目錄 前言1 邏輯回歸基礎1.1 Sigmoid函數&#xff1a;打開分類之門1.2 決策函數&#xff1a;劃定分類界限1.3 邏輯回歸詳解 2 決策邊界2.1 線性決策邊界2.2 非線性決策邊界2.3 決策邊界的優化 3 應用與實例3.1 垃圾郵件分類&#xff1a;精準過濾3.2 金融欺詐檢測&#xff1a;保…

.idea文件詳解

.idea文件的作用&#xff1a; .idea文件夾是存儲IntelliJ IDEA項目的配置信息&#xff0c;主要內容有IntelliJ IDEA項目本身的一些編譯配置、文件編碼信息、jar包的數據源和相關的插件配置信息。一般用git做版本控制的時候會把.idea文件夾排除&#xff0c;因為這個文件下保存的…

Java實戰:Spring Boot中實現熱搜與不雅文字過濾功能

引言 在當今互聯網產品中&#xff0c;搜索引擎的熱搜功能和內容過濾機制是提升用戶體驗、維護社區秩序的關鍵要素。本文將探討如何在Spring Boot項目中實現熱搜詞追蹤與不雅文字過濾&#xff0c;并通過具體的代碼示例&#xff0c;帶領我們深入了解其實現原理與步驟。 一、實現…

續Java的執行語句--學習JavaEE的day06

day06 一、for循環嵌套 需求1&#xff1a;打印以下圖形************for(int i 0;i<3;i){//控制行數for(int j 0;j<4;j){//控制列數System.out.print("*");}System.out.println();//換行}需求2&#xff1a;打印以下圖形* i0** i1*** i2**** i3***** i4for…

ISO_IEC_18598-2016自動化基礎設施管理(AIM)系統國際標準解讀(一)

██ ISO_IEC_18598-2016是什么標準&#xff1f; ISO/IEC 18598國際標準是由ISO&#xff08;國際標準化組織&#xff09;/IEC&#xff08;國際電工委員會&#xff09;聯合技術委員會1-信息技術的第25分委員會-信息技術設備互連小組制定的關于信息基礎設施自動化管理的國際標準&…