主頁 > 資料庫 > 抖音資料采集Frida教程,Frida Java Hook 詳解:代碼及示例(下)

抖音資料采集Frida教程,Frida Java Hook 詳解:代碼及示例(下)

2021-01-24 19:06:49 資料庫

抖音資料采集Frida教程,Frida Java Hook 詳解:代碼及示例(下)


短視頻、直播資料實時采集介面,請查看檔案: TiToData


免責宣告:本檔案僅供學習與參考,請勿用于非法用途!否則一切后果自負,

1.1 Java層攔截內部類函式

之前我們已經學習過了HOOK普通函式、方法多載、建構式,現在來更深入的學習HOOKAndroid逆向中,我們也會經常遇到在Java層的內部類,Java內部類函式,使得我們更難以分析代碼,我們在這章節中對內部類進行一個基本了解和使用FRIDA對內部類進行鉤子攔截處理,什么是內部類?所謂內部類就是在一個類內部進行其他類結構的嵌套操作,它的優點是內部類與外部類可以方便的訪問彼此的私有域(包括私有方法、私有屬性),所以Android中有很多的地方都會使用到內部類,我們來見一個例子也是最直觀的,如下圖4-17,

圖4-17 User類中的clz類
在圖4-17中看到User類中嵌套了一個clz,這樣的操作也是屢見不鮮了,在frida中,我們可以使用$符號對起進行處理,首先打開jadxgui軟體對代碼進行反編譯,反編譯之后進入User類,下方會有一個smali的按鈕,點擊smali則會進入smali代碼,進入smali代碼直接按ctrl+f區域搜索字串clz,因為clz是內部類的名稱,那么就會搜到Lcom/roysue/roysueapplication/User\$clz;,我們將翻譯成java代碼就是:com.roysue.roysueapplication.User\$clz,去掉第一個字串的L/以及;就構成了內部類的具體類名了,見下圖4-18,
image.pngimage.gif
圖4-18 smali代碼
經過上面的分析我們已經得知最重要的部分類的路徑:com.roysue.roysueapplication.User\$clz,現在來對內部類進行HOOK,現在開始撰寫js腳本,

1.1.1 攔截內部類函式代碼示例

function hook_overload_3() {
    if(Java.available) {
        Java.perform(function () {
            console.log("start hook");
            //注意此處類的路徑填寫更改所分析的路徑
            var clz = Java.use('com.roysue.roysueapplication.User$clz');
            if(clz != undefined) {
                //這邊也是像正常的函式來hook即可
                clz.toString.implementation = function (){
                    console.log("成功hook clz類");
                    return this.toString();
                }
            } else {
                console.log("clz: undefined");
            }
            console.log("start end");
        });
    }
}

執行腳本之后,我們可以看到控制也已經成功附加并且列印了成功hook clz類,這樣我們也能夠對Java層的內部類進行處理了,

[Google Pixel::com.roysue.roysueapplication]-> 成功hook clz類
成功hook clz類

1.2 Java層列舉所有的類并定位類

在前面我們學會了如何在java層的各種函式的HOOK操作了,現在開始學習列舉所有的類并定位類的騷套路了~,學習之前我們要了解API中的enumerateLoadedClasses方法,它是屬于Java物件中的一個方法,能夠列舉現在加載的所有類,enumerateLoadedClasses存在2個回呼函式,分別是onMatch:function(ClassName):為每個加載的具有className的類呼叫,每個ClassName回傳來的都是一個類名;和onComplete:function():在列舉所有類列舉完之后回呼一次,

1.2.1 列舉所有的類并定位類代碼示例


setTimeout(function (){
  Java.perform(function (){
    console.log("n[*] enumerating classes...");
    //Java物件的API enumerateLoadedClasses
    Java.enumerateLoadedClasses({
      //該回呼函式中的_className引數就是類的名稱,每次回呼時都會回傳一個類的名稱
      onMatch: function(_className){
        //在這里將其輸出
        console.log("[*] found instance of '"+_className+"'");

        //如果只需要列印出com.roysue包下所有類把這段注釋即可,想列印其他的替換掉indexOf中引數即可定位到~
        //if(_className.toString().indexOf("com.roysue")!=-1)
        //{
        //    console.log("[*] found instance of '"+_className+"'");
        //}
      },
      onComplete: function(){
        //會在列舉類結束之后回呼一次此函式
        console.log("[*] class enuemration complete");
      }
    });
  });
});

