Redis的那些事:一文入門Redis的基礎操作

Redis是什么

Redis,全稱是Remote?Dictionary?Service,翻譯過來就是,遠程字典服務。

redis屬于nosql非關系型數據庫。Nosql常見的數據關系,基本上是以key-value鍵值對形式存在的。

Key-value:?就像翻閱中文字典或者單詞字典,通過指定的需要查詢的字或者單詞(key),可以查找到字典里面對應的詳細內容和介紹(value)

Redis的一些特點:支持數據持久化、支持多種數據結構、支持數據備份、原子性操作等。

原子性:操作不能被中途打斷。

Redis的由來

Redis的作者:意大利人?—— Salvatore Sanfilippo,現在至少四十幾歲了,還在寫代碼。

Redis靈感來源:Alessia Merz,意大利一個舞者女郎。Merz在意大利有愚蠢的含義(俚語)。于是,Redis的默認服務端口號6379的來源靈感,來自于Mers這個詞,詳情可看九宮格輸入法:

?1793e54dbfefd6cc9d60a3c10ef03126.jpeg

Redis的安裝

Mac系統:brew install redis

Linux系列系統:apt-get install redis ?或 yum install redis 或apt-get install redis-server 或 yum install redis-server

?9cda39102a3398a34a8cb4cbeebf7c75.png

Windows系統:下載地址:https://github.com/tporadowski/redis/releases

?5acdb23a32d2c4b84b198b688941aaf8.png

Redis啟動方式

Mac/Linux:?啟動服務端redis-server ?啟動客戶端:redis-cli ??

如果需要后臺啟動,需要修改?redis.conf??文件,設置daemonize?為?yes

然后使用 redis-server /xxx/redis.conf 指定配置文件進行啟動。xxx是指定的路徑。

以下下載的姿勢可能不對,版本有點低,所以后面暫且用windows環境下的進行測試。

?5961dce6172b4a919ff5ac3b5c8bffaa.png

Windows啟動方式:雙擊redis-server.exe文件即可運行

?1e04f953eeeba5cfefcda04cc99f09f7.png

可以點擊cli.exe文件,啟動客戶端。

輸入ping,返回pong,代表服務是通的。

通過使用:set key value

可以用來設置一個鍵值對。

通過:get key

可以獲取到key對應的value值。

?e70d5bcdb0191bb00e491d9d113d481f.png

通過命令創建redis密碼:config set requirepass 密碼

?97885f972c1408e831bdfde3ebeddd4b.png

通過使用?命令:auth 密碼

進行redis權限驗證。

使用:keys *?可以顯示所有當前存在的key

?017843dce22bc23a8665d129dc9ef78e.png

使用命令:select index

可以選擇指定的Redis的Index(數據庫)。Redis默認有最多16個數據庫(或者叫Index),默認從0開始。例如上面設置的默認是0庫,選擇1庫進行查詢,就會沒有東西。

?155e2de1bec638a3fef5c9cc92f35079.png

Redis的數據結構

Redis的數據結構,體現在key-value的value上。Key默認都是字符串,value的基本數據結構包括字符串(string)、列表(list)、哈希(hash)、集合(set)、有序集合(zset)

字符串數據結構

字符串在redis里面是可變的。用一個圖來簡單說明一下。

?a371ec28d0d87a9cc564cc28bf8d7638.png

字符串存儲規則:Redis存儲字符串期間,額外的空間分配規則是,當數據小于1MB的時候,每次擴容的空間是成倍增長的。大于1MB的時候,每次擴容的空間是1MB。

上面這段話如果不太理解,可以看Redis源碼,源碼內容如下。

?cdbacb237dd295a2a643d949724d268d.png

?并且String單個數據最大的長度為?2^32-1=512M

關于字符串的其他操作:

使用命令:exists key

可以查看是否存在該key;

使用命令:del key

可以直接刪除指定的key以及對應的value。

?c284aeba688ad4475f4f08ac5a8de0d4.png

如果已有key,使用:set key xxx

會直接把key原有的值設置為xxx

