欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 nosql Redis

柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 nosql Redis

http://yzkb.51969.com/

Redis

NoSql,非關(guān)系型數(shù)據(jù)庫

數(shù)據(jù)庫發(fā)展歷程

單機(jī)數(shù)據(jù)庫時代

一個應(yīng)用,一個數(shù)據(jù)庫實(shí)例

緩存,水平切分時代

增減讀寫數(shù)據(jù)庫緩存單表數(shù)據(jù)量過大,采用表水平切分,把一張表分成幾張表

讀寫分離時代

有不同的數(shù)據(jù)庫實(shí)例,分別負(fù)責(zé)讀寫當(dāng)寫數(shù)據(jù)庫完成寫數(shù)據(jù)時,讀數(shù)據(jù)庫要完成數(shù)據(jù)同步

分庫分表時代(集群)

如果一張表的數(shù)據(jù)量過大,把一張表的數(shù)據(jù)分開,用不同的數(shù)據(jù)庫存儲訪問該表,可能會使用多個數(shù)據(jù)庫,需要切換不同的數(shù)據(jù)源

非關(guān)系型數(shù)據(jù)庫時代(NoSql時代)

上面的都是基于關(guān)系型數(shù)據(jù)庫實(shí)現(xiàn)的:Mysql,Oracle,DB2,sqlserver…如今迎來了非關(guān)系型數(shù)據(jù)庫:Redis,Hbasc,MongoDB底層存儲機(jī)制被改變,不在采用僅以表為存儲機(jī)制的存儲方式,而是采用聚合數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù)。不僅支持key-value結(jié)構(gòu),還支持hash,set,list等數(shù)據(jù)結(jié)構(gòu)。Redis支持五種數(shù)據(jù)類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

Redis特點(diǎn)

Remote dictionary server,遠(yuǎn)程字典服務(wù)是C語言編寫的,開源的,基于內(nèi)存運(yùn)行的并支持持久化的,高性能的NoSql數(shù)據(jù)庫,是當(dāng)前熱門的NoSql數(shù)據(jù)庫之一。支持備份

安裝

Windows

**下載地址:**https://github.com/tporadowski/redis/releases 打開一個 cmd 窗口 使用 cd 命令切換目錄到 C:\redis 運(yùn)行: redis-server.exe redis.windows.conf

如果想方便的話,可以把 redis 的路徑加到系統(tǒng)的環(huán)境變量里,這樣就省得再輸路徑了,后面的那個 redis.windows.conf 可以省略,如果省略,會啟用默認(rèn)的. 這時候另啟一個 cmd 窗口,原來的不要關(guān)閉,不然就無法訪問服務(wù)端了。 切換到 redis 目錄下運(yùn)行: redis-cli.exe -h 127.0.0.1 -p 6379 //啟動服務(wù),指定IP和端口port

設(shè)置鍵值對: set myKey abc

取出鍵值對: get myKey

Linux

**下載地址:**http://redis.io/download,下載最新穩(wěn)定版本。 # wget http://download.redis.io/releases/redis-6.0.8.tar.gz

# tar xzf redis-6.0.8.tar.gz

# cd redis-6.0.8

# make //需要gcc編譯器

執(zhí)行完 make 命令后,redis-6.0.8 的 src 目錄下會出現(xiàn)編譯后的 redis 服務(wù)程序 redis-server,還有用于測試的客戶端程序 redis-cli:

make:

Linux 下 make 命令是系統(tǒng)管理員和程序員用的最頻繁的命令之一。管理員用它通過命令行來編譯和安裝很多開源的工具,程序員用它來管理他們大型復(fù)雜的項(xiàng)目編譯問題。

make 命令像命令行參數(shù)一樣接收目標(biāo)。這些目標(biāo)通常存放在以 “Makefile” 來命名的特殊文件中,同時文件也包含與目標(biāo)相對應(yīng)的操作。

當(dāng) make 命令第一次執(zhí)行時,它掃描 Makefile 找到目標(biāo)以及其依賴。如果這些依賴自身也是目標(biāo),繼續(xù)為這些依賴掃描 Makefile 建立其依賴關(guān)系,然后編譯它們。一旦主依賴編譯之后,然后就編譯主目標(biāo)(這是通過 make 命令傳入的)。

