分類 | Examples舉例 | 典型應用場景 | 數據模型 | 優勢 | 缺點 |
---|---|---|---|---|---|
鍵值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 內容緩存,主要用於處理大量數據的高訪問負載,也用於一些日誌系統等等。 | Key 指向 Value 的鍵值對,一般用hash table來實現 | 查找速度快 | 數據無結構化,一般只被看成字符串或者二進制數據 |
列存儲數據庫 | Cassandra, HBase, Riak | 分佈式的文件系統 | 以列簇式存儲,將同一列數據存在一塊兒 | 查找速度快,可擴展性強,更容易進行分佈式擴展 | 功能相對侷限 |
文檔型數據庫 | CouchDB, MongoDb | Web應用(與Key-Value相似,Value是結構化的,不一樣的是數據庫可以瞭解Value的內容) | Key-Value對應的鍵值對,Value爲結構化數據 | 數據結構要求不嚴格,表結構可變,不須要像關係型數據庫同樣須要預先定義表結構 | 查詢性能不高,並且缺少統一的查詢語法。 |
圖形(Graph)數據庫 | Neo4J, InfoGrid, Infinite Graph | 社交網絡,推薦系統等。專一於構建關係圖譜 | 圖結構 | 利用圖結構相關算法。好比最短路徑尋址,N度關係查找等 | 不少時候須要對整個圖作計算才能得出須要的信息,並且這種結構不太好作分佈式的集羣方案。 |
$sudo apt-get update $sudo apt-get install redis-server
啓動 Redispython
$redis-server
查看 redis 是否還在運行redis
$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> ping PONG
import redis r = redis.Redis(host='10.211.55.4', port=6379) r.set('foo', 'Bar') print r.get('foo')
鏈接池,redis-py使用connection pool來管理對一個redis server的全部鏈接,避免每次創建、釋放鏈接的開銷。默認,每一個Redis實例都會維護一個本身的鏈接池。能夠直接創建一個鏈接池,而後做爲參數Redis,這樣就能夠實現多個Redis實例共享一個鏈接池。算法
import redis pool = redis.ConnectionPool(host='192.168.0.110', port=6379) r = redis.Redis(connection_pool=pool) r.set('name', 'xmen') #添加 print (r.get('name')) #獲取
管道,redis-py默認在執行每次請求都會建立(鏈接池申請鏈接)和斷開(歸還鏈接池)一次鏈接操做,若是想要在一次請求中指定多個命令,則可使用pipline實現一次請求指定多個命令,而且默認狀況下一次pipline 是原子性操做。sql
import redis pool = redis.ConnectionPool(host='192.168.0.110', port=6379) r = redis.Redis(connection_pool=pool) pipe = r.pipeline(transaction=True) r.set('name', 'zhangsan') r.set('name', 'lisi') pipe.execute()
發佈和訂閱數據庫
首先定義一個RedisHelper類,鏈接Redis,定義頻道爲monitor,定義發佈(publish)及訂閱(subscribe)方法緩存
import redis class RedisHelper(object): def __init__(self): self.__conn = redis.Redis(host='192.168.0.110',port=6379)#鏈接Redis self.channel = 'monitor' #定義名稱 def publish(self,msg):#定義發佈方法 self.__conn.publish(self.channel,msg) return True def subscribe(self):#定義訂閱方法 pub = self.__conn.pubsub() pub.subscribe(self.channel) pub.parse_response() return pub
發佈者服務器
from RedisHelper import RedisHelper obj = RedisHelper() obj.publish('hello')#發佈
訂閱者網絡
from RedisHelper import RedisHelper obj = RedisHelper() redis_sub = obj.subscribe()#調用訂閱方法 while True: msg= redis_sub.parse_response() print (msg)
set(name, value, ex=None, px=None, nx=False, xx=False)數據結構
setnx(name, value)app
setex(name, value, time)#設置過時時間
psetex(name, time_ms, value)
mset(*args, **kwargs)#設置多個鍵值
get(name)#獲取值
mget(keys, *args)#批量獲取
getset(name, value)#設置新值並獲取原來的值
getrange(key, start, end)# 獲取子序列(根據字節獲取,非字符)
setrange(name, offset, value)# 修改字符串內容,從指定字符串索引開始向後替換(新值太長時,則向後添加)
setbit(name, offset, value)# 對name對應值的二進制表示的位進行操做
getbit(name, offset)# 獲取name對應的值的二進制表示中的某位的值 (0或1)
bitcount(key, start=None, end=None)# 獲取name對應的值的二進制表示中 1 的個數
strlen(name)# 返回name對應值的字節長度(一個漢字3個字節)
incr(self, name, amount=1)# 自增 name對應的值,當name不存在時,則建立name=amount,不然,則自增。
incrbyfloat(self, name, amount=1.0)# 自增 name對應的值,當name不存在時,則建立name=amount,不然,則自增。
decr(self, name, amount=1)# 自減 name對應的值,當name不存在時,則建立name=amount,不然,則自減。
append(key, value)# 在redis name對應的值後面追加內容
hset(name, key, value)# name對應的hash中設置一個鍵值對(不存在,則建立;不然,修改)
hmset(name, mapping)# 在name對應的hash中批量設置鍵值對
hget(name,key)# 在name對應的hash中獲取根據key獲取value
hmget(name, keys, *args)# 在name對應的hash中獲取多個key的值
hgetall(name)#獲取name對應
hash
的全部鍵值
hlen(name)# 獲取name對應的hash中鍵值對的個數
hkeys(name)# 獲取name對應的hash中全部的key的值
hvals(name)# 獲取name對應的hash中全部的value的值
hexists(name, key)# 檢查name對應的hash是否存在當前傳入的key
hdel(name,*keys)# 將name對應的hash中指定key的鍵值對刪除
hincrby(name, key, amount=1)# 自增name對應的hash中的指定key的值,不存在則建立key=amount
hincrbyfloat(name, key, amount=1.0)# 自增name對應的hash中的指定key的值,不存在則建立key=amount
hscan_iter(name, match=None, count=None)# 利用yield封裝hscan建立生成器,實現分批去redis中獲取數據
List操做,redis中的List在在內存中按照一個name對應一個List來存儲
lpush(name,values)# 在name對應的list中添加元素,每一個新的元素都添加到列表的最左邊
lpushx(name,value)# 在name對應的list中添加元素,只有name已經存在時,值添加到列表的最左邊
llen(name)# name對應的list元素的個數
linsert(name, where, refvalue, value))# 在name對應的列表的某一個值前或後插入一個新值
lset(name, index, value)# 對name對應的list中的某一個索引位置從新賦值
lrem(name, value, num)# 在name對應的list中刪除指定的值
lpop(name)# 在name對應的列表的左側獲取第一個元素並在列表中移除,返回值則是第一個元素
lindex(name, index)#在name對應的列表中根據索引獲取列表元素
lrange(name, start, end)# 在name對應的列表分片獲取數據
ltrim(name, start, end)# 在name對應的列表中移除沒有在start-end索引之間的值
rpoplpush(src, dst)# 從一個列表取出最右邊的元素,同時將其添加至另外一個列表的最左邊
blpop(keys, timeout)# 將多個列表排列,按照從左到右去pop對應列表的元素
brpoplpush(src, dst, timeout=0)# 從一個列表的右側移除一個元素並將其添加到另外一個列表的左側
Set操做,Set集合就是不容許重複的列表
sadd(name,values)# name對應的集合中添加元素
scard(name)獲取name對應的集合中元素個數
sdiff(keys, *args)在第一個name對應的集合中且不在其餘name對應的集合的元素集合
sdiffstore(dest, keys, *args)# 獲取第一個name對應的集合中且不在其餘name對應的集合,再將其新加入到dest對應的集合中
sinter(keys, *args)# 該集合是全部給定集合的交集
sinterstore(dest, keys, *args)# 獲取多一個name對應集合的並集,再講其加入到dest對應的集合中
sismember(name, value)# 檢查value是不是name對應的集合的成員
smembers(name)# 獲取name對應的集合的全部成員
smove(src, dst, value)# 將某個成員從一個集合中移動到另一個集合
spop(name)# 從集合的右側(尾部)移除一個成員,並將其返回
srandmember(name, numbers)# 從name對應的集合中隨機獲取 numbers 個元素
srem(name, values)# 在name對應的集合中刪除某些值
sunion(keys, *args)# 獲取多一個name對應的集合的並集
sunionstore(dest,keys, *args)# 獲取多一個name對應的集合的並集,並將結果保存到dest對應的集合中
sscan(name, cursor=0, match=None, count=None)
sscan_iter(name, match=None, count=None)# 同字符串的操做,用於增量迭代分批獲取元素,避免內存消耗太大
有序集合,在集合的基礎上,爲每元素排序;元素的排序須要根據另一個值來進行比較,因此,對於有序集合,每個元素有兩個值,即:值和分數,分數專門用來作排序。
zadd(name, *args, **kwargs)# 在name對應的有序集合中添加元素
zcard(name)# 獲取name對應的有序集合元素的數量
zcount(name, min, max)# 獲取name對應的有序集合中分數 在 [min,max] 之間的個數
zincrby(name, value, amount)# 自增name對應的有序集合的 name 對應的分數
zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)# 按照索引範圍獲取name對應的有序集合的元素
zrank(name, value)# 獲取某個值在 name對應的有序集合中的排行(從 0 開始)
zrem(name, values)# 刪除name對應的有序集合中值是values的成員
zremrangebyrank(name, min, max)# 根據排行範圍刪除
zremrangebyscore(name, min, max)# 根據分數範圍刪除
zscore(name, value)# 獲取name對應有序集合中 value 對應的分數
zinterstore(dest, keys, aggregate=None)# 獲取兩個有序集合的交集,若是遇到相同值不一樣分數,則按照aggregate進行操做,aggregate的值爲: SUM MIN MAX
zunionstore(dest, keys, aggregate=None)# 獲取兩個有序集合的並集,若是遇到相同值不一樣分數,則按照aggregate進行操做
delete(*names)# 根據刪除redis中的任意數據類型
exists(name)# 檢測redis的name是否存在
keys(pattern='*')# 根據模型獲取redis的name
expire(name ,time)# 爲某個redis的某個name設置超時時間
rename(src, dst)# 對redis的name重命名爲
move(name, db))# 將redis的某個值移動到指定的db下
randomkey()# 隨機獲取一個redis的name(不刪除)
type(name)# 獲取name對應值的類型
scan(cursor=0, match=None, count=None)# 同字符串操做,用於增量迭代獲取keyscan_iter(match=None, count=None)