亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

利用Redis實現SQL伸縮的方法

2020-03-17 12:41:47
字體:
來源:轉載
供稿:網友
本文主要介紹了如何通過鎖和時間序列等方面來提升傳統數據庫的性能等方法,利用Redis實現SQL伸縮,供有需要的朋友們參考。
 

這篇文章主要介紹了利用Redis實現SQL伸縮的方法,包括講到了鎖和時間序列等方面來提升傳統數據庫的性能,需要的朋友可以參考下。

緩解行競爭

我們在Sentry開發的早起采用的是sentry.buffers。 這是一個簡單的系統,它允許我們以簡單的Last Write Wins策略來實現非常有效的緩沖計數器。 重要的是,我們借助它完全消除了任何形式的耐久性 (這是Sentry工作的一個非常可接受的方式)。

操作非常簡單,每當一個更新進來我們就做如下幾步:

  • 創建一個綁定到傳入實體的哈希鍵(hash key)
  • 使用HINCRBY使計數器值增加
  • HSET所有的LWW數據(比如 "最后一次見到的")
  • 用當前時間戳ZADD哈希鍵(hash key)到一個"掛起" set

現在每一個時間刻度 (在Sentry中為10秒鐘) 我們要轉儲(dump)這些緩沖區并且扇出寫道(fanout the writes)。 看起來像下面這樣:

  • 使用ZRANGE獲取所有的key
  • 為每一個掛起的key發起一個作業到RabbitMQ

現在RabbitMQ作業將能夠讀取和清除哈希表,和“懸而未決”更新已經彈出了一套。有幾件事情需要注意:

  • 在下面我們想要只彈出一個設置的數量的例子中我們將使用一組排序(舉例來說我們需要那100個舊集合)。
  • 假使我們為了處理一個鍵值來結束多道排序的作業,這個人會得到no-oped由于另一個已經存在的處理和清空哈希的過程。
  • 該系統能夠在許多Redis節點上不斷擴展下去僅僅是通過在每個節點上安置把一個'懸置'主鍵來實現。

我們有了這個處理問題的模型之后,能夠確保“大部分情況下”每次在SQL中只有一行能夠被馬上更新,而這樣的處理方式減輕了我們能夠預見到的鎖問題??紤]到將會處理一個突然產生且所有最終組合在一起進入同一個計數器的數據的場景,這種策略對Sentry用處很多。

速度限制

出于哨兵的局限性,我們必須終結持續的拒絕服務攻擊。我們通過限制連接速度來應對這種問題,其中一項是通過Redis支持的。這無疑是在sentry.quotas范圍內更直接的實現。

它的邏輯相當直接,如同下面展示的那般:

def incr_and_check_limit(user_id, limit):  key = '{user_id}:{epoch}'.format(user_id, int(time() / 60))    pipe = redis.pipeline()  pipe.incr(key)  pipe.expire(key, 60)  current_rate, _ = pipe.execute()    return int(current_rate) > limit 

我們所闡明的限制速率的方法是 Redis在高速緩存服務上最基本的功能之一:增加空的鍵字。在高速緩存服務中實現同樣的行為可能最終使用這種方法:

def incr_and_check_limit_memcache(user_id, limit):  key = '{user_id}:{epoch}'.format(user_id, int(time() / 60))    if cache.add(key, 0, 60):   return False    current_rate = cache.incr(key)    return current_rate > limit 

事實上我們最終采取這種策略可以使哨兵追蹤不同事件的短期數據。在這種情況下,我們通常對用戶數據進行排序以便可以在最短的時間內找到最活躍用戶的數據。

基本鎖

雖然Redis的是可用性不高,我們的用例鎖,使其成為工作的好工具。我們沒有使用這些在哨兵的核心了,但一個示例用例是,我們希望盡量減少并發性和簡單無操作的操作,如果事情似乎是已經在運行。這對于可能需要執行每隔一段時間類似cron任務非常有用,但不具備較強的協調。

在Redis的這樣使用SETNX操作是相當簡單的:

from contextlib import contextmanagerr = Redis()@contextmanagerdef lock(key, nowait=True):  while not r.setnx(key, '1'):   if nowait:    raise Locked('try again soon!')   sleep(0.01)    # limit lock time to 10 seconds  r.expire(key, 10)    # do something crazy  yield    # explicitly unlock  r.delete(key) 

而鎖()內的哨兵利用的memcached的,但絕對沒有理由我們不能在其切換到Redis。
時間序列數據

