緩存數據庫之redis

NoSQL(NoSQL = Not Only SQL ),意即「不只僅是SQL」,泛指非關係型的數據庫,NoSQL數據庫的產生就是爲了解決大規模數據集合多重數據種類帶來的挑戰,尤爲是大數據應用難題

NoSQL數據庫的四大分類

分類 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度關係查找等 不少時候須要對整個圖作計算才能得出須要的信息,並且這種結構不太好作分佈式的集羣方案。

redis是業界主流的key-value nosql 數據庫之一。 鍵的類型是字符串且不能重複,值的類型能夠分爲五種字符串、哈希、列表、集合、有序集合。

安裝Redis環境

要在 Ubuntu 上安裝 Redis,打開終端,而後輸入如下命令:
$sudo apt-get update
$sudo apt-get install redis-server
這將在您的計算機上安裝Redis

啓動 Redispython

$redis-server

查看 redis 是否還在運行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。
 
鏈接方式
import redis
  
r = redis.Redis(host='10.211.55.4', port=6379)
r.set('foo', 'Bar')
print r.get('foo')
View Code

鏈接池,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'))   #獲取
View Code

管道,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()
View Code

發佈和訂閱數據庫

首先定義一個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
View Code

發佈者服務器

from RedisHelper import RedisHelper

obj = RedisHelper()
obj.publish('hello')#發佈
View Code

訂閱者網絡

from RedisHelper import RedisHelper

obj = RedisHelper()
redis_sub = obj.subscribe()#調用訂閱方法

while True:
    msg= redis_sub.parse_response()
    print (msg)
View Code

 

基本操做

String操做 表現形式k1—>v1

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對應的值後面追加內容

 

 Hash操做,表現形式上有些像pyhton中的dict,能夠存儲一組關聯性較強的數據 。k1——>{Kx—>Vx}

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)

相關文章
相關標籤/搜索