?77e9592a3aafb7bf1da3c34f92dd64cd.png

使用命令:?expire?key?second

可以給指定的key設置過期時間。例如我設置了10s過期,十秒以后,就會被自動銷毀了。

?8119ac45891724df8fd28df89b9acaf9.png

?使用命令:setex ?key ?second ?value

可以設置key-value鍵值對,并且可以同時設置過期時間的秒數。

?04c520969cda6cdd663599c53c9ef852.png

?使用命令:?ttl?key

可以查看指定的key的剩余的過期時間。

?5e18868f7cd8ced1a16e6043642fc33e.png

?對于數值型的字符串,可以使用命令:incr key 和 decr key 進行自增1和自減1

使用命令:incrby key number 和 decrby key number 進行自增或自減指定的數值。

?47637ee2cac19f2bdd5a3280a722b375.png

?可以通過批量設置命令:mset key value key value……?

進行批量設置。

通過:mget key key key……

進行批量讀取。不過mget批量讀取的結果集是個列表(因為帶有序號)

?8573c46e2ab275fe21d193a2fe34215c.png

?列表數據結構

Redis的列表,最大可以存儲40億+個元素(2^32-1)。

列表的插入速度很快,時間復雜度是O,但是當數據量特別龐大的時候,使用索引進行查詢操作會變得很慢,因為通過索引定位查詢的時間復雜度為O(n)。

設置列表的key和value命令:lpush key value value value ……

可以設置一個key,帶有多個元素的列表。l:left,代表的是左邊,相當于每個元素是從左邊被寫入的(倒序插入)。

使用命令:lpop ?key

可以取出最左邊的元素的值,同時會把該值舍棄掉。?

?dc1aa5f13e9fdcd7f445037f540cfcc6.png

?rpush是依次從右邊插入(正序插入),rpop是取出最右邊的元素的值,然后舍棄掉。r: right,代表右邊

?7175477226147444f0e943d02166f21a.png

?可以使用命令:linsert key before|after 指定的value 要插入的value

進行插入元素。before 會把要插入的元素插入到指定的value的前面;after會把要插入的元素插入到指定的value的后面。

?0f96c134bdfd899a11ed26f4cfa63093.png

?通過使用命令:lset key index 新的value

可以把列表指定的索引對應的值給替換掉。

?4874f279ff659b50dce9f6faef1a7e1b.png

?可以通過命令:lindex key index

獲取指定的索引的值,并且不會被舍棄。操作索引期間,需要注意時間復雜度,元素多的情況下慎用。

?4d785b8c1dfc35c51907748c2fc8261a.png

?可以使用命令:lrange key 起始索引?結束索引

獲取在索引區間的所有元素。元素包含起始索引和結束索引的值。

?f2a1c2da5f66188c314e2fad38784442.png

?列表還可以用來當作消息隊列使用,因為列表存取的一些方式,可以用來先進先出、先進后出等堆棧操作,先進先出與消息隊列機制雷同。

?哈希數據結構

哈希數據結構,可以當作是字典(key-value)里面嵌套了個字典(value數據類型又是一個 key-value的結構)。類似Json,或者類似俄羅斯套娃,例如:

person:{

?“Name”:”wesky”,

??“age”:18

}

使用命令:hset ?key field value

可以設置哈希數據結構的key,以及一個屬性和屬性對應的值。

使用命令:hget key field

可以獲取指定哈希數據的key對應的屬性的值。

使用命令:hmset key field value field value ……

可以批量設置哈希數據指定key的多個屬性和值。

使用命令:hmget key field1 field2 ……

可以批量獲取指定的key下指定的多個屬性的值。

使用命令:hgetall key

可以獲取指定的哈希數據的key下的所有屬性和值的列表。如下圖所示。

?fc504d228ce77f25ea67eb4fea15744b.png

使用命令:hkeys key

可以獲取哈希數據指定key的所有屬性名稱的列表;

使用命令:hvals key

可以獲取哈希數據指定key的所有屬性的值的列表;

使用命令:hlen key

可以獲取到哈希數據里面指定key的屬性個數。

