什么是Redis?
Redis是非關系型數據庫,是一個高性能的key-value數據庫,它是開源的,更是免費的。
Redis能做什么?
存儲數據
Redis的優點有哪些?
1.它支持存儲豐富的數據類型,比如:Sting,hash,set,List,zset等數據結構的存儲。
2.性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s。
3.原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全並后的原子性執行。
這里解釋一下什么叫做原子性:操作不可再分,要么全部執行,要么全部不執行。
redis的原子性:
-
單個操作是原子性的
-
多個操作也支持事務,即原子性,通過
MULTI
和EXEC
指令包起來
這里不得不提一下redis的事物,redis的事物原理是這樣子的:
1.批量操作在發送EXEC命令前被放入隊列緩存
2.收到EXEC命令后進入事物執行,事物中任意命令執行失敗,其余的命令都不會被執行
3.在事物執行過程中,其他客戶端提交的命令不會插入到事物執行命令序列中
下面是redis事物的一個例子:redis 127.0.0.1:6379> MULTOK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days" QUEUED redis 127.0.0.1:6379> GET book-name QUEUED redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series" QUEUED redis 127.0.0.1:6379> SMEMBERS tag QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) "Mastering C++ in 21 days" 3) (integer) 3 4) 1) "Mastering Series" 2) "C++" 3) "Programming"
它是以MULT開始一個事物,然后將多個命令入隊到事物中,最后由EXEC命令觸發事物,一並執行事物中的所有命令。
Redis事物的一些常用命令:
1.DISCARD
取消事務,放棄執行事務塊內的所有命令
2.EXEC
執行所有事務塊內的命令
3.MULTI
標記一個事務塊的開始
4.UNWATCH
取消 WATCH 命令對所有 key 的監視
5.WATCH key [key ...]
監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷
4.豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
Redis與其他key-value存儲有什么不同?
-
Redis有着更為復雜的數據結構並且提供對他們的原子性操作,這是一個不同於其他數據庫的進化路徑。Redis的數據類型都是基於基本數據結構的同時對程序員透明,無需進行額外的抽象。
-
Redis運行在內存中但是可以持久化到磁盤,所以在對不同數據集進行高速讀寫時需要權衡內存,因為數據量不能大於硬件內存。在內存數據庫方面的另一個優點是,相比在磁盤上相同的復雜的數據結構,在內存中操作起來非常簡單,這樣Redis可以做很多內部復雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,因為他們並不需要進行隨機訪問。
Redis的命令有哪些?
INCR 命令將字符串值解析成整型,將其加一,最后將結果保存為新的字符串值,類似的命令有INCRBY, DECR 和 DECRBY。實際上他們在內部就是同一個命令,只是看上去有點兒不同。
使用EXISTS命令返回1或0標識給定key的值是否存在,使用DEL命令可以刪除key對應的值,DEL命令返回1或0標識值是被刪除(值存在)或者沒被刪除(key對應的值不存在)。
TYPE命令可以返回key對應的值的存儲類型
用EXPIRE來設置超時時間(也可以再次調用這個命令來改變超時時間,使用PERSIST命令去除超時時間 )。我們也可以在創建值的時候設置超時時間
LPUSH 命令可向list的左邊(頭部)添加一個新元素,而RPUSH命令可向list的右邊(尾部)添加一個新元素。最后LRANGE 命令可從list中取出一定范圍的元素
LRANGE 帶有兩個索引,一定范圍的第一個和最后一個元素。這兩個索引都可以為負來告知Redis從尾部開始計數,因此-1表示最后一個元素,-2表示list中的倒數第二個元素,以此類推
還有一個重要的命令是pop,它從list中刪除元素並同時返回刪除的值。可以在左邊或右邊操作
我們增加了三個元素,並彈出了三個元素,因此,在這最后 列表中的命令序列是空的,沒有更多的元素可以被彈出。如果我們嘗試彈出另一個元素,將會得到一個null
可以使用LTRIM把list從左邊截取指定長度。比如 mylist 1 2 3 4 5 ,ltrim mylist 0 2,結果 lrange mylist 0 -1 是 1 2 3
SADD key member1 [member2]
向集合添加一個或多個成員
SCARD key
獲取集合的成員數
SMEMBERS key
返回集合中的所有成員