最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java和Redis實現(xiàn)熱搜功能

 更新時間:2024年01月28日 16:05:55   作者:孤蓬&聽雨  
這篇文章主要介紹了Java和Redis實現(xiàn)熱搜功能,在存儲和傳輸用戶搜索數(shù)據(jù)時,考慮到數(shù)據(jù)的機密性和隱私保護,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧

1. 前言

我們有一個簡單的需求:

  • 搜索欄展示當(dāng)前登陸的個人用戶的搜索歷史記錄,刪除個人歷史記錄。
  • 用戶在搜索欄輸入某字符,則將該字符記錄下來 以zset格式存儲的redis中,記錄該字符被搜索的個數(shù)以及當(dāng)前的時間戳 (用了DFA算法)。
  • 每當(dāng)用戶查詢了已在redis存在了的字符時,則直接累加個數(shù), 用來獲取平臺上最熱查詢的十條數(shù)據(jù)。(可以自己寫接口或者直接在redis中添加一些預(yù)備好的關(guān)鍵詞)。
  • 做不雅文字的過濾功能。

2. 實現(xiàn)

2.1 引入依賴

<dependencies>  
    <dependency>  
        <groupId>redis.clients</groupId>  
        <artifactId>jedis</artifactId>  
        <version>3.7.0</version> <!-- 使用你需要的版本 -->  
    </dependency>  
</dependencies>

2.2 實現(xiàn)代碼

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;
import java.util.Set;
import java.util.HashSet;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class HotSearch {
    private static final String REDIS_HOST = "localhost";
    private static final int REDIS_PORT = 6379;
    private static final String HISTORY_SET = "history";
    private static final String ZSET_PREFIX = "zset:";
    private static final int TOP_TEN = 10;
    private static final String BAD_WORDS = "bad"; // 替換為需要過濾的關(guān)鍵詞  
    private static final String FILTERED_WORD = "***"; // 替換為過濾后的關(guān)鍵詞  
    private static final int BAD_WORD_THRESHOLD = 100; // 替換為過濾的閾值,超過則認為是不雅文字  
    private static final List<String> BAD_WORD_LIST = IntStream.range(0, BAD_WORDS.length()).mapToObj(i -> BAD_WORDS.substring(i, i + 1)).collect(Collectors.toList()); // 將BAD_WORDS轉(zhuǎn)為List,方便后續(xù)操作  
    public static void main(String[] args) {
        Jedis jedis = new Jedis(REDIS_HOST, REDIS_PORT);
        String userId = "user1"; // 當(dāng)前登陸的個人用戶ID,需要根據(jù)實際情況獲取  
        String searchWord = "test"; // 需要搜索的字符  
        hotSearch(jedis, userId, searchWord);
    }
    public static void hotSearch(Jedis jedis, String userId, String searchWord) {
        // 獲取當(dāng)前用戶的搜索歷史記錄  
        Set<String> history = jedis.smembers(HISTORY_SET + ":" + userId);
        if (history == null) history = new HashSet<>();
        history.add(searchWord); // 將新搜索詞加入歷史記錄  
        jedis.sadd(HISTORY_SET + ":" + userId, history); // 將歷史記錄存入redis中  
        history.remove(searchWord); // 去掉新搜索詞,只保留舊的歷史記錄  
        // 將搜索詞加入zset中,記錄該字符被搜索的個數(shù)以及當(dāng)前的時間戳   
        jedis.zadd(ZSET_PREFIX + userId, getScore(searchWord), searchWord);
        System.out.println("Added " + searchWord + " to hot search with score " + getScore(searchWord));
        // 過濾不雅文字,如果是不雅文字則替換為***,并累加不雅文字的搜索次數(shù)  
        if (BAD_WORD_LIST.contains(searchWord)) {
            if (jedis.zscore(ZSET_PREFIX + userId, FILTERED_WORD) == null) { // 如果該詞在zset中不存在,則加入并設(shè)置得分  
                jedis.zadd(ZSET_PREFIX + userId, BAD_WORD_THRESHOLD, FILTERED_WORD); // 設(shè)置得分為BAD_WORD_THRESHOLD,表示這是一個不雅文字  
                jedis.incrBy(HISTORY_SET + ":bad", 1); // 累加不雅文字的搜索次數(shù),存儲在bad歷史的集合中,方便后續(xù)統(tǒng)計和過濾處理  
            } else { // 如果該詞在zset中已存在,則只累加搜索次數(shù),并更新得分(得分+1)  
                jedis.zincrby(ZSET_PREFIX + userId, 1, FILTERED_WORD); // 得分為當(dāng)前得分+1,表示這是一個不雅文字的再次搜索  
                jedis.incrBy(HISTORY_SET + ":bad", 1); // 累加不雅文字的搜索次數(shù),存儲在bad歷史的集合中,方便后續(xù)統(tǒng)計和過濾處理  
            }
            System.out.println("The word " + searchWord + " is filtered and replaced with " + FILTERED_WORD); // 輸出過濾后的結(jié)果  
        } else { // 如果不是不雅文字,則正常加入熱搜列表并設(shè)置得分  
            jedis.zadd(ZSET_PREFIX + userId, getScore(searchWord), searchWord); // 正常加入熱搜列表并設(shè)置得分  
            System.out.println("Added normal word " + searchWord + " to hot search with score " + getScore(searchWord)); // 輸出正常加入熱搜列表的結(jié)果
        }
        // 獲取平臺上最熱搜索的十條數(shù)據(jù)  
        Set<Tuple> hotData = jedis.zrevrangeWithScores(ZSET_PREFIX + userId, 0, TOP_TEN - 1);
        List<String> hotWords = hotData.stream().map(Tuple::getElement).collect(Collectors.toList());
        List<Integer> hotScores = hotData.stream().map(Tuple::getScore).collect(Collectors.toList());
        System.out.println("Top " + TOP_TEN + " hot searches are: " + hotWords + " with scores: " + hotScores);
    }
    // 用于計算得分的方法,這里采用了最簡單的得分方式,只考慮了搜索頻率和時間戳,實際情況可能需要更復(fù)雜的算法 
    private static int getScore(String word) {
        return 1;
    }
}

