全記憶體的redis用習慣了?那能突破記憶體限制類redis產品ssdb呢?

来源:http://www.cnblogs.com/huangxincheng/archive/2017/12/02/7955473.html
-Advertisement-
Play Games

首先說一下背景,在雙十一的時候,我們系統接受X寶的訂單推送,同事原先的實現方式是使用redis的List作為推送數據的承載,在非大促的場景下, 一切運行正常,記憶體占用大概3-4G,機器是16G記憶體。由於提前預計不足,在雙十一來臨的時候,訂單瞬時量達到了平時的10X倍,記憶體非常吃緊,情況算 是非常緊急 ...


 

           首先說一下背景,在雙十一的時候,我們系統接受X寶的訂單推送,同事原先的實現方式是使用redis的List作為推送數據的承載,在非大促的場景下,

一切運行正常,記憶體占用大概3-4G,機器是16G記憶體。由於提前預計不足,在雙十一來臨的時候,訂單瞬時量達到了平時的10X倍,記憶體非常吃緊,情況算

是非常緊急了,採取的臨時解決方案就是再開一個redis,將程式中的redis地址指向這台新的,重啟一下程式,把數據暫時引導過去。

 

一:分析

         redis確實是一個好東西,一個如此強大的記憶體數據結構伺服器,全記憶體存儲,有些場景,恰恰你會死在全記憶體上,而且相對ssd硬碟來說,記憶體還是

太小了。記憶體很便宜,但是記憶體和ssd比起來很貴,況且有些場景你可能根本不需要使用全記憶體,使用硬碟也許會更能幫助我們節省成本,你可能會說,現

在業界標準已經差不多是kafka了,有時候我們還需要redis裡面的hash,也就是說我現在需要kafka + redis 的一個綜合體的產品,這就是本篇和大家說到的

ssdb,當然ssdb和kafka還是不能相提並論的哈,畢竟我是在選擇一個輕量級的解決方案。

 

二:ssdb說明

        ssdb是一個使用leveldb做為底層存儲的nosql資料庫,好處就是可以利用redis中的所有數據結構,而且數據還是基於硬碟的,所以可以存儲的數據比

redis大的不要太多,官方文檔的說法就是用來替代redis的,而且讓你眼前一亮的就是,它對.net還是比較友好的,一個很不錯的解決方案,不過成熟度不

如redis,大家前期可以當緩存用用,或者存儲一些非關鍵性數據,節省節省記憶體空間。目前我在項目中用起來了。

1. 使用hash來存customerID 和customerNick的映射關係。

2. 使用List來承載X寶的訂單推送。

 

三:快速搭建

      官方下載:http://ssdb.io, 有一點要註意的就是官方文檔明確表示,CentOS7的文件句柄設置問題,建議不要在centos7上進行搭建,具體的說明

可以看看這個:http://ssdb.io/docs/zh_cn/config.html ,大家可以用用centos6.5或者ubantu吧。

 

1. wget下載和unzip解壓。

[root@localhost apps]# wget https://codeload.github.com/ideawu/ssdb/zip/master

--2017-12-02 03:02:18-- https://codeload.github.com/ideawu/ssdb/zip/master

Resolving codeload.github.com (codeload.github.com)... 192.30.255.120, 192.30.255.121

Connecting to codeload.github.com (codeload.github.com)|192.30.255.120|:443... connected.

HTTP request sent, awaiting response... 200 OK

Length: 1595060 (1.5M) [application/zip]

Saving to: ‘master’

 
100%[==================================================================>] 1,595,060 69.3KB/s in 36s

 
2017-12-02 03:02:57 (43.7 KB/s) - ‘master’ saved [1595060/1595060]

[root@localhost apps]#unzip master

[root@localhost apps]# ls

master ssdb-master

 

 2. 使用make對C++代碼進行編譯

[root@localhost ssdb-master]# make

 

3. 編譯完之後,一泡尿的功夫,這個ssdb-server可執行文件就出來了。

[root@localhost ssdb-master]# ls
api              ChangeLog  Dockerfile  Makefile   ssdb.conf        tools      version
build_config.mk  data       docs        README.md  ssdb-server      var
build.sh         deps       LICENSE     src        ssdb_slave.conf  var_slave

 

4.然後我們把ssdb.conf配置一下

    這裡面有三個配置要註意下:

<1> work_dir: 存放data和meta的目錄,可以在ssdb-master文件夾下mkdir data文件夾。

<2> ip:設為0.0.0.0,讓所有的主機都能夠連接上來。

<3> port  8888 :這個是預設的ssdbserver埠號,大家可以看情況修改。

完整配置如下:

# ssdb-server config
# MUST indent by TAB!

# absolute path, or relative to path of this file, directory must exists
work_dir = /usr/apps/ssdb-master/data
pidfile = ./var/ssdb.pid

server:
        ip: 0.0.0.0
        port: 8888
        # bind to public ip
        #ip: 0.0.0.0
        # format: allow|deny: all|ip_prefix
        # multiple allows or denys is supported
        #deny: all
        #allow: 127.0.0.1
        #allow: 192.168
        # auth password must be at least 32 characters
        #auth: very-strong-password
        #readonly: yes
        # in ms, to log slowlog with WARN level
        #slowlog_timeout: 5