當我們執行該腳本時,注入目標行程之后會開始呼叫onMatch函式,每次呼叫都會列印一次類的名稱,當onMatch函式回呼完成之后會呼叫一次onComplete函式,最后會列印出class enuemration complete,見下圖,

圖4-19 列舉所有類

1.3 Java層列舉類的所有方法并定位方法

上文已經將類以及實體列舉出來,接下來我們來列舉所有方法,列印指定類或者所有的類的內部方法名稱,主要核心功能是通過類的反射方法中的getDeclaredMethods(),該api屬于JAVAJDK中自帶的API,屬于java.lang.Class包中定義的函式,該方法獲取到類或介面宣告的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法,當然也包括它所實作介面的方法,在Java中它是這樣定義的:public Method[] getDeclaredMethods();其回傳值是一個Method陣列,Method實際上就是一個方法名稱字串,當然也是一個物件陣列,然后我們將它列印出來,

1.3.1 列舉類的所有方法并定位方法代碼示例

function enumMethods(targetClass)
{
    var hook = Java.use(targetClass);
    var ownMethods = hook.class.getDeclaredMethods();
    hook.$dispose;
    return ownMethods;
}

function hook_overload_5() {
    if(Java.available) {
        Java.perform(function () {
           var a = enumMethods("com.roysue.roysueapplication.User$clz")
           a.forEach(function(s) {
                console.log(s);
           });
        });
    }
}

我們先定義了一個enumMethods方法,其引數targetClass是類的路徑名稱,用于Java.use獲取類物件本身,獲取類物件之后再通過其.class.getDeclaredMethods()方法獲取目標類的所有方法名稱陣列,當呼叫完了getDeclaredMethods()方法之后再呼叫$dispose方法釋放目標類物件,回傳目標類所有的方法名稱、回傳型別以及函式的權限,這是實作獲取方法名稱的核心方法,下面一個方法主要用于注入到目標行程中去執行邏輯代碼,在hook_overload_5方法中先是使用了Java.perform方法,再在內部呼叫enumMethods方法獲取目標類的所有方法名稱、回傳型別以及函式的權限,回傳的是一個Method陣列,通過forEach迭代器回圈輸出陣列中的每一個值,因為其本身實際就是一個字串所以直接輸出就可以得到方法名稱,腳本執行效果如下圖4-20,
image.gifimage.png
圖4-20 腳本執行后效果在圖4-17中clz只有一個toString方法,我們填入引數為com.roysue.roysueapplication.User$clz,就能夠定位到該類中所有的方法,

1.4 Java層攔截方法的所有方法多載

我們學會了列舉所有的類以及類的有方法之后,那我們還想知道如何獲取所有的方法多載函式,畢竟在Android反編譯的原始碼中方法多載不在少數,對此,一次性hook所有的方法多載是非常有必要的學習,我們已經知道在hook多載方法時需要寫overload('x'),也就是說我們需要構造一個多載的陣列,并把每一個多載都列印出來,

1.4.1 攔截方法的所有方法多載代碼示例