2.3 實現(xiàn)原理

  1. 安全性
    • 確保Redis服務(wù)器的安全性。這包括使用強密碼、配置防火墻規(guī)則、使用SSL連接等。不要將敏感數(shù)據(jù)暴露給不必要的用戶或應(yīng)用程序。
    • 在存儲和傳輸用戶搜索數(shù)據(jù)時,考慮到數(shù)據(jù)的機密性和隱私保護。根據(jù)當(dāng)?shù)氐碾[私法律和政策,可能需要采取額外的措施來保護用戶數(shù)據(jù)。
  2. 性能監(jiān)控和調(diào)優(yōu)
    • 監(jiān)控Redis的性能指標,如內(nèi)存使用情況、連接數(shù)、查詢速度等。根據(jù)實際負載情況,可能需要調(diào)整Redis的配置參數(shù)或增加硬件資源。
    • 定期檢查代碼的性能,確保在大量請求下能夠保持穩(wěn)定的性能。對于瓶頸部分,可能需要優(yōu)化算法或調(diào)整數(shù)據(jù)結(jié)構(gòu)。
  3. 異常處理
    • 添加適當(dāng)?shù)漠惓L幚磉壿?,以處理Redis連接失敗、查詢錯誤等情況。確保應(yīng)用程序能夠優(yōu)雅地處理這些異常,并為用戶提供適當(dāng)?shù)腻e誤消息。
    • 對于可能出現(xiàn)的Redis故障或維護時段,考慮實現(xiàn)一種回退機制或通知系統(tǒng),以便及時通知相關(guān)人員并采取措施。
  4. 數(shù)據(jù)一致性和備份
    • 確保Redis中的數(shù)據(jù)與應(yīng)用程序中的其他數(shù)據(jù)源保持一致。在寫入數(shù)據(jù)時,要確保冪等性以避免數(shù)據(jù)沖突。
    • 定期備份Redis中的數(shù)據(jù),以防數(shù)據(jù)丟失??紤]使用快照或追加日志的方式來備份數(shù)據(jù)。
  5. 擴展性和高可用性
    • 如果應(yīng)用程序需要處理大量的搜索請求,考慮使用Redis集群來分擔(dān)負載和提高可用性。確保集群配置正確,并能夠自動處理節(jié)點故障轉(zhuǎn)移。
    • 在設(shè)計系統(tǒng)時,考慮到未來的擴展需求。使用可擴展的數(shù)據(jù)結(jié)構(gòu)或算法,以便在需要時輕松地增加功能和優(yōu)化性能。
  6. 日志和監(jiān)控
    • 配置適當(dāng)?shù)娜罩居涗浵到y(tǒng),記錄Redis的操作和關(guān)鍵事件。這有助于故障排查和性能分析。
    • 使用監(jiān)控工具來實時跟蹤Redis的性能指標和應(yīng)用程序的健康狀況。這樣可以在問題發(fā)生時迅速采取行動。
  7. 測試和驗證
    • 在將代碼部署到生產(chǎn)環(huán)境之前,進行充分的測試和驗證。確保代碼的功能正確、性能良好,并且沒有安全漏洞。
    • 考慮使用集成測試、單元測試和負載測試來評估代碼的健壯性和穩(wěn)定性。確保代碼能夠承受實際工作負載和各種邊界條件。
  8. 代碼維護和文檔
    • 為代碼添加適當(dāng)?shù)淖⑨尯臀臋n,以幫助其他開發(fā)人員理解其工作原理和維護方式。這也有助于未來的代碼審查和維護工作。
    • 保持代碼的清潔和可維護性,遵循最佳實踐和編碼規(guī)范。定期重構(gòu)代碼以消除冗余和提高可讀性。