近來我們創造一個新的機制在Sentry(包含在sentry.tsdb中) 存儲時間序列數據。這是受RRD模型啟發,特別是Graphite。我們期望一個快速簡單的方式存儲短期(比如一個月)時間序列數,以便于處理高速寫入數據,特別是在極端情況下計算潛在的短期速率。盡管這是第一個模型,我們依舊期望在Redis存儲數據,它也是使用計數器的簡單范例。

在目前的模型中,我們使用單一的hash map來存儲全部時間序列數據。例如,這意味所有數據項在都將同一個哈希鍵擁有一個數據類型和1秒的生命周期。如下所示:

{    "<type enum>:<epoch>:<shard number>": {      "<id>": <count>    }} 

因此在這種狀況,我們需要追蹤事件的數目。事件類型映射到枚舉類型"1".該判斷的時間是1s,因此我們的處理時間需要以秒計。散列最終看起來是這樣的:

 {    "1:1399958363:0": {      "1": 53,      "2": 72,    }} 

一個可修改模型可能僅使用簡單的鍵并且僅在存儲區上增加一些增量寄存器。

"1:1399958363:0:1": 53 

我們選擇哈希映射模型基于以下兩個原因:

我們可以將所有的鍵設為一次性的(這也可能產生負面影響,但是目前為止是穩定的)

大幅壓縮鍵值,這是相當重要的處理

此外,離散的數字鍵允許我們在將虛擬的離散鍵值映射到固定數目的鍵值上,并在此分配單一存儲區(我們可以使用64,映射到32個物理結點上)

現在通過使用 Nydus和它的map()(依賴于一個工作區)(),數據查詢已經完成。這次操作的代碼是相當健壯的,但幸好它并不龐大。

def get_range(self, model, keys, start, end, rollup=None):  """ To get a range of data for group ID=[1, 2, 3]: Start and end are both inclusive. >>> now = timezone.now() >>> get_keys(tsdb.models.group, [1, 2, 3], >>>   start=now - timedelta(days=1), >>>   end=now) """  normalize_to_epoch = self.normalize_to_epoch  normalize_to_rollup = self.normalize_to_rollup  make_key = self.make_key    if rollup is None:   rollup = self.get_optimal_rollup(start, end)    results = []  timestamp = end  with self.conn.map() as conn:   while timestamp >= start:    real_epoch = normalize_to_epoch(timestamp, rollup)    norm_epoch = normalize_to_rollup(timestamp, rollup)      for key in keys:     model_key = self.get_model_key(key)     hash_key = make_key(model, norm_epoch, model_key)     results.append((real_epoch, key, conn.hget(hash_key, model_key)))      timestamp = timestamp - timedelta(seconds=rollup)    results_by_key = defaultdict(dict)  for epoch, key, count in results:   results_by_key[key][epoch] = int(count or 0)    for key, points in results_by_key.iteritems():   results_by_key[key] = sorted(points.items())  return dict(results_by_key) 

歸結如下:

  • 生成所必須的鍵。
  • 使用工作區,提取所有連接操作的最小結果集(Nydus負責這些)。
  • 給出結果,并且基于指定的時間間隔內和給定的鍵值將它們映射到當前的存儲區內。

以上就是如何利用Redis實現SQL伸縮的方法,希望對大家的學習有所幫助。