現(xiàn)在,假設(shè)你對某個源文件進(jìn)行了修改,你再次執(zhí)行 make 命令,它將只編譯與該源文件相關(guān)的目標(biāo)文件,因此,編譯完最終的可執(zhí)行文件節(jié)省了大量的時間。

下面啟動 redis 服務(wù): # cd src

# ./redis-server

注意這種方式啟動 redis 使用的是默認(rèn)配置。也可以通過啟動參數(shù)告訴 redis 使用指定配置文件使用下面命令啟動。 # cd src

# ./redis-server ../redis.conf

redis.conf 是一個默認(rèn)的配置文件。我們可以根據(jù)需要使用自己的配置文件。 啟動 redis 服務(wù)進(jìn)程后,就可以使用測試客戶端程序 redis-cli 和 redis 服務(wù)交互了。 比如: # cd src

# ./redis-cli

redis> set foo bar

OK

redis> get foo

"bar"

gcc編譯錯誤?

安裝好的虛擬機(jī)(用磁盤iso文件),其中自帶的gcc版本是4.8.5的,版本太低。安裝后redis后,執(zhí)行make命令,會導(dǎo)致編譯錯誤,原因是gcc版本太低導(dǎo)致的。 升級gcc版本:

[root@localhost redis-6.0.1]# gcc -v # 查看gcc版本

[root@localhost redis-6.0.1]# yum -y install centos-release-scl # 升級到9.1版本

[root@localhost redis-6.0.1]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils

[root@localhost redis-6.0.1]# scl enable devtoolset-9 bash

以上為臨時啟用,如果要長期使用gcc 9.1的話:

[root@localhost redis-6.0.1]# echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

再次重新編譯即可。 或者在安裝redis之前再安裝一邊gcc,也不會出現(xiàn)這個問題。

設(shè)置全局啟動

#cd redis-6.0.8

#make install //復(fù)制命令到usr/local/bin

//啟動命令:

redis-server

將redis命令,放到bin目錄下,以便可以在任何一個目錄下啟動redis服務(wù)。命令被放到了:/usr/local/bin 目錄中,其中的命令已經(jīng)被設(shè)置到了環(huán)境變量中。

redis基本操作

啟動-停止

啟動:# redis-server [&]停止:kill -9 pid 或者 redis-cli shutdown,通過客戶端向服務(wù)器發(fā)送一個命令,shutdown命令。

按照配置文件啟動服務(wù)

redis提供了服務(wù)的配置文件,啟動的時候指定配置文件,就可以按照配置文件的設(shè)置啟動服務(wù) [root@bogon /]# redis-server redis-conf & //& 表示后臺啟動,一般使用,不會占用整個終端

客戶端連接服務(wù)

先啟動服務(wù) [root@bogon /]# redis-server &執(zhí)行命令連接客戶端[root@bogon /]# redis-cli ,默認(rèn)連接本機(jī)(127.0.0.1)6379端口的redis服務(wù)。

指定連接IP和端口

[root@bogon /]# redis-cli -h Ip -p port,指定連接的服務(wù)器的IP和端口。

退出客戶端

127.0.0.1:6379> exit

基本知識

1)測試redis服務(wù)的性能

# redis-benchmark

2)查看redis服務(wù)是否正常運(yùn)行

127.0.0.1:6379> ping測試正常返回PONG

3)查看redis服務(wù)器統(tǒng)計(jì)信息

127.0.0.1:6379> info [指定段名稱]查看[指定段]全部信息

4)redis數(shù)據(jù)庫實(shí)例