?f6a5e9e820b8b645cefcff0fc8edb598.png

集合數據結構

集合結構也可以看成是一個沒有屬性值的哈希數據結構,并且屬性不能重復且無序的。

類似于:

Person{

?“name”,

?“age”

}

使用命令:sadd key field1 field2……

可以設置集合的key和元素集。由于集合是不可重復的,所以重復新增的元素會被自動剔除。

?c04b8d8c5b1199b55900ca830b657745.png

使用命令:smembers key

可以返回指定集合的所有元素;

使用命令:scard key

可以查詢集合元素的個數;

使用命令:srandmember key (number:可選)

可以隨機返回指定集合的一個或多個元素。不指定個數,即返回一個。

?1d6039e4791ec670f829757408bdec16.png

集合數據,可以進行一些集合運算操作。

命令:sdiff ?key1 ?key2

可以比較集合key1和集合key2的差集,差集結果為寫在前面的集合元素減去后面集合的元素;

命令:sinter key1 key2

可以獲取到集合key1和集合key2的交集。

?a0bd7147bf221dfdeb1fd58d6e7178e6.png

命令:sunion key1 key2

可以獲取集合key1和集合key2的并集。

?44d8beb4815279f69dec8a16a3316200.png

有序集合

有序集合比較常見的一個場景,是用來做排行榜。

命令:zadd ?key ?score1(分數,用于排行的值)? member1(集合的元素)? score2(分數,用于排行的值)? member2(集合的元素)?……

可以用來新增有序集合。其中,分數代表權重,值越低,排越前。

命令:zrange key 起始索引?結束索引

可以查詢指定集合索引區間的所有元素的屬性。

命令:zincrby key 增加權重值 menber

可以對有序集合指定的元素進行增加權重(對分數進行增加指定的值)

?0011222c7970287f2428415fdd8c78e4.png

?命令:zcard ?key

可以獲取有序集合的個數;

命令:zcount ?key ?最小分數??最大分數

可以獲取到有序集合在指定的分數區間的所有元素;

命令:zcount key member

可以獲取有序集合里面指定的元素當前的分數;

命令:zrange key ?起始索引?結束索引 withscores

可以獲取到有序索引里面指定的索引區間內所有的元素以及元素對應的分數。

?a3d3ec11afdc8a561deabf5595db2246.png

備注:以上五種數據結構,都屬于容器型,它們的特點是,當沒有元素的時候,會被自動釋放掉。

Redis分布式鎖

Redis的操作是原子性的,如果存在多客戶端同時操作的情況下,會發生一些干擾問題。原子性指的是,redis在進行讀寫期間是不會被打斷的,會一直進行到底。下面用一個圖片進行說明。

?475a5df6672854449fde2f0a63c55241.png

如上圖所示,A和B同時都要操作Redis數據庫里面的Key1。假設此刻Key1存儲的是銀行的存款,然后在A的地方消費掉了,此刻A觸發了扣減余額的操作。這個時候,修改redis的值是通過先讀取值出來到內存里面,然后進行扣減的;讀取出來的時候,還沒扣減完成,這個時候B(比如說是信用卡自動還款扣錢)也要扣減Key1的余額,也要進行先讀取出來,然后才進行扣減。由于Redis是原子性操作,所以A的步驟不會被打斷,B也不會被打斷。這個時候,A扣減完成了,例如原本余額是100元,扣減了10元,A更改完畢以后,值變成了90元。此刻,B也要扣減,例如扣減20元,但是讀取的是A改完之前的值,所以改完以后是80元。以上就產生了沖突,于是就有了Redis的分布式鎖用來避免這個問題。

?通過命令:set ?key ?value ?ex ?second ?nx

可以設置一個鎖,key代表鎖的名稱,value是值;second是鎖的超時時間。

如下圖所示,我開了兩個客戶端,并且標注了我的操作順序號。

076a62cc17c97667736ee4ccf5de25e5.png