function hook_overload_8() {
    if(Java.available) {
        Java.perform(function () {
            console.log("start hook");
            var targetMethod = 'add';
            var targetClass = 'com.roysue.roysueapplication.Ordinary_Class';
            var targetClassMethod = targetClass + '.' + targetMethod;
            //目標類
            var hook = Java.use(targetClass);
            //多載次數
            var overloadCount = hook[targetMethod].overloads.length;
            //列印日志:追蹤的方法有多少個多載
            console.log("Tracing " + targetClassMethod + " [" + overloadCount + " overload(s)]");
            //每個多載都進入一次
            for (var i = 0; i < overloadCount; i++) {
                    //hook每一個多載
                    hook[targetMethod].overloads[i].implementation = function() {
                        console.warn("n*** entered " + targetClassMethod);
                        //可以列印每個多載的呼叫堆疊,對除錯有巨大的幫助,當然,資訊也很多,盡量不要列印,除非分析陷入僵局
                        Java.perform(function() {
                            var bt = Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new());
                                console.log("nBacktrace:n" + bt);
                        });   
                        // 列印引數
                        if (arguments.length) console.log();
                        for (var j = 0; j < arguments.length; j++) {
                            console.log("arg[" + j + "]: " + arguments[j]);
                        }
                        //列印回傳值
                        var retval = this[targetMethod].apply(this, arguments); // rare crash (Frida bug?)
                        console.log("nretval: " + retval);
                        console.warn("n*** exiting " + targetClassMethod);
                        return retval;
                    }
                }
            console.log("hook end");
        });
    }
}

1.4.2 攔截方法的所有方法多載代碼示例詳解

上面這段代碼可以列印出com.roysue.roysueapplication.Ordinary_Class類中add方法多載的個數以及hook該類中所有的方法多載函式,現在來剖析上面的代碼為什么可以對一個類中的所有的方法多載HOOK掛上鉤子,首先我們定義了三個變數分別是targetMethod、targetClass、targetClassMethod,這三個變數主要于定義方法的名稱、類名、以及類名+方法名的賦值,首先使用了Java.use獲取了目標類物件,再獲取多載的次數,這里詳細說一下如何獲取的:var method_overload = cls[<func_name>].overloads[index];這句代碼可以看出通過cls索引func_name到類中的方法,而后面寫到overloads[index]是指方法多載的第index個函式,大致意思就是回傳了一個method物件的第index位置的函式,而在代碼中寫道:var overloadCount = hook[targetMethod].overloads.length;,采取的方法是先獲取類中某個函式所有的方法多載個數,繼續往下走,開始回圈方法多載的函式,剛剛開始回圈時hook[targetMethod].overloads[i].implementation這句對每一個多載的函式進行HOOK,這里也說一下Arguments:Argumentsjs中的一個物件,js內的每個函式都會內置一個Arguments物件實體arguments,它參考著方法實參,呼叫其實體物件可以通過arguments[]下標的來參考實際元素,arguments.length為函式實參個數,arguments.callee參考函式自身,這就是為什么在該段代碼中并看不到arguments的定義卻能夠直接呼叫的原因,因為它是內置的一個物件,好了,講完了arguments咱們接著說,列印引數通過arguments.length來回圈以及arguments[j]來獲取實際引數的元素,那現在來看applyapplyjs中是怎么樣的存在,apply的含義是:應用某一物件的一個方法,用另一個物件替換當前物件,this[targetMethod].apply(this, arguments);這句代碼簡言之就是執行了當前的overload方法,執行完當前的overload方法并且列印以及回傳給真實呼叫的函式,這樣不會使程式錯誤,那么最終執行效果見下圖4-21:
image.pngimage.gif
圖4-21 終端顯示
可以看到成功列印了add函式的方法多載的數量以及hook列印出來的引數值、回傳值!

1.5 Java層攔截類的所有方法

學會了如何HOOK所有方法多載函式后,我們可以把之前學習的整合到一起,來hook指定類中的所有方法,也包括方法多載的函式,下面js中核心代碼是利用多載函式的特點來HOOK全部的方法,普通的方法也是一個特殊方法多載,只是它只是一個方法而已,直接把它當作方法多載來HOOK就好了,打個比方正方形是特殊的長方形,而長方形是不是特殊的正方形,這個正方形是普通函式,而長方形是多載方法這樣大家應該很好理解了~在上一章節中已經知道了如何hook方法多載,只是方法名稱和類名是寫死的,只需要把成員的targetClass、targetMethod定義方法中的引數即可,在該例子中拿到指定類所有的所有方法名稱,更加靈活使用了,代碼如下,

1.5.1 攔截類的所有方法代碼示例