注:相關教程知識閱讀請移步到Redis頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97国产成人精品视频| 久久亚洲精品中文字幕冲田杏梨| 中文字幕v亚洲ⅴv天堂| 亚洲最大成人网色| 亚洲三级 欧美三级| 亚洲天堂成人在线视频| 亚洲区一区二区| 国产成人精品av| 亚洲人成网站在线播| 国产午夜精品全部视频在线播放| 亚洲最大av网| 国产精品对白刺激| 久久久久久高潮国产精品视| 日本午夜在线亚洲.国产| 97在线精品国自产拍中文| 国产精品老女人视频| 国产综合在线看| 伊人激情综合网| 精品成人乱色一区二区| 亚洲成在人线av| 亚洲欧美一区二区三区情侣bbw| 亚洲综合在线小说| 日韩电影免费观看中文字幕| 日韩精品视频中文在线观看| 国产91在线播放九色快色| 福利视频导航一区| 欧美亚洲成人免费| 日本免费一区二区三区视频观看| 欧美日韩国产色| 国产欧美一区二区三区久久| 午夜精品福利电影| 亚洲二区中文字幕| 国内精品久久久久久久久| 久久香蕉频线观| 18性欧美xxxⅹ性满足| 日韩精品在线免费观看视频| 一个色综合导航| 色狠狠av一区二区三区香蕉蜜桃| 国产一区二区三区欧美| 日韩亚洲精品电影| 性欧美xxxx视频在线观看| 久久精视频免费在线久久完整在线看| 97碰碰碰免费色视频| 日韩va亚洲va欧洲va国产| 91探花福利精品国产自产在线| 一本色道久久88精品综合| 97视频在线观看网址| 久久九九免费视频| 久久夜精品va视频免费观看| 国产成人+综合亚洲+天堂| 欧美中文在线字幕| 亚洲人成网站色ww在线| 色老头一区二区三区| 亚洲欧美制服另类日韩| 精品高清美女精品国产区| 欧美激情伊人电影| 色琪琪综合男人的天堂aⅴ视频| 久久夜色撩人精品| 久久久久久av| 97精品视频在线| 神马久久久久久| 欧美日韩电影在线观看| 色偷偷偷综合中文字幕;dd| 国产专区精品视频| 亚洲www永久成人夜色| 日韩在线视频国产| 久99九色视频在线观看| 九九精品在线播放| 日韩精品在线观看一区二区| 欧美一区二区三区精品电影| 亚洲天堂一区二区三区| 欧美亚洲在线观看| 精品久久久久久久久久国产| 日韩精品有码在线观看| 国产欧美日韩免费看aⅴ视频| 国产精品久久在线观看| 97久久精品国产| 亚洲欧美国产一本综合首页| 日本精品一区二区三区在线播放视频| 国产成人亚洲综合| 91免费人成网站在线观看18| 91精品国产沙发| 亚洲一区二区三区成人在线视频精品| 欧美亚洲视频在线看网址| 国产视频福利一区| 欧美一级成年大片在线观看| 国产精品va在线播放我和闺蜜| 亚洲男人天堂手机在线| 国产精品h片在线播放| 成人精品在线视频| 久久久久久久久久久网站| 隔壁老王国产在线精品| www高清在线视频日韩欧美| 欧美精品在线观看91| 91精品国产色综合久久不卡98口| 97香蕉超级碰碰久久免费的优势| 欧美日韩中文字幕在线视频| 激情久久av一区av二区av三区| 国产精品第1页| 精品一区电影国产| 欧美视频在线观看 亚洲欧| 日本中文字幕久久看| 91在线高清视频| 韩国三级电影久久久久久| 自拍亚洲一区欧美另类| 欧美壮男野外gaytube| 5252色成人免费视频| 欧美日韩中文字幕日韩欧美| 欧美精品激情视频| 国产成人自拍视频在线观看| 久久91精品国产| 另类美女黄大片| 高清欧美性猛交xxxx黑人猛交| 日韩天堂在线视频| 欧美精品情趣视频| 国产精品私拍pans大尺度在线| 国产欧美精品va在线观看| 国产精品日韩精品| 日韩视频中文字幕| 国产精品久久久久久久久久三级| 国产在线一区二区三区| 成人免费网站在线观看| 久久精品视频va| 91系列在线观看| 中文字幕亚洲一区二区三区五十路| 国产日韩精品入口| 海角国产乱辈乱精品视频| 国产精品劲爆视频| 国产视频自拍一区| 日韩成人av在线播放| 中文字幕少妇一区二区三区| 亚洲福利视频专区| 国产欧美亚洲视频| 国产一区二区美女视频| 国产中文字幕日韩| 美乳少妇欧美精品| 成人免费黄色网| 国产成人精品视频| 91嫩草在线视频| 久操成人在线视频| 久久久久久久香蕉网| 2021国产精品视频| 91久久夜色精品国产网站| 狠狠色狠色综合曰曰| 96pao国产成视频永久免费| 欧美性xxxx极品hd欧美风情| 欧美高清激情视频| 国产97在线|亚洲| 国产精品成人观看视频国产奇米| 亚洲九九九在线观看| 午夜美女久久久久爽久久| 亚洲综合大片69999| 久久免费精品视频| 成人h片在线播放免费网站| 日韩电影中文字幕av| 日韩中文字在线| 亚洲国产成人精品久久久国产成人一区| 欧美成人午夜影院| 午夜精品久久久99热福利| 精品国偷自产在线视频| 亚洲欧美日韩中文视频| 人妖精品videosex性欧美| 亚洲国产日韩欧美在线动漫| 精品无人区太爽高潮在线播放|