鎖如果沒有過期或刪除,其他客戶端創建鎖會失敗;但是其他客戶端也可以刪除鎖,所以具有一定風險。建議可以對鎖設置不同客戶端所需要的不同的值用來區分。然后把需要操作的地方,放到鎖里面操作,來避免產生的同時操作產生的問題。

例如偽代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

If(exists(lock))

{

??return?false;?// 存在鎖,修改失敗

}

Else<br>{

??Set?lock?true?ex 5 nx;

??Set key1 100;

??del?lock;

??Return?true;?// 修改成功

}

Redis位圖

????位圖的最小單位是bit,每個bit的值只能是0和1,位圖的應用場景一般用于一些簽到記錄,例如打卡等。

場景舉例:?例如某APP要存儲用戶的打卡記錄,如果按照正常的思路來做,可能是用戶每天是否打卡的記錄都單獨設置一個key-value鍵值對來存儲,這樣的話,每個用戶每天都需要耗費一個鍵值對空間。而如果是位圖,就可以很方便地通過位圖來進行記錄,例如如下圖:

?359452f7ae4374b294a044a7782b39a3.png

位圖不算基礎數據結構或者特殊數據結構,其本質上還是字符串。由于每個bit代表一個數據,所以還可以當作是bit數組來看待。

可以通過命令:

setbit?key?偏移量(索引位)??value(0/1,默認是0)

進行設置對應位置的位圖數據。

通過命令:

?getbit?key?偏移量

可以獲取到對應的位圖索引數據。

也可以通過:?

get?key?

來獲取位圖對應的字符串信息。

?73777f7762b2031d80e634db6a97024f.png

例如hello字符串的ascii碼對應的二進制,分別是:

h:?01101000

e:?01100101

l:?01101100

l:?01101100

o:?01101111

以下設置字符串hello的位圖操作,如圖所示,字符串對應二進制數拼接起來的二進制,值為1所在的bit索引位(offset),使用:

setbit?key?offset?1?

進行設置1即可。

?46660bf20c443d713e3693f2d09bdfc7.png

setbit/gitbit 和 set/get 實際上是可以互相轉換的,只是一種是操作bit位,一種是操作直接的值。同時可以互相交叉操作使用,例如setbit存儲,get讀取;set 存儲,getbit讀取等等。

可以通過命令:?bitcount?key?起始字符索引?結束字符索引

對指定key里面的數據,指定的字符索引區間內,獲取到對應的位圖數據是1的個數。如果不指定,則會獲取到全部字符串對應位圖的1的個數。如下圖所示,結合以上二進制數據可知,h字符有3個1,o字符有6個1。

?29d15327c5480e451307a94e997bc819.png

以上指令操作可以適用于在類似打卡天數統計上使用,可以快速統計出區間內為1的數據個數。

通過命令:bitops ?key ?bit值(0/1)??起始字符索引?結束字符索引

可以獲取到指定的區間內,第一次出現指定的bit值(0或1)所在的位圖索引。如果不指定區間,默認代表字符串全部區間。如下圖所示,hello里面,第一次出現1是在位圖的第一個索引位置;第一次出現0是在第0個位圖索引位;字符索引位為1代表第二個字符,第一次出現的值為1的位圖索引位置為9。

注意:?字符串的索引,0到N,0代表第一個字符,例如’h’。位圖的索引,也是0到N,0代表位圖上面第一個bit位,值為0或者1,例如h的位圖索引位置是0的值是0??(01101000)

?2dc111a9fb99db298ecbf0fb4d1d53f2.png

可以通過命令:

bitfield??key?get?類型?位圖索引

來獲取指定類型數據的ascii碼。

例如,以下截圖中,命令:

bitfield?hello?get?u8?0?

其中,u8代表類型,u開頭代表無符號數據,8代表獲取8個bit位。如果是有符號的數據,是以i開頭的。最后面的0,代表要獲取的起始位圖下標索引,此處是第0個索引。

hello五個字符,對應的ascii碼分別為:104,101,108,108,111

如果以上命令的類型 u8 換成 u4 ,則獲取到的值是0110,對應的值是6;以此類推。

也可以并列get獲取,例如:

bitfield??key??get??type1?offset1??type2?offset2?……