function traceClass(targetClass)
{
    //Java.use是新建一個物件哈,大家還記得么?
    var hook = Java.use(targetClass);
    //利用反射的方式,拿到當前類的所有方法
    var methods = hook.class.getDeclaredMethods();
    //建完物件之后記得將物件釋放掉哈
    hook.$dispose;
    //將方法名保存到陣列中
    var parsedMethods = [];
    methods.forEach(function(method) {
        //通過getName()方法獲取函式名稱
        parsedMethods.push(method.getName());
    });
    //去掉一些重復的值
    var targets = uniqBy(parsedMethods, JSON.stringify);
    //對陣列中所有的方法進行hook
    targets.forEach(function(targetMethod) {
        traceMethod(targetClass + "." + targetMethod);
    });
}
function hook_overload_9() {
    if(Java.available) {
        Java.perform(function () {
            console.log("start hook");
            traceClass("com.roysue.roysueapplication.Ordinary_Class");
            console.log("hook end");
        });
    }
}
s1etImmediate(hook_overload_9);

執行腳本效果可以看到,hook到了com.roysue.roysueapplication.Ordinary_Class類中所有的函式,在執行其被hook攔截的方法時候,也列印出了每個方法相應的的引數以及回傳值,見下圖4-22,

圖4-22 終端運行顯示效果

1.6 Java層攔截類的所有子類

這里的核心功能也用到了上一小章節中定義的traceClass函式,該函式只需要傳入一個class路徑即可對class中的函式完成注入hook,那么在本小章節來hook掉所有類的子類,使我們的腳本更加的靈活方便,通過之前的學習我們已經知道enumerateLoadedClasses這個api可以列舉所有的類,用它來獲取所有的類然后再呼叫traceClass函式就可以對所有類的子進行全面的hook,但是一般不會hook所有的函式,因為AndroidAPI函式實在太多了,在這里我們需要匹配自己需要hook的類即可,代碼如下,

