Redis缓存数据库(一)
緩存數據庫介紹
NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,泛指非關系型的數據庫,隨著互聯網web2.0網站的興起,傳統的關系數據庫在應付web2.0網站,特別是超大規模和高并發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的數據庫則由于其本身的特點得到了非常迅速的發展。NoSQL數據庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。
NoSQL數據庫的四大分類
鍵值(Key-Value)存儲數據庫
這一類數據庫主要會使用到一個哈希表,這個表中有一個特定的鍵和一個指針指向特定的數據。Key/value模型對于IT系統來說的優勢在于簡單、易部署。但是如果DBA只對部分值進行查詢或更新的時候,Key/value就顯得效率低下了。[3]??舉例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB. 列存儲數據庫。 這部分數據庫通常是用來應對分布式存儲的海量數據。鍵仍然存在,但是它們的特點是指向了多個列。這些列是由列家族來安排的。如:Cassandra, HBase, Riak. 文檔型數據庫 文檔型數據庫的靈感是來自于Lotus Notes辦公軟件的,而且它同第一種鍵值存儲相類似。該類型的數據模型是版本化的文檔,半結構化的文檔以特定的格式存儲,比如JSON。文檔型數據庫可 以看作是鍵值數據庫的升級版,允許之間嵌套鍵值。而且文檔型數據庫比鍵值數據庫的查詢效率更高。如:CouchDB, MongoDb. 國內也有文檔型數據庫SequoiaDB,已經開源。 圖形(Graph)數據庫 圖形結構的數據庫同其他行列以及剛性結構的SQL數據庫不同,它是使用靈活的圖形模型,并且能夠擴展到多個服務器上。NoSQL數據庫沒有標準的查詢語言(SQL),因此進行數據庫查詢需要制定數據模型。許多NoSQL數據庫都有REST式的數據接口或者查詢API。[2]??如:Neo4J, InfoGrid, Infinite Graph. 因此,我們總結NoSQL數據庫在以下的這幾種情況下比較適用:1、數據模型比較簡單;2、需要靈活性更強的IT系統;3、對數據庫性能要求較高;4、不需要高度的數據一致性;5、對于給定key,比較容易映射復雜值的環境。NoSQL數據庫的四大分類表格分析
| 鍵值(key-value)[3]? | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 內容緩存,主要用于處理大量數據的高訪問負載,也用于一些日志系統等等。[3]? | Key 指向 Value 的鍵值對,通常用hash table來實現[3]? | 查找速度快 | 數據無結構化,通常只被當作字符串或者二進制數據[3]? |
| 列存儲數據庫[3]? | Cassandra, HBase, Riak | 分布式的文件系統 | 以列簇式存儲,將同一列數據存在一起 | 查找速度快,可擴展性強,更容易進行分布式擴展 | 功能相對局限 |
| 文檔型數據庫[3]? | CouchDB, MongoDb | Web應用(與Key-Value類似,Value是結構化的,不同的是數據庫能夠了解Value的內容) | Key-Value對應的鍵值對,Value為結構化數據 | 數據結構要求不嚴格,表結構可變,不需要像關系型數據庫一樣需要預先定義表結構 | 查詢性能不高,而且缺乏統一的查詢語法。 |
| 圖形(Graph)數據庫[3]? | Neo4J, InfoGrid, Infinite Graph | 社交網絡,推薦系統等。專注于構建關系圖譜 | 圖結構 | 利用圖結構相關算法。比如最短路徑尋址,N度關系查找等 | 很多時候需要對整個圖做計算才能得出需要的信息,而且這種結構不太好做分布式的集群方案。[3]? |
?redis
?
介紹
redis是業界主流的key-value nosql 數據庫之一。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
Redis優點
-
異常快速?:?Redis是非常快的,每秒可以執行大約110000設置操作,81000個/每秒的讀取操作。
-
支持豐富的數據類型?:?Redis支持最大多數開發人員已經知道如列表,集合,可排序集合,哈希等數據類型。
這使得在應用中很容易解決的各種問題,因為我們知道哪些問題處理使用哪種數據類型更好解決。 -
操作都是原子的?:?所有?Redis?的操作都是原子,從而確保當兩個客戶同時訪問?Redis?服務器得到的是更新后的值(最新值)。
- MultiUtility工具:Redis是一個多功能實用工具,可以在很多如:緩存,消息傳遞隊列中使用(Redis原生支持發布/訂閱),在應用程序中,如:Web應用程序會話,網站頁面點擊數等任何短暫的數據;
安裝Redis環境
要在 Ubuntu 上安裝?Redis,打開終端,然后輸入以下命令: $sudo apt-get update $sudo apt-get install redis-server 這將在您的計算機上安裝Redis啟動 Redis
$redis-server查看 redis 是否還在運行
$redis-cli 這將打開一個 Redis 提示符,如下圖所示: redis 127.0.0.1:6379> 在上面的提示信息中:127.0.0.1?是本機的IP地址,6379是?Redis?服務器運行的端口。現在輸入?PING?命令,如下圖所示: redis 127.0.0.1:6379> ping PONG 這說明現在你已經成功地在計算機上安裝了?Redis。Python操作Redis
sudo pip install redis or sudo easy_install redis or 源碼安裝詳見:https://github.com/WoLpH/redis-py
在Ubuntu上安裝Redis桌面管理器
要在Ubuntu?上安裝?Redis桌面管理,可以從?http://redisdesktop.com/download?下載包并安裝它。
Redis?桌面管理器會給你用戶界面來管理?Redis?鍵和數據。 ?Redis API使用
redis-py 的API的使用可以分類為:
- 連接方式
- 連接池
- 操作
- String 操作
- Hash 操作
- List 操作
- Set 操作
- Sort Set 操作
- 管道
- 發布訂閱
連接方式
?
1、操作模式
redis-py提供兩個類Redis和StrictRedis用于實現Redis的命令,StrictRedis用于實現大部分官方的命令,并使用官方的語法和命令,Redis是StrictRedis的子類,用于向后兼容舊版本的redis-py。
import redisr = redis.Redis(host='10.211.55.4', port=6379) r.set('foo', 'Bar') print r.get('foo')?
2、連接池
redis-py使用connection pool來管理對一個redis server的所有連接,避免每次建立、釋放連接的開銷。默認,每個Redis實例都會維護一個自己的連接池。可以直接建立一個連接池,然后作為參數Redis,這樣就可以實現多個Redis實例共享一個連接池。
操作
1. String操作
redis中的String在在內存中按照一個name對應一個value來存儲。如圖:
set(name, value, ex=None, px=None, nx=False, xx=False)?
在Redis中設置值,默認,不存在則創建,存在則修改 參數: ?????ex,過期時間(秒) ?????px,過期時間(毫秒) ?????nx,如果設置為True,則只有name不存在時,當前set操作才執行 ?????xx,如果設置為True,則只有name存在時,崗前set操作才執行 setnx(name, value)設置值,只有name不存在時,執行設置操作(添加)
setex(name, value, time) 設置值 參數:time,過期時間(數字秒 或 timedelta對象) mget(keys, *args)?
? psetex(name, time_ms, value) 設置值 參數: ???? time_ms,過期時間(數字毫秒 或 timedelta對象) mset(*args, **kwargs) 批量設置值 如: ????mset(k1='v1', k2='v2') ????或 ????mget({'k1':?'v1',?'k2':?'v2'}) get(name)獲取值
mget(keys, *args) 批量獲取 如: ????mget('ylr',?'wupeiqi') ????或 ????r.mget(['ylr',?'wupeiqi']) getset(name, value)設置新值并獲取原來的值
getrange(key, start, end) ?獲取子序列(根據字節獲取,非字符) ?參數: ????# name,Redis 的 name ????# start,起始位置(字節) ????# end,結束位置(字節) setrange(name, offset, value)修改字符串內容,從指定字符串索引開始向后替換(新值太長時,則向后添加)
?參數: ??? offset,字符串的索引,字節(一個漢字三個字節) ???? value,要設置的值setbit(name, offset, value)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # 對name對應值的二進制表示的位進行操作 # 參數: ????# name,redis的name ????# offset,位的索引(將值變換成二進制后再進行索引) ????# value,值只能是 1 或 0 # 注:如果在Redis中有一個對應: n1 = "foo", ????????那么字符串foo的二進制表示為:01100110?01101111?01101111 ????所以,如果執行 setbit('n1',?7,?1),則就會將第7位設置為1, ????????那么最終二進制則變成?01100111?01101111?01101111,即:"goo" # 擴展,轉換二進制表示: ????# source = "武沛齊" ????source?=?"foo" ????for?i?in?source: ????????num?=?ord(i) ????????print?bin(num).replace('b','') ????特別的,如果source是漢字?"武沛齊"怎么辦? ????答:對于utf-8,每一個漢字占?3?個字節,那么?"武沛齊"?則有?9個字節 ???????對于漢字,for循環時候會按照 字節 迭代,那么在迭代時,將每一個字節轉換 十進制數,然后再將十進制數轉換成二進制 ????????11100110?10101101?10100110?11100110?10110010?10011011?11101001?10111101?10010000 |
*用途舉例,用最省空間的方式,存儲在線用戶數及分別是哪些用戶在線
?
getbit(name, offset)
| 1 | # 獲取name對應的值的二進制表示中的某位的值 (0或1) |
bitcount(key, start=None, end=None)
| 1 2 3 4 5 | # 獲取name對應的值的二進制表示中 1 的個數 # 參數: ????# key,Redis的name ????# start,位起始位置 ????# end,位結束位置 |
strlen(name)
| 1 | # 返回name對應值的字節長度(一個漢字3個字節) |
incr(self, name, amount=1)
| 1 2 3 4 5 6 7 | # 自增 name對應的值,當name不存在時,則創建name=amount,否則,則自增。 # 參數: ????# name,Redis的name ????# amount,自增數(必須是整數) # 注:同incrby |
incrbyfloat(self, name, amount=1.0)
| 1 2 3 4 5 | # 自增 name對應的值,當name不存在時,則創建name=amount,否則,則自增。 # 參數: ????# name,Redis的name ????# amount,自增數(浮點型) |
decr(self, name, amount=1)
| 1 2 3 4 5 | # 自減 name對應的值,當name不存在時,則創建name=amount,否則,則自減。 # 參數: ????# name,Redis的name ????# amount,自減數(整數) |
append(key, value)
# 在redis name對應的值后面追加內容# 參數:key, redis的namevalue, 要追加的字符串?
轉載于:https://www.cnblogs.com/now-playing/p/8301491.html
總結
以上是生活随笔為你收集整理的Redis缓存数据库(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ2301: [HAOI2011]
- 下一篇: 从浏览器地址栏输入网址,到网页彻底打开,