其他玩法,大佬們可以自己嘗試。我這邊有關操作可以參考如下截圖所示內容。

?2174119391fbd5607600f129be96029b.png

通過命令:

bitfield?key?set?type?位圖索引?ascii碼

可以把對應的ascii碼根據類型寫入到指定的索引中,并且會返回原來索引被替換的ascii碼值。

例如下圖所示操作,位圖索引從0開始,代表第一個字符h所在位置。97代表a的ascii碼,執行以后,返回104(h的ascii碼),并且通過get命令可以查看到字符串已經被替換了。

?a2ed22c24990d88dba09cbf2a63ef3ef.png

可以使用命令:

bitfield??key??incrby??type??索引??自增值

對指定類型和索引區間的值進行累加?,如下圖所示。h通過 u8 類型自增1,即h+1=i

注意:對于累加的數據不能超出指定類型的最大值,例如 u4 最大值是15,累加到15以后會自動折返為0。

?f258049db1aaa30fd23fc1cd91954006.png

?針對以上會出現折返的情況,可以使用溢出報錯或者保持最大或最小值的方式來避免折返的情況。

使用命令:

Bitfield??key??overflow??fail??incrby??type??offset??value

可以實現溢出的時候,會返回nil;

使用命令:

Bitfield??key??overflow??sat??incrby??type??offset??value

可以實現當要溢出的時候,還是會返回當前的最大值或最小值。如下圖所示。

?40888cd1810b17db983f0b64f898d6cc.png

HyperLogLog

HyperLogLog是一種可以快速去重的數據結構。但是有一定的誤差率,大概在0.81%左右。應用場景一般是在需要針對一些大數據量的情況下進行去重計算大概的統計值使用,例如網站的PV量等等。

使用命令:

pfadd???key??value1??value2?……

可以添加對應的多個數據集到指定的key里面去。

如果添加已經存在的數據,會被自動去重。

使用命令:pfcount key

可以統計數據集的個數。

使用命令:pfmerge?目標key??源key1???源key2??……

可以對多個不同的key進行數據合并,并且數據集重復的會自動排重。

使用HyperLogLog的用途,是在針對大數據量的情況下,在允許一定的容錯率的情況下,用它可以節約資源并且快速地進行排重。例如使用set來設置數據,資源損耗肯定是巨大的;但是使用hyperloglog來處理,資源損耗是固定的12kb,可以處理的數據量大約是2^64個數據。

?9df6b514816d6c2bfec6e1271dec3cfc.png

冷門科普:命令是pf開頭,是為了紀念HyperLogLog的作者——Philippe Flajolet?

布隆過濾器

布隆過濾器,最常見的場景是商品推薦業務。例如購物時候瀏覽的信息被記錄以后,可以進行推薦其他同類型的其他商品。推薦的其他商品不會和瀏覽過的商品重復(去重),但是也存在一定的誤差。

布隆過濾器源碼地址鏈接:

https://github.com/RedisBloom/RedisBloom

先進行下載,下載方式可以按照自己喜歡的方式下載。例如此處我下載到d目錄下的wesky/bloom文件夾下。

?5c885dd2326480e05645f592a2b2dfa8.png

然后進入到文件夾內,使用make命令進行編譯。編譯成功的話,會產生一個 redisbloom.so的文件。如下,我也很尷尬,沒成功,就暫且到這里吧。

?060ebd65dd36cb032beb448f8325afce.png

假如上面配置成功的話,啟動redis服務的時候,可以把.so文件配置到redis.conf配置文件下,例如我上面所在的位置,新增的樣式如下:

loadmodule?D:/Wesky/Bloom/RedisBloom/redisbloom.so

或者使用命令啟動的時候,使用命令進行指定:

redis-server?--loadmodule?D:/Wesky/Bloom/RedisBloom/redisbloom.so

由于當前我本機無法編譯布隆過濾器源碼,所以就暫且到這吧,請見諒。

布隆過濾器下,會有一些命令,供參考,大家可以根據自己情況,進行自己嘗試,當作是留個懸念了。

命令:

bf.add??key??xxx

bf.madd??key??數據1???數據2?……

bf.exists?key?數據

bf.mexists?key?數據1?數據2?……

……

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

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

相關文章

10種提問型爆文標題句式 直接套用

如果你用1天的時間來寫篇好文章&#xff0c;那你花掉半天時間想一個好標題都不過分&#xff01; 你是不是覺得我有點言過其實了&#xff1f;沒關系&#xff0c;先來問你2個問題&#xff1a; 1、花了很長時間&#xff0c;寫了一篇很牛的賣貨推文&#xff0c;定稿后&#xff0c…

同域和不同域長啥樣

相同域http://www.jiangdou.com/http://www.jiangdou.com/maidou 不同域http://www.jiangdou.comhttp://bbs.jiangdou.comhttps://www.jiangdou.comhttp://www.jiangdou.com:8080轉載于:https://www.cnblogs.com/MaiJiangDou/p/6689133.html

2016 China Joy搶先看,文末有彩蛋!

這里只有你想不到的&#xff0c;沒有你看不到的。 2016 China Joy開幕在即&#xff0c;天氣成了最折磨各種媒體、展商和觀眾的小妖精&#xff0c;一會艷陽天&#xff0c;一會大暴雨&#xff0c;軒軒現在是這樣的&#xff01; 七月底的魔都&#xff0c;熱的那叫一個銷魂&#x…

JdbcTemplate+PageImpl實現多表分頁查詢

