如何用Redis統計網站的UV

在 Java 項目中使用 Redis 統計網站的 UV(獨立訪客數),我們可以利用 Redis 提供的 HyperLogLog 數據結構。HyperLogLog 適合用來做基數統計,它在空間復雜度上非常高效,可以在存儲大量數據的情況下,提供非常接近真實的結果。

下面是如何在 Java 項目中使用 Redis 來統計網站的 UV 的詳細步驟和代碼示例:

1. 添加 Redis 依賴

首先,確保你的項目中引入了 Redis 相關的依賴。如果是 Spring Boot 項目,直接在 pom.xml 中添加如下依賴:

<dependencies><!-- Spring Boot Redis Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
</dependencies>

2. 配置 Redis 連接

application.propertiesapplication.yml 文件中配置 Redis 的連接信息:

application.properties 示例:
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=pwd (如果有密碼)
spring.redis.database=0

3. 創建 Redis 配置類(可選)

如果需要自定義 Redis 連接池或其他配置,可以創建一個配置類:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, String> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new StringRedisSerializer());return template;}
}

4. 創建 Redis 服務類

接下來,我們需要創建一個服務類,用來封裝 Redis 操作,特別是 HyperLogLog 的操作:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;@Service
public class RedisUvService {@Autowiredprivate RedisTemplate<String, String> redisTemplate;// Redis 中保存 UV 數據的 keyprivate static final String UV_KEY = "uv_count";/*** 記錄用戶的訪問(每次用戶訪問時調用此方法)* @param userId 用戶唯一標識(例如用戶ID、IP、瀏覽器指紋等)*/public void recordUv(String userId) {redisTemplate.opsForHyperLogLog().add(UV_KEY, userId);}/*** 獲取當前的獨立訪客數(UV)* @return 返回當前的獨立訪客數*/public Long getUvCount() {return redisTemplate.opsForHyperLogLog().size(UV_KEY);}
}

5. 創建 Controller

接著,可以創建一個簡單的 Controller,用于暴露 HTTP 接口,前端可以通過這些接口記錄訪問和獲取 UV 統計結果:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/uv")
public class UvController {@Autowiredprivate RedisUvService redisUvService;/*** 記錄用戶訪問* @param userId 用戶的唯一標識* @return 操作結果*/@GetMapping("/record")public String recordUv(String userId) {redisUvService.recordUv(userId);return "User " + userId + " recorded.";}/*** 獲取當前的獨立訪客數(UV)* @return 當前的 UV 數量*/@GetMapping("/count")public Long getUvCount() {return redisUvService.getUvCount();}
}

6. 如何工作

  • 記錄用戶訪問:當一個用戶訪問網站時,前端或后端可以通過 recordUv(userId) 方法,將用戶的唯一標識(例如 userId)傳入 Redis 進行記錄。這里的 userId 可以是任意唯一標識,比如用戶ID、IP 地址、設備指紋等。
  • 獲取 UV 統計結果:通過訪問 getUvCount() 方法,可以獲取當前的獨立訪客數(UV)。

7. 測試流程

  1. 啟動 Spring Boot 項目。
  2. 使用 Postman 或瀏覽器訪問 http://localhost:8080/uv/record?userId=user1 來記錄一個用戶訪問。
  3. 使用 http://localhost:8080/uv/count 查看當前的獨立訪客數(UV)。

8. HyperLogLog 優勢

  • 空間效率:HyperLogLog 只需要固定的內存空間來統計非常大的基數,適合用來做大規模數據統計,如 UV 統計。
  • 估算誤差:雖然 HyperLogLog 是近似算法,但它的誤差通常在 1% 以內,非常適合用于統計 UV 這樣的任務。
  • 高效:即使是億級網站的數據,HyperLogLog 也能夠以常量空間和高效的速度進行估算。

9. 總結

使用 Redis 的 HyperLogLog 數據結構統計網站的 UV 是一種非常高效且節省內存的方式。通過上面的代碼示例,你可以輕松地在 Spring Boot 項目中實現這一功能。每次用戶訪問時,只需將其唯一標識存入 Redis,最終通過 HyperLogLog 統計獲得獨立訪客數(UV),可以在億級用戶量下保持高效和準確。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75771.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android系統的安全問題 - Android的啟動時驗證