類似mysql的一個個database,redis也有自己的數(shù)據(jù)庫實(shí)例。但是redis的數(shù)據(jù)庫實(shí)例,只能通過redis服務(wù)創(chuàng)建和維護(hù),開發(fā)人員不能修改和自行創(chuàng)建數(shù)據(jù)庫實(shí)例。默認(rèn)情況下,redis服務(wù)啟動的時候,會創(chuàng)建16個數(shù)據(jù)庫實(shí)例,并且給這些數(shù)據(jù)庫進(jìn)行編號,從0開始??梢酝ㄟ^配置文件(redis-conf)指定redis服務(wù)啟動的時候創(chuàng)建多少個數(shù)據(jù)庫實(shí)例。開發(fā)使用數(shù)據(jù)庫實(shí)例的時候,通過編號進(jìn)行使用。redis的數(shù)據(jù)庫實(shí)例,不用維護(hù)表結(jié)構(gòu),本身的內(nèi)存占用十分少,大約幾十kb,所以及時使用不完數(shù)據(jù)庫實(shí)例,也不會造成多大的空間浪費(fèi)。

如何切換數(shù)據(jù)庫實(shí)例?

redis服務(wù)啟動默認(rèn)使用0號數(shù)據(jù)庫實(shí)例 切換數(shù)據(jù)庫實(shí)例: 127.0.0.1:6379> select index //idnex是數(shù)據(jù)量實(shí)例編號,從0開始

//切換后 select 1

127.0.0.1:6379[1]>

### 5)數(shù)據(jù)庫基本操作

