導航:首頁 > 源碼編譯 > redis源碼調試

redis源碼調試

發布時間:2022-02-13 05:17:34

1. redis 怎麼啟用多埠

我來回答通常sniffer所要關心的內容可以分成這樣幾類:1、口令我想這是絕大多數非法使用sniffer的理由,sniffer可以記錄到明文傳送的userid和passwd.就算你在網路傳送過程中使用了加密的數據,sniffer記錄的數據一樣有可能使入侵者在家裡邊吃肉串邊想法算出你的演算法。2、金融帳號許多用戶很放心在網上使用自己的信用卡或現金帳號,然而sniffer可以很輕松截獲在網上傳送的用戶姓名、口令、信用卡號碼、截止日期、帳號和pin.3、偷窺機密或敏感的信息數據通過攔截數據包,入侵者可以很方便記錄別人之間敏感的信息傳送,或者乾脆攔截整個的email會話過程。4、窺探低級的協議信息。這是很可怕的事,我認為,通過對底層的信息協議記錄,比如記錄兩台主機之間的網路介面地址、遠程網路介面ip地址、ip路由信息和tcp連接的位元組順序號碼等。這些信息由非法入侵的人掌握後將對網路安全構成極大的危害,通常有人用sniffer收集這些信息只有一個原因:他正在進行一次欺詐,(通常的ip地址欺詐就要求你准確插入tcp連接的位元組順序號,這將在以後整理的文章中指出)如果某人很關心這個問題,那麼sniffer對他來說只是前奏,今後的問題要大得多。(對於高級的hacker而言,我想這是使用sniffer的唯一理由吧)二.sniffer的工作環境snifffer就是能夠捕獲網路報文的設備。嗅探器的正當用處在於分析網路的流量,以便找出所關心的網路中潛在的問題。例如,假設網路的某一段運行得不是很好,報文的發送比較慢,而我們又不知道問題出在什麼地方,此時就可以用嗅探器來作出精確的問題判斷。嗅探器在功能和設計方面有很多不同。有些只能分析一種協議,而另一些可能能夠分析幾百種協議。一般情況下,大多數的嗅探器至少能夠分析下面的協議:1.標准乙太網2.TCP/IP3.IPX4.DECNet嗅探器通常是軟硬體的結合。專用的嗅探器價格非常昂貴。另一方面,免費的嗅探器雖然不需要花什麼錢,但得不到什麼支持。嗅探器與一般的鍵盤捕獲程序不同。鍵盤捕獲程序捕獲在終端上輸入的鍵值,而嗅探器則捕獲真實的網路報文。嗅探器通過將其置身於網路介面來達到這個目的——例如將乙太網卡設置成雜收模式。(為了理解雜收模式是怎麼回事,先解釋區域網是怎麼工作的)。數據在網路上是以很小的稱為幀(Ftame)的單位傳輸的幀由好幾部分組成,不同的部分執行不同的功能。(例如,乙太網的前12個位元組存放的是源和目的的地址,這些位告訴網路:數據的來源和去處。乙太網幀的其他部分存放實際的用戶數據、TCP/IP的報文頭或IPX報文頭等等)。幀通過特定的稱為網路驅動程序的軟體進行成型,然後通過網卡發送到網線上。通過網線到達它們的目的機器,在目的機器的一端執行相反的過程。接收端機器的乙太網卡捕獲到這些幀,並告訴操作系統幀的到達,然後對其進行存儲。就是在這個傳輸和接收的過程中,嗅探器會造成安全方面的問題。每一個在LAN上的工作站都有其硬體地址。這些地址唯一地表示著網路上的機器(這一點於Internet地址系統比較相似)。當用戶發送一個報文時,這些報文就會發送到LAN上所有可用的機器。在一般情況下,網路上所有的機器都可以「聽」到通過的流量,但對不屬於自己的報文則不予響應(換句話說,工作站A不會捕獲屬於工作站B的數據,而是簡單的忽略這些數據)。如果某在工作站的網路介面處於雜收模式,那麼它就可以捕獲網路上所有的報文和幀,如果一個工作站被配置成這樣的方式,它(包括其軟體)就是一個嗅探器。嗅探器可能造成的危害:1.嗅探器能夠捕獲口令2.能夠捕獲專用的或者機密的信息3.可以用來危害網路鄰居的安全,或者用來獲取更高級別的訪問許可權事實上,如果你在網路上存在非授權的嗅探器就以為著你的系統已經暴露在別人面前了。(大家可以試試天行2的嗅探功能)一般我們只嗅探每個報文的前200到300個位元組。用戶名和口令都包含在這一部分中,這是我們關心的真正部分。工人,也可以嗅探給定介面上的所有報文,如果有足夠的空間進行存儲,有足夠的那裡進行處理的話,將會發現另一些非常有趣的東西……簡單的放置一個嗅探器賓將其放到隨便什麼地方將不會起到什麼作用。將嗅探器放置於被攻擊機器或網路附近,這樣將捕獲到很多口令,還有一個比較好的方法就是放在網關上。如果這樣的話就能捕獲網路和其他網路進行身份鑒別的過程。這樣的方式將成倍地增加我們能夠攻擊的范圍。三.誰會使用sniffers可能誰都回知道誰會使用sniffer,但是並不是每個使用它的人都是網路高手,因為現在有很多的sniffer都成了傻瓜似的了,前段時間用的最多的不外乎oicqsniffer。我想那些喜歡查好友ip的朋友都應該記得它吧。呵呵,我都使用過它,現在當然不用了啊!當然系統管理員使用sniffer來分析網路信息交通並且找出網路上何處發生問題。一個安全管理員可以同時用多種sniffer,將它們放置在網路的各處,形成一個入侵警報系統。對於系統管理員來說sniffer是一個非常好的工具,但是它同樣是一個經常被黑客使用的工具.駭客安裝sniffer以獲得用戶名和賬號,信用卡號碼,個人信息,和其他的信息可以導致對你或是你的公司的極大危害如果向壞的方面發展。當它們得到這些信息後,駭客將使用密碼來進攻其他的internet站點甚至倒賣信用卡號碼。三.sniffer是如何在網路上實施的談這個問題之前還應該先說一下Ethernet的通訊。通常在同一個網段的所有網路介面都有訪問在媒體上傳輸的所有數據的能力,而每個網路介面都還應該有一個硬體地址,該硬體地址不同於網路中存在的其它網路介面的硬體地址,同時,每個網路至少還要一個廣播地址。在正常情況下,一個合法的網路介面應該只響應這樣的兩種數據幀:1幀的目標區域具有和本地網路介面相匹配的硬體地址。2幀的目標區域具有「廣播地址」。在接受到上面兩種情況的數據包時,網卡通過cpu產生一個硬體中斷。該中斷能引起操作系統注意,然後將幀中所包含的數據傳送給系統進一步處理。而sniffer就是一種能將本地網卡狀態設成雜亂模式(promiscuousMode)的軟體。當網卡處於雜亂模式時,該網卡具備「廣播地址」,它對所有遇到的每一個幀都產生一個硬體中斷以提醒操作系統處理每一個報文包。(絕大多數的網卡具備設置成雜亂模式的能力。可見,sniffer工作在網路環境中的底層,它會攔截所有的正在網路上傳送的數據。通過相應的軟體處理,可以實時分析這些數據的內容,進而分析所處的網路狀態和整體布局。值得注意的是:sniffer是極其安靜的,它是一種消極的安全攻擊。四.哪裡可以得到sniffer我們講的sniffer,主要是在unix系統下運用的,至於那些oicqsniffer就不在我們討論的范圍。Sniffer是黑客們最常用的入侵手段之一。你可以在經過允許的網路中運行sniffer,了解它是如何有效地危及本地機器安全。Sniffer可以是硬體,也可以是軟體。現在品種最多,應用最廣的是軟體Sniffer,絕大多數黑客們用的也是軟體Sniffer。以下是一些也被廣泛用於調試網路故障的sniffer工具:(一).商用sniffer:1.NetworkGeneral.NetworkGeneral開發了多種產品。最重要的是ExpertSniffer,它不僅僅可以sniff,還能夠通過高性能的專門系統發送/接收數據包,幫助診斷故障。還有一個增強產品"DistrbutedSnifferSystem"可以將UNIX工作站作為sniffer控制台,而將snifferagents(代理)分布到遠程主機上。2.Microsoft'sNetMonitor對於某些商業站點,可能同時需要運行多種協議--NetBEUI、IPX/SPX、TCP/IP、802.3和SNA等。這時很難找到一種sniffer幫助解決網路問題,因為許多sniffer往往將某些正確的協議數據包當成了錯誤數據包。Microsoft的NetMonitor(以前叫Bloodhound)可以解決這個難題。它能夠正確區分諸如Netware控制數據包、NTNetBios名字服務廣播等獨特的數據包。(etherfind只會將這些數據包標識為類型0000的廣播數據包。)這個工具運行在MSWindows平台上。它甚至能夠按MAC地址(或主機名)進行網路統計和會話信息監視。只需簡單地單擊某個會話即可獲得tcpmp標準的輸出。過濾器設置也是最為簡單的,只要在一個對話框中單擊需要監視的主機即可。(二).免費軟體sniffer1.Sniffit由LawrenceBerkeley實驗室開發,運行於Solaris、SGI和linux等平台。可以選擇源、目標地址或地址集合,還可以選擇監聽的埠、協議和網路介面等。這個SNIFFER默認狀態下只接受最先的400個位元組的信息包,這對於一次登陸會話進程剛剛好。2.SNORT:這個SNIFFER有很多選項供你使用並可移植性強,可以記錄一些連接信息,用來跟蹤一些網路活動。3.TCPDUMP:這個SNIFFER很有名,linux,FREEBSD還搭帶在系統上,是一個被很多UNIX高手認為是一個專業的網路管理工具,記得以前TsutomuShimomura(應該叫下村侵吧)就是使用他自己修改過的TCPDUMP版本來記錄了KEVINMITNICK攻擊他系統的記錄,後來就配合FBI抓住了KEVINMITNICK,後來他寫了一文:使用這些LOG記錄描述了那次的攻擊,((四).Linux下的sniffer工具Linux下的sniffer工具,我推薦Tcpmp。[1].tcpmp的安裝在linux下tcpmp的安裝十分簡單,一般由兩種安裝方式。一種是以rpm包的形式來進行安裝。另外一種是以源程序的形式安裝。1.rpm包的形式安裝這種形式的安裝是最簡單的安裝方法,rpm包是將軟體編譯後打包成二進制的格式,通過rpm命令可以直接安裝,不需要修改任何東西。以超級用戶登錄,使用命令如下:#rpm-ivhtcpmp-3_4a5.rpm這樣tcpmp就順利地安裝到你的linux系統中。怎麼樣,很簡單吧。2.源程序的安裝既然rpm包的安裝很簡單,為什麼還要採用比較復雜的源程序安裝呢其實,linux一個最大的誘人之處就是在她上面有很多軟體是提供源程序的,人們可以修改源程序來滿足自己的特殊的需要。所以我特別建議朋友們都採取這種源程序的安裝方法。·第一步取得源程序在源程序的安裝方式中,我們首先要取得tcpmp的源程序分發包,這種分發包有兩種形式,一種是tar壓縮包(tcpmp-3_4a5.tar.Z),另一種是rpm的分發包(tcpmp-3_4a5.src.rpm)。這兩種形式的內容都是一樣的,不同的僅僅是壓縮的方式.tar的壓縮包可以使用如下命令解開:#tarxvfztcpmp-3_4a5.tar.Zrpm的包可以使用如下命令安裝:#rpm-ivhtcpmp-3_4a5.src.rpm這樣就把tcpmp的源代碼解壓到/usr/src/redhat/SOURCES目錄下.·第二步做好編譯源程序前的准備活動在編譯源程序之前,最好已經確定庫文件libpcap已經安裝完畢,這個庫文件是tcpmp軟體所需的庫文件。同樣,你同時還要有一個標準的c語言編譯器。在linux下標準的c語言編譯器一般是gcc。在tcpmp的源程序目錄中。有一個文件是Makefile.in,configure命令就是從Makefile.in文件中自動產生Makefile文件。在Makefile.in文件中,可以根據系統的配置來修改BINDEST和MANDEST這兩個宏定義,預設值是BINDEST=@sbindir@MANDEST=@mandir@第一個宏值表明安裝tcpmp的二進制文件的路徑名,第二個表明tcpmp的man幫助頁的路徑名,你可以修改它們來滿足系統的需求。·第三步編譯源程序使用源程序目錄中的configure腳本,它從系統中讀出各種所需的屬性。並且根據Makefile.in文件自動生成Makefile文件,以便編譯使用.make命令則根據Makefile文件中的規則編譯tcpmp的源程序。使用makeinstall命令安裝編譯好的tcpmp的二進制文件。總結一下就是:#tarxvfztcpmp-3_4a5.tar.Z#viMakefile.in#./configure#make#makeinstall[2].Tcpmp的使用tcpmp採用命令行方式,它的命令格式為:tcpmp[-adeflnNOpqStvx][-c數量][-F文件名][-i網路介面][-r文件名][-ssnaplen][-T類型][-w文件名][表達式]1.tcpmp的選項介紹-a將網路地址和廣播地址轉變成名字;-d將匹配信息包的代碼以人們能夠理解的匯編格式給出;-dd將匹配信息包的代碼以c語言程序段的格式給出;-ddd將匹配信息包的代碼以十進制的形式給出;-e在輸出行列印出數據鏈路層的頭部信息;-f將外部的Internet地址以數字的形式列印出來;-l使標准輸出變為緩沖行形式;-n不把網路地址轉換成名字;-t在輸出的每一行不列印時間戳;-v輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息;-vv輸出詳細的報文信息;-c在收到指定的包的數目後,tcpmp就會停止;-F從指定的文件中讀取表達式,忽略其它的表達式;-i指定監聽的網路介面;-r從指定的文件中讀取包(這些包一般通過-w選項產生);-w直接將包寫入文件中,並不分析和列印出來;-T將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc(遠程過程調用)和snmp(簡單網路管理協議;)2.tcpmp的表達式介紹表達式是一個正則表達式,tcpmp利用它作為過濾報文的條件,如果一個報文滿足表達式的條件,則這個報文將會被捕獲。如果沒有給出任何條件,則網路上所有的信息包將會被截獲。在表達式中一般如下幾種類型的關鍵字,一種是關於類型的關鍵字,主要包括host,net,port,例如host210.27.48.2,指明210.27.48.2是一台主機,net202.0.0.0指明202.0.0.0是一個網路地址,port23指明埠號是23。如果沒有指定類型,預設的類型是host.第二種是確定傳輸方向的關鍵字,主要包括src,dst,dstorsrc,dstandsrc,這些關鍵字指明了傳輸的方向。舉例說明,src210.27.48.2,指明ip包中源地址是210.27.48.2,dstnet202.0.0.0指明目的網路地址是202.0.0.0。如果沒有指明方向關鍵字,則預設是srcordst關鍵字。第三種是協議的關鍵字,主要包括fddi,ip,arp,rarp,tcp,udp等類型。Fddi指明是在FDDI(分布式光纖數據介面網路)上的特定的網路協議,實際上它是"ether"的別名,fddi和ether具有類似的源地址和目的地址,所以可以將fddi協議包當作ether的包進行處理和分析。其他的幾個關鍵字就是指明了監聽的包的協議內容。如果沒有指定任何協議,則tcpmp將會監聽所有協議的信息包。除了這三種類型的關鍵字之外,其他重要的關鍵字如下:gateway,broadcast,less,greater,還有三種邏輯運算,取非運算是'not''!',與運算是'and','&&';或運算是'or','';這些關鍵字可以組合起來構成強大的組合條件來滿足人們的需要,下面舉幾個例子來說明。(1)想要截獲所有210.27.48.1的主機收到的和發出的所有的數據包:#tcpmphost210.27.48.1(2)想要截獲主機210.27.48.1和主機210.27.48.2或210.27.48.3的通信,使用命令:(在命令行中適用括弧時,一定要#tcpmphost210.27.48.1and\(210.27.48.2or210.27.48.3\)(3)如果想要獲取主機210.27.48.1除了和主機210.27.48.2之外所有主機通信的ip包,使用命令:#tcpmpiphost210.27.48.1and!210.27.48.2(4)如果想要獲取主機210.27.48.1接收或發出的telnet包,使用如下命令:#tcpmptcpport23host210.27.48.13.tcpmp的輸出結果介紹下面我們介紹幾種典型的tcpmp命令的輸出信息(1)數據鏈路層頭信息使用命令#tcpmp--ehosticeice是一台裝有linux的主機,她的MAC地址是0:90:27:58:AF:1AH219是一台裝有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一條命令的輸出結果如下所示:21:50:12.847509eth08:0:20:79:5b:460:90:27:58:af:1aip60:h219.33357>ice.telnet0:0(0)ack22535win8760(DF)分析:21:50:12是顯示的時間,847509是ID號,eth0表示從網路介面設備發送數據包,8:0:20:79:5b:46是主機H219的MAC地址,它表明是從源地址H219發來的數據包.0:90:27:58:af:1a是主機ICE的MAC地址,表示該數據包的目的地址是ICE.ip是表明該數據包是IP數據包,60是數據包的長度,h219.33357>ice.telnet表明該數據包是從主機H219的33357埠發往主機ICE的TELNET(23)埠.ack22535表明對序列號是222535的包進行響應.win8760表明發送窗口的大小是8760.(2)ARP包的TCPDUMP輸出信息使用命令#tcpmparp得到的輸出結果是:22:32:42.802509eth0>arpwho-hasroutetellice(0:90:27:58:af:1a)22:32:42.802902eth0表明從主機發出該數據包,arp表明是ARP請求包,who-hasroutetellice表明是主機ICE請求主機ROUTE的MAC地址。0:90:27:58:af:1a是主機ICE的MAC地址。(3)TCP包的輸出信息用TCPDUMP捕獲的TCP包的一般輸出信息是:src>dst:flagsdata->dst:表明從源地址到目的地址,flags是TCP包中的標志信息,S是SYN標志,F(FIN),P(PUSH),R(RST)"."(沒有標記);data-seqno是數據包中的數據的順序號,ack是下次期望的順序號,window是接收緩存的窗口大小,urgent表明數據包中是否有緊急指針.Options是選項.(4)UDP包的輸出信息用TCPDUMP捕獲的UDP包的一般輸出信息是:route.port1>ice.port2:udplenthUDP十分簡單,上面的輸出行表明從主機ROUTE的port1埠發出的一個UDP數據包到主機ICE的port2埠,類型是UDP,包的長度是lenth上面,我就詳細介紹了TCPDUMP的安裝和使用,希望會對大家有所幫助。如果想要熟練運用TCPDUMP這個LINUX環境下的SNIFFER利器,還需要大家在實踐中總結經驗,充分發揮它的威力。(五).windows平台上的sniffer我推薦netxray和snifferpro軟體,想必大家都用過他們,不過我在這兒還要再簡單介紹一下他們。

2. redis什麼時候用哈希

假定我們有一個hashmap的邏輯結構,用戶編號的為15的人,name是dlf,school是x
當我們在redic-cli命令行下敲下 hset id:15 name dlf時
redis裡面都發生了什麼事情呢?


任何一個使用過redis的用戶,即使沒有看過redis的源碼,想一下這個過程,那麼肯定都包含下面這幾步
1 socket連接
2 redis-server收到命令信息
3 redis-server解析命令信息(找到對應的命令,及附帶的參數)
4 調用對應的命令
5 返回結果
當然在redis-cli發送命令之前,redis-server首先啟動,然後載入各種配置,初始化伺服器等等。


在這篇博客里,我們只介紹第四點,就是找到redis內部的命令後,並且也已經分析出了參數,如何調用的過程。


首先我們看一個時序圖(那個,我得聲明,我並沒有學習過時序圖的精確概念,下面的圖大概只能說明調用過程,如果繪制的某些部分不符合時序圖的規定,大家見諒哦)
換句話說,如果第一次執行hset user:id name zhangsan
dictadd會返回ok,然後跳出dictreplace

至於第一次調用hset userid:14 school x

與hset userid:14 name lisi

會怎麼樣,大家自己想吧




[java]view plain

  • [java]view plain


  • 閱讀全文

    3. redis怎麼解決高並發

    而Edith解決高並發需要按照相關的程序步驟說明來設定。

    4. windows怎麼調試redis源碼

    Redis對於Linux是官方支持的,安裝和使用沒有什麼好說的,普通使用按照官方指導,5分鍾以內就能搞定。詳情請參考:
    http://redis.io/download

    但有時候又想在windows下折騰下Redis,可以從redis下載頁面看到如下提示(在頁面中搜索 "windows"):

    [plain] view plain
    Win64 Unofficial The Redis project does not directly support Windows,
    however the Microsoft Open Tech group develops and maintains
    an Windows port targeting Win64.

    大意就是 Redis官方是不支持windows的,只是 Microsoft Open Tech group 在 GitHub上開發了一個Win64的版本,項目地址是:
    https://github.com/MSOpenTech/redis
    打開以後,可以直接使用瀏覽器下載,或者Git克隆。
    可以在項目主頁右邊找到 zip包下載地址: https://github.com/MSOpenTech/redis/archive/2.8.zip
    (注意: dist文件改變了下載地址: https://github.com/MSOpenTech/redis/releases )

    5. 如何用java獲取redis的info

    預備
    jedis-2.5.2
    commons-pool2-2.2.jar
    使用單連接
    此方式僅建議用於開發環境做調試用。
    // 創建連接
    String host = "192.168.56.102";
    int port = 6379;
    Jedis client = new Jedis(host, port);
    // 執行set指令
    String result = client.set("key-string", "Hello, Redis!");
    System.out.println( String.format("set指令執行結果:%s", result) );
    // 執行get指令
    String value = client.get("key-string");
    System.out.println( String.format("get指令執行結果:%s", value) );
    運行上述代碼,控制台輸出:
    set指令執行結果:OK
    get指令執行結果:Hello, Redis!
    使用連接池
    此方式適用於僅使用單個Redis實例的場景。
    // 生成連接池配置信息
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxIdle(10);
    config.setMaxTotal(30);
    config.setMaxWaitMillis(3*1000);

    // 在應用初始化的時候生成連接池
    JedisPool pool = new JedisPool(config, "192.168.56.102", 6379);

    // 在業務操作時,從連接池獲取連接
    Jedis client = pool.getResource();
    try {
    // 執行指令
    String result = client.set("key-string", "Hello, Redis!");
    System.out.println( String.format("set指令執行結果:%s", result) );
    String value = client.get("key-string");
    System.out.println( String.format("get指令執行結果:%s", value) );
    } catch (Exception e) {
    // TODO: handle exception
    } finally {
    // 業務操作完成,將連接返回給連接池
    if (null != client) {
    pool.returnResource(client);
    }
    } // end of try block

    // 應用關閉時,釋放連接池資源
    pool.destroy();

    運行上述代碼,控制台輸出:

    set指令執行結果:OK
    get指令執行結果:Hello, Redis!
    使用連接池+分布式
    在規模較大的系統中,往往會有多個Redis實例做負載均衡。並且還實現主從備份,當主實例發生故障時,切換至從實例提供服務。
    類似於Memcached的客戶端,Jedis也提供了客戶端分布式操作的方式,採用一致性哈希演算法。
    // 生成多機連接信息列表
    List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
    shards.add( new JedisShardInfo("127.0.0.1", 6379) );
    shards.add( new JedisShardInfo("192.168.56.102", 6379) );

    // 生成連接池配置信息
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxIdle(10);
    config.setMaxTotal(30);
    config.setMaxWaitMillis(3*1000);

    // 在應用初始化的時候生成連接池
    ShardedJedisPool pool = new ShardedJedisPool(config, shards);

    // 在業務操作時,從連接池獲取連接
    ShardedJedis client = pool.getResource();
    try {
    // 執行指令
    String result = client.set("key-string", "Hello, Redis!");
    System.out.println( String.format("set指令執行結果:%s", result) );
    String value = client.get("key-string");
    System.out.println( String.format("get指令執行結果:%s", value) );
    } catch (Exception e) {
    // TODO: handle exception
    } finally {
    // 業務操作完成,將連接返回給連接池
    if (null != client) {
    pool.returnResource(client);
    }
    } // end of try block

    // 應用關閉時,釋放連接池資源
    pool.destroy();

    運行上述代碼,控制台輸出:

    set指令執行結果:OK
    get指令執行結果:Hello, Redis!

    6. redis安裝segmentation fault怎麼解決

    你這個是運行時錯誤 也就是只有在運行時才出現的 看你的代碼,沒有問題,可能是你輸入的數據存在問題。不敢說這是數組越界,除非你累死了……段錯誤的原因非常多,最多的是內存非法訪問,也可是系統有保護功能:死循環也會成為錯誤。所以你得調試

    7. Redis和Memcache的區別總結

    區別:

    1、存儲方式不同

    memecache 把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小;redis有部份存在硬碟上,這樣能保證數據的持久性,支持數據的持久化(筆者註:有快照和AOF日誌兩種持久化方式,在實際應用的時候,要特別注意配置文件快照參數,要不就很有可能伺服器頻繁滿載做mp)。

    2、數據支持類型不同

    redis在數據支持上要比memecache多的多。

    3、使用底層模型不同

    新版本的redis直接自己構建了VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。

    4、運行環境不同

    redis目前官方只支持LINUX 上去行,從而省去了對於其它系統的支持,這樣的話可以更好的把精力用於本系統 環境上的優化,雖然後來微軟有一個小組為其寫了補丁。但是沒有放到主幹上。

    (7)redis源碼調試擴展閱讀

    注意事項

    1、 Redis和Memcache都是將數據存放在內存中,都是內存資料庫。不過memcache還可用於緩存其他東西,例如圖片、視頻等等。

    2、Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。

    3、虛擬內存–Redis當物理內存用完時,可以將一些很久沒用到的value 交換到磁碟 。

    4、過期策略–memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定,例如expire name 10 。

    5、分布式–設定memcache集群,利用magent做一主多從;redis可以做一主多從。都可以一主一,存儲數據安全–memcache掛掉後,數據沒了;redis可以定期保存到磁碟(持久化) 。

    8. windows下怎麼編譯redis

    打開windows版本鏈接,進行
    按上面的說明:

    On your computer create a working folder and cd into it.
    Clone antirez/redis repository:
    git clone https://github.com/antirez/redis.git

    然後,

    cd redis git checkout 3fac86ff1d


    git checkout -b 2.4_win_uv

    這個命令可能會有錯誤,文檔提示can ignored。
    也可以用curl:

    curl https://raw.github.com/gist/1439660//redis24_win_uv.patch | git am
    如果curl支持openssl的話,會提示什麼簽名證書有問題,可以根據提示,帶上參數 --insecure,也就是
    curl --insecure https://raw.github.com/gist/1439660//redis24_win_uv.patch | git am。
    補丁安裝完後,在msvs下面會生成.sln解決方案,可以用vc2010打開瀏覽代碼。這時還不能編譯,因為一般電腦上都沒有pthread相關文件。pthread-win32在多平台開源代碼中很常見,就是把win32的編程函數封裝成pthread風格的。可以從ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-8-0-release.exe.這里下載,不用運行,直接解壓就可以,這是自解壓文件。然後,可以直接用裡面的lib和dll,也可以自己編譯一個。把include和lib按要求復制到deps目錄:From your local folder, all the files from Pre-built.2/include to your redis folder under deps/pthreads-win32/include (the directory needs to be created).
    lib和dll有多個,要使用帶pthreadVC2.dll和pthreadVC2.lib。如果想省事,可以把pthreadVC2.lib改名成pthread.lib。pthreadVC2.dll不要改名,直接放在msvs目錄下,如果要直接運行,需要和.exe放在同級目錄。Redis說明要求編譯成靜態lib,就不需要dll了。根據個人愛好來定,個人感覺用dll好。
    然後就是打開RedisServer.sln調試代碼了

    9. Redis-server有沒有調試日誌

    在配置文件中有這樣一個配置:loglevel ,詳細如下:

    # Set server verbosity to 'debug'
    # it can be one of:
    # debug (a lot of information, useful for development/testing)
    # verbose (many rarely useful info, but not a mess like the debug level)
    # notice (moderately verbose, what you want in proction probably)
    # warning (only very important / critical messages are logged)
    #日誌記錄等級,4個可選值
    loglevel notice

    將這個設置到debug級別應該就能看到你想看到的。

    閱讀全文

    與redis源碼調試相關的資料

    熱點內容
    伺服器機櫃叫什麼名字 瀏覽:343
    vue3源碼作者 瀏覽:826
    app右下角標怎麼關 瀏覽:827
    怎麼對一個盤加密碼 瀏覽:668
    練習sql用什麼樣的伺服器 瀏覽:972
    asp與php對比 瀏覽:641
    php模除 瀏覽:250
    android上傳圖片方式 瀏覽:882
    華為視頻會議伺服器如何連接 瀏覽:220
    phpfpm並發數 瀏覽:923
    雲伺服器哪裡看 瀏覽:243
    戴爾emc伺服器led怎麼拔出 瀏覽:792
    程序員霸王 瀏覽:370
    文件夾重合如何分開 瀏覽:162
    mdk3命令 瀏覽:502
    我的世界伺服器雲地址是什麼 瀏覽:755
    往復壓縮機氣缸 瀏覽:248
    骰子掛雲伺服器 瀏覽:945
    彈性基礎鋼筋加密區 瀏覽:747
    html中插入php代碼 瀏覽:277