一、基礎實體  MappedSuperclass public abstract class AbsIdEntity implements Serializable {private static final long serialVersionUID 7988377299341530426L;public final static int IS_DELETE_YES 1;// 標記刪除public final static int IS_DELETE_NO 0;// 未刪除…

消息隊列選型手冊

前言 消息隊列中間件重要嗎&#xff1f;面試必問問題之一&#xff0c;你說重不重要。我有時會問同事&#xff0c;為啥你用 RabbitMQ&#xff0c;不用 Kafka&#xff0c;或者 RocketMQ 呢&#xff1f; 他給我的回答&#xff1a;“因為公司用的就是這個&#xff0c;大家都這么用…

Jenkins 持續集成國產嵌入式操作系統 RT-Thread 的CI

我們直接在Jenkins的鏡像基礎上進行集成RT-Thread 的編譯環境&#xff0c; 這樣直接使用Shell 命令 最直接了當&#xff0c; 通過 第三方docker等插件&#xff0c; 嘗試了計重方案&#xff0c; 沒有找到理想中的感覺&#xff0c; 如果其他人有想法可以告知一二。 我們有現成的鏡…

codevs原創抄襲題 5960 信使

題目描述 Description?戰爭時期&#xff0c;前線有n個哨所&#xff0c;每個哨所可能會與其他若干個哨所之間有通信聯系。信使負責在哨所之間傳遞信息&#xff0c;當然&#xff0c;這是要花費一定時間的&#xff08;以天為單位&#xff09;。指揮部設在第一個哨所。當指揮部下達…

VC解析XML--使用CMarkup類解析XML

經過今天嘗試MFC解析XML串&#xff0c;也算有了不少收獲&#xff0c;總結一下。 我是使用的CMarkup類對XML進行操作。 CMarkup好象都是先從一個xml文件里面把內容讀出來&#xff0c;再進行解析&#xff0c;搞得我恨不得要把我的CString寫到xml文件里面…

MongoDB精華總結

概述 MongoDB是屬于文檔型的NoSQL數據庫&#xff0c;也就是文檔數據庫。文檔數據庫區別于傳統的其它數據庫&#xff0c;它是用來管理文檔。在傳統的數據庫中&#xff0c;信息被分割成離散的數據段&#xff0c;而在文檔數據庫中&#xff0c;文檔是處理信息的基本單位&#xff0c…

認清性能問題

本文翻譯自 Thinking Clearly About Performance 這是我三年前讀到的一篇關于性能問題的好文&#xff0c;讀完后還覺不過癮&#xff0c;怕理解的不夠遂又翻譯了一遍&#xff0c;這也是當年我的第一次翻譯。 這幾年來每次碰到性能問題&#xff0c;我都會想起這篇文章&#xff0c…

字節也開始縮招了...

閱讀本文大概需要6分鐘。最近和一個字節技術總監聊天&#xff0c;得知他們公司居然也開始縮招了。這真讓人感到意外&#xff0c;畢竟頭條這些年是以極速擴張而聞名。搜了搜新聞還真是&#xff0c;這也意味著互聯網行業最后一個堅挺的大戶也在開源節流了。最近互聯網行業的情況真…

實現打字效果

摘自一個表白網站的效果。 方法&#xff1a; substr() 可在字符串中抽取從 第一個參數表示從指定的下標&#xff0c;第二個參數表示抽取指定數目的字符。 indexOf() 方法可返回某個指定的字符串值在字符串中首次出現的位置&#xff0c;兩個參數&#xff0c;第一位指定的字符串&…

php優化-》常用到的部分優化

1.循環內部盡可能不要聲明變量&#xff1b; 2.在可以用PHP內部字符串操作函數的情況下&#xff0c;盡量不要用正則表達式&#xff1b; 3.foreach效率更高&#xff0c;盡量用foreach代替while和for循環&#xff1b; 4.用單引號替代雙引號引用字符串&#xff1b; 5.盡量的少進行文…

簡述:分布式CAP理論和BASE理論

目錄 一、什么是CAP&#xff1f; Consistency (一致性)&#xff1a; Availability (可用性): Partition Tolerance (分區容錯性): 二、取舍策略 三、Base理論 1、基本可用 2、軟狀態 3、最終一致性 四、常見產品 Ereka Zookeeper 五、總結 一、什么是CAP&#xf…

WinForm(四)一種實現登錄的方式

首先聲明&#xff0c;這只是一種登錄方式&#xff0c;并不是最好的方式&#xff0c;用這個例子為了說明登錄窗體和Application的關系。在登錄前&#xff0c;定義了用戶實體&#xff0c;然后是一個通用的類&#xff0c;存放進程中當前登錄的用戶&#xff0c;所以CurrentUser是靜…

Java多線程4:synchronized鎖機制

臟讀 一個常見的概念。在多線程中&#xff0c;難免會出現在多個線程中對同一個對象的實例變量進行并發訪問的情況&#xff0c;如果不做正確的同步處理&#xff0c;那么產生的后果就是"臟讀"&#xff0c;也就是取到的數據其實是被更改過的。 按照正常來看應該打印&quo…

mysql 日期時間類型 自動轉型 及 運算

日期時間類型自動轉型 -- now()、字符串、數字轉datetime類型 create table t(dt datetime);insert into t values(now());insert into t values(2007-9-3 12:10:10);insert into t values(2007/9/3 121010);insert into t values(2007#9#3 121010);insert into t values(20079…

.NET Community Toolkit 8.0.0 版本發布

.NET 社區工具包&#xff08;.NET Community Toolkit &#xff09;現已發布 8.0.0 版&#xff01;.NET 社區工具包是一組適用于所有 .NET 開發人員&#xff0c;且與任何特定 UI 平臺無關的幫助程序和 API。該工具包由 Microsoft 維護和發布&#xff0c;是 .NET 基金會的一部分&…

SpringData JPA、Hibernate、Mybatis三者的區別

目錄 1.ORM 考慮 SpringData JPA Hibernate MyBatis 2.業務查詢的區別 Spring Data JPA Hibernate Mybatis 3.可拓展性 Spring Data JPA Hibernate Mybatis 4.對緩存 Spring Data JPA Hibernate Mybatis 5.難度性 Spring Data JPA Hibernate Mybatis 總述…

1、內存

程序為什么需要內存 程序運行的目的&#xff1a;程序運行是為了得到一定的結果&#xff0c;程序運行其實是在做一系列的數據計算&#xff0c;所以&#xff1a;程序代碼數據&#xff1b;程序運行的目的不外乎2個&#xff1a;過程、結果&#xff1b; 用函數來類比&#xff1a;…