- ```js

127.0.0.1:6379> dbsize //查看數(shù)據(jù)庫實(shí)例key的個數(shù)

127.0.0.1:6379> keys * //查看當(dāng)前數(shù)據(jù)庫實(shí)例的所有key

127.0.0.1:6379> flushdb //清空當(dāng)前數(shù)據(jù)庫實(shí)例的所有key

127.0.0.1:6379> flushall //清空所有數(shù)據(jù)庫的key

6)查看數(shù)據(jù)庫配置信息

127.0.0.1:6379> config get * //查看所有配置信息

127.0.0.1:6379> config get 配置名稱 //查看指定配置信息

5種數(shù)據(jù)結(jié)構(gòu)

string ,list(有序),set(無序),hash,zset(排序)string是最基本的數(shù)據(jù)結(jié)構(gòu),它能存儲任何數(shù)據(jù)類型的數(shù)據(jù)。包括二進(jìn)制數(shù)據(jù),序列化后的數(shù)據(jù),json話的對象甚至是一張圖片(最大512M)。list是簡單的字符串列表,按照列表插入順序排序。底層是一個鏈表結(jié)構(gòu)(C語言實(shí)現(xiàn))。set無序,不重復(fù)hash,是一個string類型的key和value映射表,特別適合存儲實(shí)體類對象。zset,也是string類型的元素的集合,不重復(fù)。zset的每一個元素都會關(guān)聯(lián)一個分?jǐn)?shù),redis默認(rèn)按照分?jǐn)?shù)升序排序集合種元素。

如何存儲?

1)關(guān)于key的操作命令

keys pattern

pattern是通配符

’ * ',匹配0個或多個字符’ ? ',匹配一個字符’ [ ] ',匹配中括號中的一個字符 查看數(shù)據(jù)庫實(shí)例中的指定的key們。

exist key [key…]

判斷key在數(shù)據(jù)庫中是否存在。存在返回1,否則返回0。判斷多個key的時候,返回存在的key的數(shù)量

move key index

移動key到index庫中

ttl

查看指定key的剩余生存時間time to life ,生存時間返回值:

如果key不存在,返回-2如果沒有設(shè)置key的生存時間,返回-1,表示永遠(yuǎn)不會過期。

expire key xxxxx[s]

時間單位是秒,s給指定key設(shè)置最大生存時間 。設(shè)置成功返回 1

type key

查看指定key的數(shù)據(jù)類型。

rename key newkey

重命名指定key

del key [key…]

刪除指定的key,返回成功刪除的key的個數(shù)

2)操作數(shù)據(jù)結(jié)構(gòu)

Sting

String

set key value

設(shè)置key,值是value如果key已經(jīng)存在,那么會產(chǎn)生覆蓋

setnx key value

不重復(fù)key設(shè)置,如果存在相同的key,則放棄該次操作重復(fù)了,返回 0

mset k1 v1 k2 v2 [key value…]

批量設(shè)置鍵值對,key和value之間用空格間隔

msetnx k1 v1 k2 v2 [key value…]

批量設(shè)置,如果有一個重復(fù)的key,就放棄整個操作

get key

獲取key

mget k1 k2 k3 [key…]

批量獲取key的值,沒有返回(nil)

append key value

追加value到key中的值上返回追加后的value長度如果key不存在,則創(chuàng)建一個新的key,值為value

strlen key

獲取指定key的字符串長度

incr key

對數(shù)值型的字符串,執(zhí)行+1操作返回+1后的數(shù)值大小如果key不存在,則創(chuàng)建一個值為0的key,然后加1,返回1。如果可以不是數(shù)值類型的,那么報(bào)錯:ERR value is not an integer or out of range

decr key

-1,返回-1后的數(shù)值大小

incrby/decrby key offset

offset,設(shè)置的偏移量,對數(shù)值型的key進(jìn)行+/- offset的操作

getrange key startIndex endIndex

[startIndex,endIndex],閉區(qū)間截取截取key對應(yīng)的字符串從startIndex到endIndex結(jié)束的子字符串。下標(biāo)從0開始返回截取后的子字符串注意:下標(biāo)可以是負(fù)數(shù),負(fù)下標(biāo)表示從右往左開始,從-1開始,依次減小。-5 -4 -3 -2 -1[0 1 2 3 4]例如:name:zhangsan ,getrange name 0 4 == getrange 0 -4

setrange key startIndex value

覆蓋key從 strartInde 開始 的內(nèi)容。包括startIndex返回覆蓋后的字符串長度。

setex key seconds value

設(shè)置字符串的同時,設(shè)置其最大生存時間

List

List

一個key,對應(yīng)多個value每個元素都有下標(biāo),下標(biāo)從0開始,下標(biāo)也可以用負(fù)數(shù)表示,-1表示最后一個元素,往前負(fù)數(shù)越小。

lpsuh key value [ value …]

放入list集合多個value值,底層采用雙鏈表實(shí)現(xiàn)。插入順序采用頭插法每次插入值都是從表頭插入

lrange key startIndex endIndex

獲取集合[ startIndex,endIndex ]的數(shù)值下標(biāo)從0開始,支持負(fù)下標(biāo)。-1表示最后一個數(shù)。

rpush key elemet element…

每次都從尾部插入數(shù)值,尾插。

lpop/rpop key

從左/右刪除一個元素,返回刪除元素的值。

lindex key index

獲取指定key對應(yīng)集合的index下標(biāo)處的元素支持負(fù)下標(biāo),沒有的返回(nil)

llen key

獲取指定key對應(yīng)集合的長度

lrem key count value

當(dāng)count>0時,從左側(cè)刪除集合count個value,否則從右側(cè)刪除count個value。當(dāng)count==0時,從集合刪除所有值為value的元素。

ltrim key strartIndex endIndex

截取[ strartIndex,endIndex ]的元素,組成新的列表,并重新賦值給key。相當(dāng)于刪除[ strartIndex,endIndex ]外的元素

lset key index value

將指定key對應(yīng)的集合的index下標(biāo)處的數(shù)值設(shè)置為value

linsert key before/after pivot value

將value插入在指定集合的pivot元素之前/后。pivot時第一個遇到的指定數(shù)值處,進(jìn)行插入操作。

Set

Set

單key,多value,無序,不可重復(fù)

sadd key value [ value ]

放入指定key對應(yīng)的集合value,批量插入返回成功插入的元素個數(shù),重復(fù)的值不會被插入

smembers key

獲取指定集合中的全部元素,元素順序無序

sismember key member

判斷集合中member元素是否存在,存在返回 1 ,不存在返回 0

scard key

獲取集合的長度

srem key member [ member …]

刪除集合一個或多個值為member的元素

srandmember key [ count ]

隨機(jī)從集合中獲取count個元素count<0 ,獲取的元素可以重復(fù),count>0,獲取的元素不重復(fù)

smove source dest member

將source集合的member元素移動到dest集合中

sdiff key1 key2 [key…]

獲取第一個key1集合中獨(dú)有的元素,其他集合都沒用的元素

sinter key1 key2 [key…]

獲取所有集合的交集

sunion key1 key2 [ key…]

獲取所有集合的并集

Hash

Hash

單key-{ field-value,field-value,…}

h[m]set key field1 value1 field2 value2 [ field value…]

放入hash集合,多個field-value鍵值對。

hget key field

獲取集合的指定field域的數(shù)值。

hmget key field1 field2 [feiled…]

批量獲取filed的值

hgetall key

獲取集合所有的field-value對

hlen key

獲取集合的鍵值對個數(shù)

hdel key field field [ filed…]

刪除集合中一個或多個filed

hexists key field

判斷集合中是否存在field

hkeys/kvals key

獲取集合中所有的key/value值

hincrby[ float ] key field int[ float ]

將集合中field的值進(jìn)行加int/float運(yùn)算,可以整數(shù)/浮點(diǎn)數(shù)加

hsetnx key field value

保護(hù)性加入集合中一個field-value如果已經(jīng)存在,則放棄本次操作,不會產(chǎn)生覆蓋。

zset

Zset

單key,有序,不可重復(fù),每一個元素都有一個score分?jǐn)?shù)分?jǐn)?shù)可以重復(fù),redis默認(rèn)按照score升序排序。

zadd key score1 value1 score2 value2 [ score value…]

添加一個或多個分?jǐn)?shù)為score值為value的元素加入集合

zrange key startIndex endIndex [ withscores ]

查看集合[ startIndex,endIndex ] 的元素。0 -1 查看全部帶上withscores,顯示分?jǐn)?shù)

z[rev]rangebyscore key min max [ withscore ]

根據(jù)分?jǐn)?shù)在[min ,max]范圍的元素。withscores決定是否顯示在結(jié)果集中分?jǐn)?shù)。

zcount key min max

獲取集合分?jǐn)?shù)在[ min,max ]的元素個數(shù)

zrem key member1 member2 [ member…]

刪除集合中一個或多個元素

zcard key

獲取集合的元素個數(shù)

zrank key member

獲取集合member元素的排名,從0開始,分?jǐn)?shù)從小到大

zrevrank key member

分?jǐn)?shù)從大到小,獲取集合member元素的排名

zscore key member

獲取集合member元素的分?jǐn)?shù)

配置文件redis-conf

配置一些redis服務(wù)端運(yùn)行時的一些參數(shù)如果不使用配置文件,那么redis會按照默認(rèn)的參數(shù)運(yùn)行如果使用配置文件,在啟動redis服務(wù)時必須指定所使用的配置文件

1)關(guān)于網(wǎng)絡(luò)配置

port

redis所在端口號,默認(rèn)是6379

bind

配置客戶端連接redis服務(wù)時,所能使用的ip地址,默認(rèn)可以使用redis服務(wù)所在主機(jī)上任何一個IP都可以;一般情況下,都會配置一個ip,而且通常是一個真實(shí)ip 如果配置了port和bind,服務(wù)端連接服務(wù)器的時候,必須指定ip和port。因?yàn)閞edis-cli 默認(rèn)使用6379端口號連接。 redis-cli -h ip -p port //指定ip和端口號連接服務(wù)器

同理使用,redis-cli關(guān)閉服務(wù)器也需要指定IP和port。

tcp-keepalive

設(shè)置服務(wù)器的保活時間設(shè)置服務(wù)器每隔多少秒向客戶端發(fā)送ACK請求,測試客戶端是否掛掉。對于無響應(yīng)的客戶端,則會關(guān)閉其連接。如果設(shè)置為0,則不會進(jìn)行?;顧z測。

2)常規(guī)配置

loglevel

設(shè)置日志級別,開發(fā)階段可以使用debug,生產(chǎn)階段通常設(shè)置notice/warning。默認(rèn)時notice。log4j定義了8個級別的log(除去OFF和ALL,可以說分為6個級別),優(yōu)先級從高到低依次為:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。

ALL 最低等級的,用于打開所有日志記錄。

TRACE designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日志級別,一般不會使用。

DEBUG 指出細(xì)粒度信息事件對調(diào)試應(yīng)用程序是非常有幫助的,主要用于開發(fā)過程中打印一些運(yùn)行信息。

INFO 消息在粗粒度級別上突出強(qiáng)調(diào)應(yīng)用程序的運(yùn)行過程。打印一些你感興趣的或者重要的信息,這個可以用于生產(chǎn)環(huán)境中輸出程序運(yùn)行的一些重要信息,但是不能濫用,避免打印過多的日志。

WARN 表明會出現(xiàn)潛在錯誤的情形,有些信息不是錯誤信息,但是也要給程序員的一些提示。

ERROR 指出雖然發(fā)生錯誤事件,但仍然不影響系統(tǒng)的繼續(xù)運(yùn)行。打印錯誤和異常信息,如果不想輸出太多的日志,可以使用這個級別。

FATAL 指出每個嚴(yán)重的錯誤事件將會導(dǎo)致應(yīng)用程序的退出。這個級別比較高了。重大錯誤,這種級別你可以直接停止程序了。

OFF 最高等級的,用于關(guān)閉所有日志記錄。

如果將log level設(shè)置在某一個級別上,那么比此級別優(yōu)先級高的log都能打印出來。例如,如果設(shè)置優(yōu)先級為WARN,那么OFF、FATAL、ERROR、WARN 4個級別的log能正常輸出,而INFO、DEBUG、TRACE、 ALL級別的log則會被忽略。Log4j建議只使用四個級別,優(yōu)先級從高到低分別是ERROR、WARN、INFO、DEBUG。 從我們實(shí)驗(yàn)的結(jié)果可以看出,log4j默認(rèn)的優(yōu)先級為ERROR或者WARN(實(shí)際上是ERROR)。

logfile

設(shè)置日志文件

databases

設(shè)置redis的數(shù)據(jù)庫個數(shù)。默認(rèn)時16個。

3)安全配置

redis,默認(rèn)客戶端登錄時不需要密碼的,只要指定IP和port就行了

requirepass

默認(rèn)不設(shè)置密碼設(shè)置登錄redis服務(wù)器的密碼,設(shè)置后客戶端登錄需要指定密碼(-a指定)

protected-mode

安全模式,默認(rèn)時yesyes/no,當(dāng)為yes的時候,開啟權(quán)限和密碼等安全驗(yàn)證。

Redis持久化

redis提供了持久化策略,在適當(dāng)?shù)膶?shí)際采用適當(dāng)?shù)氖侄伟褍?nèi)存中的數(shù)據(jù)持久化到磁盤中,每次redis服務(wù)啟動的時候,都會再次從磁盤中記載這些數(shù)據(jù)。

RDB策略

在指定的時間間隔內(nèi),redis服務(wù)執(zhí)行指定次數(shù)的寫操作后,會自動觸發(fā)一次持久化操作。 RDB策略時redis的默認(rèn)策略,redis服務(wù)開啟的時候,這種持久化策略就默認(rèn)開啟了。 默認(rèn)策略是:

save save 900 1 //15分鐘,執(zhí)行1此寫操作

save 300 10 //5分鐘,10次

save 60 10000 //1分鐘,1萬次寫操作

dbfilename

數(shù)據(jù)持久化到磁盤后,保存數(shù)據(jù)的文件名稱。默認(rèn)是dump.rdb,也可以自己配置。

dir

持久化后保存數(shù)據(jù)的文件所在的目錄。 默認(rèn)是./ 就是redis啟動的目錄。 修改文件名稱,save,dir都是在redis.conf配置文件中配置的。

AOF策略

采用操作日志來記錄每一次的寫操作,每次啟動redis服務(wù)的時候,都會重新執(zhí)行一邊操作日志中的指令。效率很低,redis默認(rèn)不開啟。

appendonly

配置AOF是否開啟。yes/no

appendfilename

AOF策略的操作日志文件名稱。 # At the date of writing these commands are: set setnx setex append

appendonly no

# The name of the append only file (default: "appendonly.aof")

appendfilename "appendonly.aof"

事務(wù)

把一組數(shù)據(jù)庫操作放在一起執(zhí)行,保證操作的原子性,要么同時成功,要么同時失敗。

redis事務(wù)

允許把一組數(shù)據(jù)庫操作(redis命令)放在一起執(zhí)行,把命令進(jìn)行序列化,然后一起執(zhí)行吧,保證部分原子性。他不能完全保證原子化操作,只能保證部分原子性。

1)multi:

用來標(biāo)記一個事務(wù)的開始。單獨(dú)執(zhí)行這個命令表示開啟事務(wù)。之后執(zhí)行的命令都會加入命令隊(duì)列,等待exec,然后統(tǒng)一執(zhí)行。

2)exec:

用來事務(wù)隊(duì)列中所有的命令

部分原子性

1)如果一組命令中,在壓入命令隊(duì)列的過程中,發(fā)生了致命錯誤,那么整個隊(duì)列的命令都不會執(zhí)行。比如,在壓入隊(duì)列過程中,發(fā)現(xiàn)了命令語法錯誤,就會導(dǎo)致整個隊(duì)列命令的不執(zhí)行。2)如何命令在壓入過程中正常,而在執(zhí)行過程中發(fā)送錯誤。那么只會影響發(fā)送錯誤的命令,而不會影響其他的命令。3)編譯過程錯誤具有原子性,而運(yùn)行過程錯誤不具有原子性。

3)discard :

放棄隊(duì)列中的命令。彈出隊(duì)列中的命令,不再執(zhí)行。 清除所有已經(jīng)壓入隊(duì)列的命令,并且結(jié)束整個事務(wù)。 multi

set k1 v1

set k2 v2

discard //放棄前面的命令,并結(jié)束事務(wù)。

4)防止并發(fā)修改 watch

mysql中:樂觀鎖

對重要的表中的記錄都加上一個“鎖”字段,用來防止并發(fā)修改同一條記錄。 id balance version(鎖字段)

//修改余額的操作

update table set balacne=balance-countMoney,version=vsersoin+1

where version=先前查出的version

如果version和先去取出的不一樣,那么此次操作將不會執(zhí)行。每次執(zhí)行成功都會修改veriosn。 只有version和修改前取出的version一致的時候才會執(zhí)行修改操作。保證一次只有一個用戶修改一個記錄。 redis中:watch key命令

監(jiān)控某一個鍵,在事務(wù)的執(zhí)行時,如果這個鍵發(fā)生了變化,則本次事務(wù)的放棄執(zhí)行,所有命令都不會執(zhí)行。 監(jiān)控的鍵可能會被其他客戶端在本客戶端壓入事務(wù)命令隊(duì)列的時候,修改了這個鍵,那么本客戶端的事務(wù)將會被放棄執(zhí)行。 //客戶端1

>set balance 100

>set balance 200

>set version 1

>watch version //開啟監(jiān)控

>multi //開啟事務(wù)

decrby balcane 80

incr version

>exec

//客戶端2

>incr verison //另一個客戶端修改了監(jiān)控的鍵version

//結(jié)果:在客戶端1中

>exec

(nil)

就類似樂觀鎖,在開啟監(jiān)控的時候取出這個鍵version,在exec的時候,檢查當(dāng)前的version和之前的是否相同,如果不同,則放棄當(dāng)前事務(wù)。

5)unwatch

放棄監(jiān)控所有的鍵unwatch //放棄所有監(jiān)控的鍵

筆記

redis的命令是具有隔離性的,每個客戶端之間互不影響,每個客戶端執(zhí)行命令的時候,不會被其他客戶端發(fā)來的命令打斷。除非在使用watch監(jiān)控的時候,其他客戶端修改監(jiān)控的鍵,會導(dǎo)致監(jiān)控該鍵的客戶端事務(wù)的放棄。

消息的訂閱和發(fā)布

客戶端之間的通信redis客戶端訂閱頻道,發(fā)布者往頻道上發(fā)布消息。這樣所有訂閱該頻道的客戶端都會收到消息

subscribe

subscribe ch1 ch2 … 訂閱一個或多個頻道。 psubscribe:支持頻道使用通配符

publish

publish ch message向指定頻道發(fā)生message消息。

更好的消息訂閱和通信:activeMQ2,Rabbit

柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 nosql Redis

http://yzkb.51969.com/

好文鏈接

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19323347.html

發(fā)布評論

您暫未設(shè)置收款碼

請?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