柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 nosql Redis
柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 nosql Redis
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
好文鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。