日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Redis實現(xiàn)租戶自動過濾功能(redis租戶自動過濾)

Redis實現(xiàn)租戶自動過濾功能

在分布式系統(tǒng)中,如何實現(xiàn)租戶自動過濾功能是一個比較常見的問題,這種情況通常出現(xiàn)在需要共享一個龐大的數(shù)據(jù)庫的時候。當(dāng)多個租戶(或者不同的應(yīng)用程序)共享同一數(shù)據(jù)庫時,需要通過自動過濾功能來保障彼此之間的數(shù)據(jù)隔離,防止一個租戶能夠看到另外一個租戶的數(shù)據(jù),或者誤刪別人的數(shù)據(jù),導(dǎo)致數(shù)據(jù)庫崩潰的情況。在這種情況下,Redis可以起到很好的作用。本文將介紹在Redis中如何實現(xiàn)租戶自動過濾功能。

我們需要一個代理來攔截所有的數(shù)據(jù)庫請求。這個代理可以是一個簡單的RESTful API,也可以是一個更加復(fù)雜的中間件。無論采用何種方案,都需要將用戶請求路由到正確的 Redis 哈希表??紤]到后期維護(hù)的可用性,建議采用一個獨立的中間件來擔(dān)任此角色。我們可以稱此中間件為“Redis過濾器”。

在Redis過濾器中,將數(shù)據(jù)庫的鍵(key)映射為租戶標(biāo)識符(通常為GUID),就可以在Redis哈希表中實現(xiàn)完全的數(shù)據(jù)隔離。在每次請求之前,過濾器都需要查詢到相應(yīng)租戶的標(biāo)識符,并將其作為Redis哈希表的前綴,在查詢或?qū)懭霐?shù)據(jù)庫時自動添加到所請求的鍵中。由于這個過濾器是在數(shù)據(jù)庫請求之前攔截的,所以用戶無法越過這一層進(jìn)行訪問。

這里提供一個簡單的Python代碼片段來顯示這個過程:

“`python

import redis

import threading

class RedisFilterMiddleware():

def __init__(self, app):

self.app = app

self.redis_client = redis.Redis(host=’localhost’)

def __call__(self, environ, start_response):

tenant_id = self.__get_tenant_id(environ)

with self.redis_client.pipeline() as pipe:

pipe.hget(‘tenant_map’, tenant_id)

mappings, _ = pipe.execute()

environ[‘tenant_id’] = tenant_id

environ[‘mappings’] = mappings

return self.app(environ, start_response)

def __get_tenant_id(self, environ):

return environ.get(‘HTTP_X_TENANT_ID’, None)

在上面的代碼中,我們創(chuàng)建了一個中間件類,其中在init函數(shù)中初始化了Redis客戶端;在_\_call\_\_函數(shù)中獲取租戶ID,查詢租戶與哈希表的映射表,并將其添加到請求的環(huán)境變量中。
現(xiàn)在我們需要實現(xiàn)一個類來支持?jǐn)?shù)據(jù)隔離,并將其映射到Redis哈希表中。這個類必須有相應(yīng)的接口類,這樣才能在過濾器中使用。 在Redis數(shù)據(jù)庫中,哈希表優(yōu)秀的方面之一是其完全支持分段式表格。在此例中,每個租戶對應(yīng)一個單獨的哈希表。這些哈希表的名稱是基于租戶ID生成的,并且所有表都被存儲在“租戶數(shù)據(jù)庫”之內(nèi),以保持不同租戶間的數(shù)據(jù)隔離。

在Python中,我們可以使用如下代碼實現(xiàn):

```python
class RedisTable(object):
def __init__(self, redis_client, tenant_id):
self.redis_client = redis_client
self.table_name = f'table_{tenant_id}'

def get_key(self, key):
return f'{self.table_name}:{key}'

def __getitem__(self, key):
return self.redis_client.get(self.get_key(key))

def __setitem__(self, key, value):
return self.redis_client.set(self.get_key(key), value)

在上面的代碼中,我們創(chuàng)建了一個Python類,名為RedisTable。該類保存了Redis客戶端對象和一個table_name,用來作為Redis哈希表的前綴。然后我們創(chuàng)建了一個get_key函數(shù),用來返回一個合適的URL,以便在Redis中查找對應(yīng)鍵值;同時,還需要 __getitem__ 和 __setitem__ 函數(shù),以便將查詢和寫入操作轉(zhuǎn)換為Redis哈希表。

接下來,在mn函數(shù)中編寫以下代碼:

“`python

app = flask.Flask(__name__)

@app.route(‘/action/create’, methods=[‘POST’])

def create():

table = RedisTable(redis.Redis(host=’localhost’), request.environ[‘tenant_id’])

table[request.form[‘key’]] = request.form[‘value’]

return ‘Ok’, 200

@app.route(‘/action/get’, methods=[‘GET’])

def get():

table = RedisTable(redis.Redis(host=’localhost’), request.environ[‘tenant_id’])

value = table[request.args[‘key’]]

return json.dumps(value), 200

if __name__ == ‘__mn__’:

app.wsgi_app = RedisFilterMiddleware(app.wsgi_app)

app.run()


在上面的代碼中,我們使用Flask來創(chuàng)建一個簡單的Web應(yīng)用,其中包含兩個路由。 /action/create負(fù)責(zé)將添加值到Redis哈希表, /action/get 負(fù)責(zé)查詢Redis哈希表,并返回該值。在兩個路由中,我們都使用了RedisTable類來完成對Redis哈希表的操作,并使用tenant_id來實現(xiàn)數(shù)據(jù)隔離。

在Redis客戶端中,我們需要設(shè)置一個名為“tenant_map”的哈希表,用以存儲哈希表的映射關(guān)系。當(dāng)我們需要為新的租戶創(chuàng)建一個哈希表時,只需將其ID添加到此哈希表中即可:

redis-cli

> hset tenant_map 004 ridis_004

OK


在這個例子中,我們創(chuàng)建了名為004的租戶,并將其哈希表命名為ridis_004。這個命名方式可以為我們在Redis中清晰地找到相應(yīng)租戶的哈希表。

結(jié)論

在這篇文章中,我們介紹了如何使用Redis來實現(xiàn)租戶自動過濾功能。我們使用了一個中間件來攔截所有的數(shù)據(jù)庫請求,并通過查詢租戶ID的方式將數(shù)據(jù)隔離開來。我們還使用Redis哈希表來實現(xiàn)完全數(shù)據(jù)隔離,并將租戶ID作為哈希表的前綴。通過這種方式,每個租戶都能夠獨立地使用數(shù)據(jù)庫,而不必?fù)?dān)心數(shù)據(jù)泄露或誤刪。

創(chuàng)新互聯(lián)【028-86922220】值得信賴的成都網(wǎng)站建設(shè)公司。多年持續(xù)為眾多企業(yè)提供成都網(wǎng)站建設(shè),成都品牌網(wǎng)站設(shè)計,成都高端網(wǎng)站制作開發(fā),SEO優(yōu)化排名推廣服務(wù),全網(wǎng)營銷讓企業(yè)網(wǎng)站產(chǎn)生價值。


名稱欄目:Redis實現(xiàn)租戶自動過濾功能(redis租戶自動過濾)
轉(zhuǎn)載來源:http://www.dlmjj.cn/article/cdhscgh.html