Android 啟動時驗證&#xff08;Verified Boot&#xff09; Android 的 啟動時驗證&#xff08;Verified Boot&#xff09; 是一項關鍵安全機制&#xff0c;用于確保設備啟動過程中加載的所有系統鏡像&#xff08;如 Bootloader、內核、系統分區&#xff09;未被篡改&#xff…

【操作系統】(四)體系結構

&#xff08;一&#xff09;大內核與微內核 把橘色部分劃分到內核中的操作系統屬于大內核&#xff0c;不把橘色劃到內核中的操作系統屬于微內核 大內核與微內核的具體區別&#xff1a; &#xff08;二&#xff09;計算機的層次結構 &#xff08;三&#xff09;操作系統內核非內…

Kotlin 協程官方文檔知識匯總(一)

1、協程基礎 Kotlin 是一門僅在標準庫中提供最基本底層 API 以便其他庫能夠利用協程的語言。與許多其他具有類似功能的語言不同&#xff0c;async 與 await 在 Kotlin 中并不是關鍵字&#xff0c;甚至都不是標準庫的一部分。此外&#xff0c;Kotlin 的掛起函數概念為異步操作提…

MySQL 的 JSON 查詢

MySQL 的 JSON 路徑格式 MySQL 使用特定的 JSON 路徑表達式語法來導航和提取 JSON 文檔中的數據 基本結構 MySQL 中的 JSON 路徑遵循以下通用格式 $[路徑組件]路徑組件詳解 | 操作符 | 描述 | 示例 | | ----------- | --------- | ----------…

Wi-SUN技術,強勢賦能智慧城市構筑海量IoT網絡節點

在智慧城市領域中&#xff0c;當一個智慧路燈項目因信號盲區而被迫增設數百個網關時&#xff0c;當一個傳感器網絡因入網設備數量爆增而導致系統通信失效時&#xff0c;當一個智慧交通系統因基站故障而導致交通癱瘓時&#xff0c;星型網絡拓撲與蜂窩網絡拓撲在構建廣覆蓋與高節…

Leetcode13-羅馬數字轉整數

題目鏈接&#xff1a;13. 羅馬數字轉整數 - 力扣&#xff08;LeetCode&#xff09; 如同上一題&#xff0c;直接用暴力法破解&#xff0c;簡單好理解 int romanToInt(char* s) {int len strlen(s);int res 0;for(int i 0; i < len; i) {switch(s[i]) {case M:res 1000…

Linux系統加固筆記

檢查口令為空的賬戶 判斷依據&#xff1a;存在則不符合 特殊的shell a./bin/false:將用戶的shell設置為/bin/false&#xff0c;用戶會無法登錄&#xff0c;并且不會有任何提示信息b./sbib/nologin&#xff1a;nologin會禮貌的向用戶發送一條消息&#xff0c;并且拒絕用戶登錄…

23種設計模式-責任鏈(Chain of Responsibility)設計模式

責任鏈設計模式 &#x1f6a9;什么是責任鏈設計模式&#xff1f;&#x1f6a9;責任鏈設計模式的特點&#x1f6a9;責任鏈設計模式的結構&#x1f6a9;責任鏈設計模式的優缺點&#x1f6a9;責任鏈設計模式的Java實現&#x1f6a9;代碼總結&#x1f6a9;總結 &#x1f6a9;什么是…

【宇宙回響】從Canvas到MySQL:飛機大戰的全棧交響曲【附演示視頻與源碼】

?? 這是星際大戰系列的第三篇,感謝一路以來支持和關注這個項目的每一位朋友! ?? 文章力求嚴謹,但難免有疏漏之處,歡迎各位朋友指出,讓我們一起在交流中進步。 ?? 項目代碼、文檔和相關資源都可以免費獲取,希望能幫助到更多對游戲開發感興趣的朋友。 ?? 如果您有任…

MyBatis-Plus(Ⅵ)插件

目錄 一、分頁插件 1.添加配置類 2.在測試類測試 結果 二、xml實現分頁的自定義 1.UserMapper中定義接口方法 2.創建UserMapper.xml文件 3.在測試類測試 結果 三、樂觀鎖 1.場景 2.樂觀鎖與悲觀鎖 3.模擬修改沖突 數據庫中添加商品表 添加數據 添加實體類 添加map…

