redis是一個NoSQL數(shù)據(jù)庫翔冀,其在當(dāng)今的互聯(lián)網(wǎng)公司有著和傳統(tǒng)數(shù)據(jù)庫相輔相成的角色。今天來對其進(jìn)行小結(jié)一下。
在寫這個小結(jié)時娱颊,我已工作兩年了,也就是說已經(jīng)使用了兩年redis(雖然公司內(nèi)部使用的是運維同學(xué)的r2m集群轩猩,在京東的同學(xué)應(yīng)該都知道肿轨,其底層就是redis)。所以這里不會說怎么起下載安裝了恃逻,介紹redis的五種數(shù)據(jù)類型了雏搂。這在網(wǎng)上一查一大把,這都是最基礎(chǔ)的使用了 string list set zset hash寇损。
比起常用的數(shù)據(jù)操縱命令畔派,這里主要說說redis的事務(wù)操縱,redis的發(fā)布訂閱(項目中一直在用润绵,可以和消息中間件對比學(xué)習(xí)一下)线椰,以及redis的分布式鎖的使用,最后順便說說pipline的使用尘盼。學(xué)習(xí)任何一個技術(shù)憨愉,首先扒拉一下官方文檔。
Programming with Redis
The full list of commands implemented by Redis, along with thorough documentation for each of them.
Pipelining: Learn how to send multiple commands at once, saving on round trip time.
Redis Pub/Sub: Redis is a fast and stable Publish/Subscribe messaging system! Check it out.
Redis Lua scripting: Redis Lua scripting feature documentation.
Debugging Lua scripts: Redis 3.2 introduces a native Lua debugger for Redis scripts.
Memory optimization: Understand how Redis uses RAM and learn some tricks to use less of it.
Expires: Redis allows to set a time to live different for every key so that the key will be automatically removed from the server when it expires.
Redis as an LRU cache: How to configure and use Redis as a cache with a fixed amount of memory and auto eviction of keys.
Redis transactions: It is possible to group commands together so that they are executed as a single transaction.
Mass insertion of data: How to add a big amount of pre existing or generated data to a Redis instance in a short time.
Partitioning: How to distribute your data among multiple Redis instances.
Distributed locks: Implementing a distributed lock manager with Redis.
Redis keyspace notifications: Get notifications of keyspace events via Pub/Sub (Redis 2.8 or greater).
Creating secondary indexes with Redis: Use Redis data structures to create secondary indexes, composed indexes and traverse graphs.
上述內(nèi)容來自redis的官方文檔:
1.redis是所有實現(xiàn)的命令列表卿捎。
2.redis的pipline
3.redis的pub/sub命令
4.redis的lua腳本
5.redis debug
6.redis內(nèi)存優(yōu)化
7.redis的過期
8.redis的lurkey淘汰算法
9.redis的事務(wù)
10.redis的大數(shù)寫入
11.redis的數(shù)據(jù)在集群上的分片
13.redis分布式鎖
配紫。。午阵。
pipline
using piplining to speedup redis queryies
官方第一句話說的就是躺孝,使用pipline的目的就是為了加快查詢。redis的本質(zhì)是一個tpc的client/server模型底桂,也就是說植袍,一個查詢請求到達(dá)服務(wù)端了,然后等待服務(wù)端處理了籽懦,然后把數(shù)據(jù)再返回給客戶端于个。這個從請求發(fā)出到接收到服務(wù)端返回的消息這段時間就是往返時延。
pipline就是跳過請求-等待-響應(yīng)的這種模式暮顺,即使你一個請求沒有被處理完也可以繼續(xù)發(fā)請求厅篓,這樣就是在客戶端不等待響應(yīng)的情況下可以繼續(xù)向服務(wù)端發(fā)送請求。在最終給你返回你本次這批請求的結(jié)果捶码。
Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4
這種情況下就不需要為每次請求都等待了羽氮,縮短了往返延時。
pipline不僅僅是在往返延時上進(jìn)行改善惫恼,從服務(wù)器的角度也能大量的降低cpu的使用率档押,比如,你有1000個請
求,原來需要1000次汇荐,現(xiàn)在只需要一次了洞就。
try {
jedis = new Jedis("10.10.224.44", 6379);
Pipeline pipline = jedis .pipelined();
for(int i =0; i<1000; i++){
pipline .incr("hello");
}
pl.sync();
} catch (Exception e) {
...
}
pub/sub
redis的pub/sub其實就是一個消息的發(fā)布和監(jiān)聽的方式,把消息的發(fā)布者和接收者進(jìn)行解耦掀淘。
實際使用案例:
在用lucene做搜索的時候旬蟋,由于生產(chǎn)索引只是在一臺上生產(chǎn),所以革娄,需要把索引從生產(chǎn)的這臺機器上分別放在每一個實例的機器上倾贰,那么問題來了,該怎么告訴那些機器我生產(chǎn)好了呢拦惋?這里就可以使用這個命令匆浙。
if(索引生產(chǎn)出來了)
then pub(在指定的頻道發(fā)布了一個消息)
繼承了jedis subscribe
if(消息來了)
then 我就去你的機器上復(fù)制了
在現(xiàn)在消息中間件大行其道的環(huán)境下,還是不推薦使用這種方式來進(jìn)行小心通訊厕妖,消息對于發(fā)布者來說是發(fā)布即消失首尼,訂閱者需要有線程一直來監(jiān)聽消息的發(fā)布。使用mq消息來替代這種方式言秸,
redis 事務(wù)
在一個隊列中软能,一次性的,順序的举畸,排它的執(zhí)行一系列命令查排。
DISCARD
EXEC
MULTI
UNWATCH
WATCH
discard 放棄本次事務(wù)
multi 開啟事務(wù),通常返回一個OK(open session)開啟事務(wù)后抄沮,每次一次操作都是入隊跋核,知道exec,所有隊列的命令才會被提交的叛买。
exec 執(zhí)行事務(wù)(commit)
watch 監(jiān)視一個或者多個key
unwatch 取消watch對所有key的監(jiān)視
multi --> set a 1 set b 2 set c 3 --->exec
watch特別說明砂代。比如我watch的時候,用戶的賬戶余額100塊聪全,在你自己處理一系列后泊藕,還是100塊辅辩,提交的時候就沒問題难礼。如果在這個watch期間被別人修改過了,那么在watch提交會告訴你失敗了玫锋。
redis對事務(wù)的支持是部分支持的蛾茉,因為它是先吧所有命令放在執(zhí)行隊列中,只有執(zhí)行的時候才知道能不能執(zhí)行成功:
multi -->set a aa incr a set b 1--exec
這個命令執(zhí)行完成后撩鹿,只有b=1能成功谦炬,因為a 的value string類型的無法進(jìn)行加一操作,但是redis在未執(zhí)行的時候是不知道的,所以只有在執(zhí)行了键思,才知道是敗了础爬,所以第一條命令失敗了但是第二條set b 1是合法的,是能執(zhí)行成功的吼鳞。
所以看蚜,redis對事務(wù)的支持是部分支持。