到此這篇關(guān)于Java和Redis實現(xiàn)熱搜功能的文章就介紹到這了,更多相關(guān)Redis熱搜內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springBoot中myBatisPlus的使用步驟及示例代碼

    springBoot中myBatisPlus的使用步驟及示例代碼

    MyBatis-Plus 是一個 MyBatis 的增強工具,在 Spring Boot 項目里使用它能極大提升開發(fā)效率,下面為你詳細介紹在 Spring Boot 中使用 MyBatis-Plus 的步驟以及示例代碼,感興趣的朋友一起看看吧
    2025-03-03
  • Java中間消息件ActiveMQ使用實例

    Java中間消息件ActiveMQ使用實例

    這篇文章主要介紹了Java中間消息件ActiveMQ使用實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • java線程池中線程數(shù)量到底是幾

    java線程池中線程數(shù)量到底是幾

    本文主要介紹了java線程池中線程數(shù)量到底是幾,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • JavaEE Spring MyBatis如何一步一步實現(xiàn)數(shù)據(jù)庫查詢功能

    JavaEE Spring MyBatis如何一步一步實現(xiàn)數(shù)據(jù)庫查詢功能

    這篇文章主要介紹了JavaEE Spring MyBatis如何一步一步實現(xiàn)數(shù)據(jù)庫查詢功能,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot整合PageHelper實現(xiàn)分頁查詢功能

    SpringBoot整合PageHelper實現(xiàn)分頁查詢功能

    本文介紹了在SpringBoot+MyBatis項目中使用PageHelper實現(xiàn)分頁功能的方法,包括PageHelper的簡要介紹,環(huán)境搭建,核心使用方式,實戰(zhàn)案例,以及PageHelper的工作原理,通過PageHelper,可以實現(xiàn)近乎零侵入的分頁功能,使分頁邏輯與業(yè)務(wù)代碼解耦,需要的朋友可以參考下
    2026-04-04
  • Jenkins+Git+Maven自動化部署配置詳解

    Jenkins+Git+Maven自動化部署配置詳解

    本文主要介紹了Jenkins+Git+Maven自動化部署配置詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • java打jar包與找不到依賴包的問題

    java打jar包與找不到依賴包的問題

    這篇文章主要介紹了java打jar包與找不到依賴包的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java序列化和反序列化示例介紹

    Java序列化和反序列化示例介紹

    大家好,本篇文章主要講的是Java序列化和反序列化示例介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 詳解Java Project項目打包成jar,并生成exe文件

    詳解Java Project項目打包成jar,并生成exe文件

    本篇文章主要介紹了Java Project項目打包成jar,并生成exe文件,非常具有實用價值,有興趣的可以了解一下。
    2017-01-01
  • java數(shù)組實現(xiàn)隊列及環(huán)形隊列實現(xiàn)過程解析

    java數(shù)組實現(xiàn)隊列及環(huán)形隊列實現(xiàn)過程解析

    這篇文章主要介紹了java數(shù)組實現(xiàn)隊列及環(huán)形隊列實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10

最新評論

枣庄市| 新龙县| 盐池县| 勃利县| 宁陕县| 大丰市| 仁布县| 永新县| 卓资县| 喜德县| 穆棱市| 文昌市| 乌什县| 如东县| 雷波县| 永丰县| 奉化市| 浮梁县| 临夏县| 宣武区| 马山县| 堆龙德庆县| 南阳市| 临清市| 保德县| 甘孜| 民勤县| 大方县| 响水县| 昌都县| 固始县| 汝阳县| 吴桥县| 赤水市| 富平县| 南昌市| 临潭县| 陇西县| 黄龙县| 冕宁县| 宣汉县|