火山引擎云上實戰: DeepSeek R1 大模型(全尺寸)

本文將介紹兩種在火山引擎云上部署 DeepSeek-R1 全尺寸模型服務的方案&#xff0c;涵蓋大模型推理服務的 Terraform 一鍵部署、容器化部署、資源彈性伸縮和模型可觀測。 來源 | 火山引擎云基礎 在 AI 大模型日新月異的當下&#xff0c;企業在使用大模型時往往面臨著數據隱私保…

vue遺漏的知識點(動態組件.)

----動態組件&#xff08;vue2vue3通用&#xff09; <component :is"..."> 的作用 <component> 是 Vue 的內置組件&#xff0c;用于動態渲染其他組件。:is 屬性 用于指定要渲染的組件。它的值可以是&#xff1a; 組件的名稱&#xff08;字符串&#xf…

工作流引擎Flowable介紹及SpringBoot整合使用實例

Flowable簡介 Flowable 是一個輕量級的業務流程管理&#xff08;BPM&#xff09;和工作流引擎&#xff0c;基于 Activiti 項目發展而來&#xff0c;專注于提供高性能、可擴展的工作流解決方案。它主要用于企業級應用中的流程自動化、任務管理和審批流等場景。 Flowable 的核心…

【uni-app】引用公共組件

目錄 一、建立公共組件 1.1新建vue文件 1.2編寫公共文件代碼 1.3使用 注意事項 一、建立公共組件 1.1新建vue文件 在公共組件文件目錄下新建所需要的功能文件 1.2編寫公共文件代碼 按需求寫對應功能的代碼 1.3使用 在需要使用的文件下引用公共組件 注意事項 想要使用s…

STL中vector模擬實現

vector各個接口函數 //構造函數 vector() vector(size_t n,const T& valT()) vector(int n,const T& val T()) //拷貝構造函數 vector(const vector<T>& v) //迭代器版本的 vector(inputiterator first, inputiterator end) //賦值運算符重載 vector<T&…

DML 數據操縱語言學習筆記

一、DML 核心概念體系 1.1 語言定位與邊界 DML&#xff08;Data Manipulation Language&#xff09;作為 SQL 三大核心語言之一&#xff0c;專注于數據行級操作&#xff0c;區別于 DDL&#xff08;結構定義&#xff09;和 DCL&#xff08;權限控制&#xff09;。其核心指令包…

springboot的跨域是什么?遇到跨域問題如何解決?

在Spring Boot中&#xff0c;跨域是指當瀏覽器中的前端應用&#xff08;如運行在某個域名和端口下的前端頁面&#xff09;請求后端接口時&#xff0c;如果后端接口所在的域名、端口或協議與前端應用不一致&#xff0c;瀏覽器會阻止這種跨域請求。這是由于瀏覽器的同源策略&…

嘯叫抑制(AFS)從算法仿真到工程源碼實現-第八節-系統搭建

一、概述 系統分為錄音模塊、數據處理模塊、播音模塊。錄音模塊和播音模塊使用alsa庫進行讀寫數據。各模塊為獨立進程處理&#xff0c;模塊之間使用命名管道進行數據的傳輸。數據處理模塊我們使用基于頻域的自適應濾波去嘯叫算法。 二、工程實現 2.1 系統流程圖 2.2 錄音模塊…

HTML——什么是塊級元素,什么是內聯元素,有何區別

在 HTML 中&#xff0c;塊級元素&#xff08;Block-level element&#xff09;和內聯元素&#xff08;Inline element&#xff09;是兩種不同類型元素&#xff0c;它們在頁面布局和樣式應用方面有不同的行為和特性。 塊級元素&#xff08;Block-level element&#xff09; 塊級…

01 設計模式和設計原則

類設計原則&#xff1a; 單一職責原則&#xff08;Single Responsibility Principle&#xff0c;SRP&#xff09;&#xff1a;實現類要職責單一開閉原則&#xff08;Open Close Principle&#xff0c;OCP&#xff09;&#xff1a;對擴展開放&#xff0c;對修改關閉里氏替換原則…