//列舉所有已經加載的類
Java.enumerateLoadedClasses({
    onMatch: function(aClass) {
        //迭代和判斷
        if (aClass.match(pattern)) {
            //做一些更多的判斷,適配更多的pattern
            var className = aClass.match(/[L]?(.*);?/)[1].replace(///g, ".");
            //進入到traceClass里去
            traceClass(className);
        }
    },
    onComplete: function() {}
});

1.7 RPC遠程呼叫Java層函式

FRIDA中,不但提供很完善的HOOK機制,并且還提供rpc介面,可以匯出某一個指定的函式,實作在python層對其隨意的呼叫,而且是隨時隨地想呼叫就呼叫,極其方便,因為是在供給外部的python,這使得rpc提供的介面可以與python完成一些很奇妙的操作,這些匯出的函式可以是任意的java內部的類的方法,呼叫我們自己想要的物件和特定的方法,那我們開始動手吧,現在我們來通過RPC的匯出功能將圖4-9中的add方法供給外部呼叫,開始撰寫rpc_demo.py檔案,這次是python檔案了哦~不是js檔案了

1.7.1 rpc匯出Java層函式代碼示例

import codecs
import frida
from time import sleep

# 附加行程名稱為:com.roysue.roysueapplication
session = frida.get_remote_device().attach('com.roysue.roysueapplication')

# 這是需要執行的js腳本,rpc需要在js中定義
source = """
    //定義RPC
    rpc.exports = {
        //這里定義了一個給外部呼叫的方法:sms
        sms: function () {
            var result = "";
            //嵌入HOOK代碼
            Java.perform(function () {
                //拿到class類
                var Ordinary_Class = Java.use("com.roysue.roysueapplication.Ordinary_Class");
                //最終rpc的sms方法會回傳add(1,3)的結果!
                result = Ordinary_Class.add(1,3);
             });
            return result;
        },
    };
"""

# 創建js腳本
script = session.create_script(source)
script.load()

# 這里可以直接呼叫java中的函式
rpc = script.exports
# 在這里也就是python下直接通過rpc呼叫sms()方法
print(rpc.sms())
sleep(1)

session.detach()

當我們執行python rpc_demo.py時先會創建腳本并且注入到目標行程,在上面的source實際上就是js邏輯代碼了,在js代碼內我們定義了rpc可以給python呼叫的sms函式,而sms函式內部嵌套呼叫Java.perform再對需要拿到的函式的類進行主動呼叫,把最終的結果回傳作為sms的回傳值,當我們在python層時候可以任意呼叫sms中的原型add方法~

1.8 綜合案例一:在安卓8.1上dump藍牙介面和實體

一個比較好的綜合案例 :dump藍牙資訊的“加強版”——BlueCrawl

VERSION="1.0.0"
setTimeout(function(){
    Java.perform(function(){
        Java.enumerateLoadedClasses({
                onMatch: function(instance){
                    if (instance.split(".")[1] == "bluetooth"){
                        console.log("[->]t"+lightBlueCursor()+instance+closeCursor());
                    }
                },
                onComplete: function() {}
            });

        Java.choose("android.bluetooth.BluetoothGattServer",{
                onMatch: function (instance){
                    ...
                onComplete: function() { console.log("[*] -----");}
            });

        Java.choose("android.bluetooth.BluetoothGattService",{
                onMatch: function (instance){
                    ...
                onComplete: function() { console.log("[*] -----");}
            });

         Java.choose("android.bluetooth.BluetoothSocket",{
                onMatch: function (instance){
                    ...
                onComplete: function() { console.log("[*] -----");}
            });

          Java.choose("android.bluetooth.BluetoothServerSocket",{
                onMatch: function (instance){
                    ...
                onComplete: function() { console.log("[*] -----");}
            });

          Java.choose("android.bluetooth.BluetoothDevice",{
                onMatch: function (instance){
                    ...
                onComplete: function() { console.log("[*] -----");}
            });
    });
},0);

該腳本首先列舉了很多藍牙相關的類,然后choose了很多類,包括藍牙介面資訊以及藍牙服務介面物件等,還加載了記憶體中已經分配好的藍牙設備物件,也就是上文我們已經演示的資訊,我們可以用這個腳本來“查看”App加載了哪些藍牙的介面,App是否正在查找藍牙設備、或者是否竊取藍牙設備資訊等,在電腦上運行命令:$ frida -U -l bluecrawl-1.0.0.js com.android.bluetooth執行該腳本時會詳細列印所有藍牙介面資訊以及服務介面物件~~

1.9 綜合案例二:動靜態結合逆向WhatsApp

我們來試下它的幾個主要的功能,首先是本地庫的匯出函式,


setTimeout(function() {
    Java.perform(function() {
        trace("exports:*!open*");
        //trace("exports:*!write*");
        //trace("exports:*!malloc*");
        //trace("exports:*!free*");
    });
}, 0);

我們hook的是open()函式,跑起來看下效果:

$ frida -U -f com.whatsapp -l raptor_frida_android_trace_fixed.js --no-pause

如圖所示*!open*根據正則匹配到了openlogopen64等匯出函式,并hook了所有這些函式,列印出了其引數以及回傳值,接下來想要看哪個部分,只要扔到jadx里,靜態“分析”一番,自己隨便翻翻,或者根據字串搜一搜,比如說我們想要看上圖中的com.whatsapp.app.protocol包里的內容,就可以設定trace("com.whatsapp.app.protocol"),可以看到包內的函式、方法、包括多載、引數以及回傳值全都列印了出來,這就是frida腳本的魅力,當然,腳本終歸只是一個工具,你對Java、安卓App的理解,和你的創意才是至關重要的,接下來可以搭配Xposed module看看別人都給whatsapp做了哪些模塊,hook的哪些函式,實作了哪些功能,學習自己寫一寫,

短視頻、直播資料實時采集介面,請查看檔案: TiToData


免責宣告:本檔案僅供學習與參考,請勿用于非法用途!否則一切后果自負,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/251614.html

標籤:大數據

上一篇:Spark學習之Dataset (DataFrame) 的基礎操作

下一篇:【概念】詳解MapReduce原理

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more