replication:
        binlog: yes
        # Limit sync speed to *MB/s, -1: no limit
        sync_speed: -1
        slaveof:
                # to identify a master even if it moved(ip, port changed)
                # if set to empty or not defined, ip:port will be used.
                #id: svc_2
                # sync|mirror, default is sync
                #type: sync
                #host: localhost
                #port: 8889

logger:
        level: debug
        output: log.txt
        rotate:
                size: 1000000000

leveldb:
        # in MB
        cache_size: 500
        # in MB
        write_buffer_size: 64
        # in MB/s
        compaction_speed: 1000
        # yes|no
        compression: yes

 

 5. 啟動ssdb-server,指定一下配置文件,採取靜默啟動

[root@localhost ssdb-master]# ./ssdb-server ./ssdb.conf -d
ssdb-server 1.9.6
Copyright (c) 2012-2015 ssdb.io

[root@localhost ssdb-master]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1869/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1115/sshd           
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1117/cupsd          
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      12994/./ssdb-server 
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1627/master         
tcp6       0      0 :::22                   :::*                    LISTEN      1115/sshd           
tcp6       0      0 ::1:631                 :::*                    LISTEN      1117/cupsd          
tcp6       0      0 ::1:25                  :::*                    LISTEN      1627/master         
[root@localhost ssdb-master]# 

 

  可以看到,上面的8888埠已經成功開啟,沒毛病。

 

四:使用C#客戶端

        在http://ssdb.io/docs/zh_cn/clients.html上面列出了各個語言的客戶端SDK,這裡我就選擇C#的SDK:https://github.com/ssdb/dotnetssdb

 

      可以看到,裡面沒啥東西,就三個破文件,裡面並沒有實現ssdb應該有的所有功能,所以大家可以根據自己的需要進行封裝,連接池啥的都要

你自己根據需要實現吧,好了,接下來我用hash簡單的測試一下:

    class Program
    {
        static void Main(string[] args)
        {
            Client client = new Client("192.168.23.153", 8888);

            client.hset("customerHash", "customerID", "1000");

            string val = string.Empty;

            client.hget("customerHash", "customerID", out val);

            Debug.WriteLine("customerID= " + val);

            client.close();
        }
    }

 

    好了,本篇先就說到這裡,希望對你有幫助。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • s中的this總是讓人,是js眾所周知的坑之一。 總結一下,this的坑分為5種。 1.全局代碼中的this。 alert(this);//window 全局範圍內this將會全局,在瀏覽器window 2.作為單純函數調用 這裡this指向全局對象,就是window。在嚴格模式中,則undefie ...
  • 一般認為:嚴格模式下this不允許指向全局對象。 如:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html 需要說明的是:本身指向全局的this是沒有問題的。 示例代碼: 控制台輸出為window對象(全局對象): 嚴格 ...
  • 查找基本分類如下: 1. 線性表的查找 順序查找 折半查找 分塊查找 2. 樹表的查找 二叉排序樹 平衡二叉樹 B樹 B+樹 3. 散列表的查找 今天介紹 二叉排序樹 。 二叉排序樹 ( Binary Sort Tree ) 又稱為 二叉查找樹 ,它是一種對排序和查找都很有用的特殊二叉樹。 1. 二 ...
  • 常用無返回值的事件 onabort圖像載入被中斷 onblur 元素失去焦點 onfocus 元素獲得焦點 onreset 重置按鈕被點擊 onselect 文本被選中 onsubmit 確認按鈕被點擊 onchange 域的內用被改變 onclick 當用戶點擊某個對象時調用的事件 ondblcl ...
  • 今天在寫代碼的時候,我犯了一個很low的錯誤,廢話不多說,直接上代碼: 大家看到之後,第一反應肯定會認為是個語法錯誤,可是自己仔細想想,這是什麼原因?似乎還不能解釋清楚,好奇寶寶模式立即啟動,經過查閱相關資料得到了答案,接下來我們一起來探討下其中的原理。 疑惑解答 大家有沒有考慮過為什麼上面這種寫法 ...
  • 使用XHR發送一個json請求一般是這樣: 使用fetch的實例: Fetch參數 fetch(input [,init]) input(必須) 定義要獲取的資源(請求地址) init(可選) 參數 | 描述 method 請求使用的方法,如GET、POST headers http請求頭(user ...
  • js導出Excel的方法 利用html的table表格的格式書寫想要的excel格式 獲取table的內容並組裝成一個xls格式的字元串 利用Blob對象生成一個xls格式的文件 利用a標簽的download屬性創建文件名,並下載到本地 例子: "js導出Excel" table表格內容 先寫一個正 ...
  • <form action="" method="get/post"> 表單<form></form>的提交方式有兩種:post,get post 方式 指交互信息 放入到請求體裡面 get 方式 指交互信息 放入到請求頭裡面 區別: 1.發送請求的空間大小不一致: get請求存放的數據不能超過500 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...