Redis 内存数据库
為什么需要學習NOSQL (三高)
隨著互聯網的高速崛起,網站的用戶群的增加,訪問量的上升,傳統(關系型)數據庫上都開始出現了性能瓶頸,web程序不再僅僅專注在功能上,同時也在追求性能。所以NOSQL數據庫應運而上,具體表現為對如下三高問題的解決:
-
High performance - 對數據庫高并發讀寫的需求
web2.0網站要根據用戶個性化信息來實時生成動態頁面和提供動態信息,所以基本上無法使用動態頁面靜態化技術,因此數據庫并發負載非常高,往往要達到每秒上萬次讀寫請求。關系數據庫應付上萬次SQL查詢還勉強頂得住,但是應付上萬次SQL寫數據請求,硬盤IO就已經無法承受了。其實對于普通的BBS網站,往往也存在對高并發寫請求的需求,例如網站的實時統計在線用戶狀態,記錄熱門帖子的點擊次數,投票計數等,因此這是一個相當普遍的需求。(微博 :明星曝光戀情)
-
Huge Storage - 對海量數據的高效率存儲和訪問的需求
類似Facebook,twitter,Friendfeed這樣的SNS網站,每天用戶產生海量的用戶動態,以Friendfeed為例,一個月就達到了2.5億條用戶動態,對于關系數據庫來說,在一張2.5億條記錄的表里面進行SQL查詢,效率是極其低下乃至不可忍受的。再例如大型web網站的用戶登錄系統,例如騰訊,盛大,動輒數以億計的帳號,關系數據庫也很難應付。
-
High Scalability && High Availability- 對數據庫的高可擴展性和高可用性的需求
在基于web的架構當中,數據庫是最難進行橫向擴展的,當一個應用系統的用戶量和訪問量與日俱增的時候,你的數據庫卻沒有辦法像web server和app server那樣簡單的通過添加更多的硬件和服務節點來擴展性能和負載能力。對于很多需要提供24小時不間斷服務的網站來說,對數據庫系統進行升級和擴展是非常痛苦的事情,往往需要停機維護和數據遷移,為什么數據庫不能通過不斷的添加服務器節點來實現擴展呢?
NOSQL的特點
在大數據存取上具備關系型數據庫無法比擬的性能優勢,例如:
-
易擴展
NoSQL數據庫種類繁多,但是一個共同的特點都是去掉關系數據庫的關系型特性。數據之間無關系,這樣就非常容易擴展。也無形之間,在架構的層面上帶來了可擴展的能力。
-
大數據量,高性能
NoSQL數據庫都具有非常高的讀寫性能,尤其在大數據量下,同樣表現優秀。這得益于它的無關系性,數據庫的結構簡單。
-
靈活的數據模型
NoSQL無需事先為要存儲的數據建立字段,隨時可以存儲自定義的數據格式。而在關系數據庫里,增刪字段是一件非常麻煩的事情。如果是非常大數據量的表,增加字段簡直就是一個噩夢。這點在大數據量的Web2.0時代尤其明顯。
-
高可用
NoSQL在不太影響性能的情況,就可以方便的實現高可用的架構。比如Cassandra,HBase模型,通過復制模型也能實現高可用。
NoSQL:非關系型數據庫 是關系型數據庫的一個補充。
為什么要使用NOSQL
高并發讀寫需求
高效率存儲和訪問的需求
高擴展性和高可用性需求
主流的NoSQL
redis
MongoDB
什么是Redis
Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫,數據是保存在內存里面的. 官方提供測試數據,50個并發執行100000個請求,讀的速度是110000次/s,寫的速度是81000次/s ,且Redis通過提供多種鍵值數據類型來適應不同場景下的存儲需求,目前為止Redis支持的鍵值數據類型如下:
key是string類型,value可以是下面這五種類型
-
字符串類型 string
-
散列類型 hash java-hashmap
-
列表類型 list java-linkedlist
-
集合類型 set java-hashset
-
有序集合類型 sortedset 簡稱:zset 有序且唯一
Redis支持的數據類型有五種:string、hash、list、set、zset
redis的應用場景
-
緩存(數據查詢、短連接、新聞內容、商品內容、首頁等等)
-
任務隊列。(秒殺、搶購、12306等等)
-
數據過期處理(可以精確到毫秒, 短信驗證碼)
-
分布式集群架構中 session共享
-
分布式鎖實現
-
聊天室的在線好友列表
-
應用排行榜
-
網站訪問統計
redis中存儲的數據是以key-value的形式存在的.key是string類型,其中==value==支持5種數據類型 .在日常開發中主要使用比較多的有字符串string、哈希hash、字符串列表list、字符串集合set 四種類型,其中最為常用的是==字符串類型==。
字符串(String)
哈希(hash) 類似HashMap 適合存儲對象(屬性,屬性值)
字符串列表(list) 類似LinkedList
字符串集合(set) 類似HashSet
有序的字符串集合(sorted-set或者叫zset) 有序且唯一
Redis字符串(String)
| SET key value | 設置指定 key 的值 |
| GET key | 獲取指定 key 的值 |
| DEL key | 刪除key |
| GETSET key value | 將給定 key 的值設為 value ,并返回 key 的舊值(old value)。 |
| SETEX key seconds value | 將值 value 關聯到 key ,并將 key 的過期時間設為 seconds (以秒為單位)。 |
| SETNX key value | 只有在 key 不存在時設置 key 的值。 |
| INCR key | 將 key 中儲存的數字值增一。 |
| INCRBY key increment | 將 key 所儲存的值加上給定的增量值(increment) 。 |
| DECR key | 將 key 中儲存的數字值減一。 |
| DECRBY key decrement | key 所儲存的值減去給定的減量值(decrement) 。 |
?
Redis 哈希(Hash)
| hset key filed value | 將哈希表 key 中的字段 field 的值設為 value |
| hmset key field1 value1 [field2 value2]... | 同時將多個 field-value (字段-值)對設置到哈希表 key 中 |
| hget key filed | 獲取存儲在哈希表中指定字段的值 |
| hmget key filed1 filed2 | 獲取多個給定字段的值 |
| hdel key filed1 [filed2] | 刪除一個或多個哈希表字段 |
| hlen key | 獲取哈希表中字段的數量 |
| del key | 刪除整個hash(對象) |
| HGETALL key | 獲取在哈希表中指定 key 的所有字段和值 |
| HKEYS key | 獲取所有哈希表中的字段 |
| HVALS key | 獲取哈希表中所有值 |
?Redis 列表(List)
| lpush key value1 value2... | 將一個或多個值插入到列表頭部(左邊) |
| rpush key value1 value2... | 在列表中添加一個或多個值(右邊) |
| lpop key | 左邊彈出一個 相當于移除第一個 |
| rpop key | 右邊彈出一個 相當于移除最后一個 |
| llen key | 返回指定key所對應的list中元素個數 |
| LINDEX key index | 通過索引獲取列表中的元素 |
| LINSERT key BEFORE| AFTER pivot value | 在列表元素前或后插入元素 eg:linsert words before c e pivot表示列表中的元素 value表示新插入的值 |
?
Redis 集合(Set)
| sadd key member1 [member2] | 向集合添加一個或多個成員 |
| srem key member1 [member2] | 移除一個成員或者多個成員 |
| smembers key | 返回集合中的所有成員,查看所有 |
| SCARD key | 獲取集合的成員數 |
| SPOP key | 返回集合中移除的一個隨機元素 |
| SDIFF key1 [key2] | 返回給定所有集合的差集 |
| SUNION key1 [key2] | 返回所有給定集合的并集 |
| SINTER key1 [key2] | 返回給定所有集合的交集 |
Redis 有序集合(sorted set | zset)
| ZADD key score member [score member ...] | 增加元素 |
| ZSCORE key member | 獲取元素的分數 |
| ZREM key member [member ...] | 刪除元素 |
| ZCARD key | 獲得集合中元素的數量 |
| ZRANGE key start stop[WITHSCORES] | 獲得排名在某個范圍的元素列表 查看所有元素:zrange key 0 -1 倒序排列查看:zrevrange key 0 2 |
Redis不僅是使用命令來操作,現在基本上主流的語言都有客戶端支持,比如java、C、C#、C++、php、Node.js、Go等。 在官方網站里列一些Java的客戶端,有Jedis、Redisson、lettuce、JDBC-Redis、等其中官方推薦使用Jedis和Redisson。 在企業中用的最多的就是Jedis,Jedis同樣也是托管在github上.
| new Jedis(host, port) | 創建jedis對象,參數host是redis服務器地址,參數port是redis服務端口 |
| set(key,value) | 設置字符串類型的數據 |
| get(key) | 獲得字符串類型的數據 |
| hset(key,field,value) | 設置哈希類型的數據 |
| hget(key,field) | 獲得哈希類型的數據 |
| lpush(key,values) | 設置列表類型的數據 |
| lpop(key) | 列表左面彈棧 |
| rpop(key) | 列表右面彈棧 |
| sadd(String key, String... members) | 設置set類型的數據 |
| zrange(String key, long start, long end) | 獲得在某個范圍的元素列表 |
| del(key) | 刪除key |
| exists(key) | 判斷key是否存在 |
jedis的介紹
| new Jedis(host, port) | 創建jedis對象,參數host是redis服務器地址,參數port是redis服務端口 |
| set(key,value) | 設置字符串類型的數據 |
| get(key) | 獲得字符串類型的數據 |
| hset(key,field,value) | 設置哈希類型的數據 |
| hget(key,field) | 獲得哈希類型的數據 |
| lpush(key,values) | 設置列表類型的數據 |
| lpop(key) | 列表左面彈棧 |
| rpop(key) | 列表右面彈棧 |
| sadd(String key, String... members) | 設置set類型的數據 |
| zrange(String key, long start, long end) | 獲得在某個范圍的元素列表 |
| del(key) | 刪除key |
| exists(key) | 判斷key是否存在 |
總結
以上是生活随笔為你收集整理的Redis 内存数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iphone屏幕突然变暗_如果你的iPh
- 下一篇: linux cmake编译源码,linu