SpringBoot運用Redis統(tǒng)計用戶在線數(shù)量的兩種方法實現(xiàn)
在Spring Boot里運用Redis統(tǒng)計用戶在線數(shù)量。
項目依賴與配置
1. 引入依賴
首先,在pom.xml
文件中添加Spring Data Redis依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2. 配置Redis連接
在application.properties
中進行Redis連接的配置:
spring.redis.host=localhost spring.redis.port=6379
方案1:借助Redis Set實現(xiàn)精確統(tǒng)計
1. 創(chuàng)建Redis操作Service
編寫一個Redis操作Service,用于處理用戶在線狀態(tài):
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.Set; @Service public class OnlineUserService { private static final String ONLINE_USERS_KEY = "online_users"; private final RedisTemplate<String, String> redisTemplate; public OnlineUserService(RedisTemplate<String, String> redisTemplate) { this.redisTemplate = redisTemplate; } // 用戶登錄 public void login(String userId) { redisTemplate.opsForSet().add(ONLINE_USERS_KEY, userId); } // 用戶退出 public void logout(String userId) { redisTemplate.opsForSet().remove(ONLINE_USERS_KEY, userId); } // 獲取在線用戶數(shù) public Long getOnlineCount() { return redisTemplate.opsForSet().size(ONLINE_USERS_KEY); } // 獲取所有在線用戶ID public Set<String> getOnlineUsers() { return redisTemplate.opsForSet().members(ONLINE_USERS_KEY); } }
2. 控制器示例
創(chuàng)建一個控制器,用于測試上述功能:
import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/online") public class OnlineUserController { private final OnlineUserService onlineUserService; public OnlineUserController(OnlineUserService onlineUserService) { this.onlineUserService = onlineUserService; } @PostMapping("/login/{userId}") public String login(@PathVariable String userId) { onlineUserService.login(userId); return userId + " 已登錄"; } @PostMapping("/logout/{userId}") public String logout(@PathVariable String userId) { onlineUserService.logout(userId); return userId + " 已退出"; } @GetMapping("/count") public Long getCount() { return onlineUserService.getOnlineCount(); } @GetMapping("/users") public Set<String> getUsers() { return onlineUserService.getOnlineUsers(); } }
方案2:使用Redis Bitmap實現(xiàn)按位存儲
1. Bitmap操作Service
創(chuàng)建一個專門用于Bitmap操作的Service:
import org.springframework.data.redis.connection.RedisStringCommands; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @Service public class OnlineUserBitmapService { private static final String ONLINE_USERS_BITMAP_KEY = "online_users_bitmap"; private final RedisTemplate<String, Object> redisTemplate; public OnlineUserBitmapService(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } // 用戶登錄(userId需為Long類型) public void login(Long userId) { redisTemplate.execute((RedisCallback<Boolean>) connection -> connection.setBit(ONLINE_USERS_BITMAP_KEY.getBytes(), userId, true)); } // 用戶退出 public void logout(Long userId) { redisTemplate.execute((RedisCallback<Boolean>) connection -> connection.setBit(ONLINE_USERS_BITMAP_KEY.getBytes(), userId, false)); } // 檢查用戶是否在線 public Boolean isOnline(Long userId) { return redisTemplate.execute((RedisCallback<Boolean>) connection -> connection.getBit(ONLINE_USERS_BITMAP_KEY.getBytes(), userId)); } // 獲取在線用戶數(shù) public Long getOnlineCount() { return redisTemplate.execute((RedisCallback<Long>) connection -> connection.bitCount(ONLINE_USERS_BITMAP_KEY.getBytes())); } // 統(tǒng)計指定范圍內(nèi)的在線用戶數(shù) public Long getOnlineCount(long start, long end) { return redisTemplate.execute((RedisCallback<Long>) connection -> connection.bitCount(ONLINE_USERS_BITMAP_KEY.getBytes(), start, end)); } }
2. 控制器示例
創(chuàng)建對應(yīng)的控制器:
import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/online/bitmap") public class OnlineUserBitmapController { private final OnlineUserBitmapService onlineUserBitmapService; public OnlineUserBitmapController(OnlineUserBitmapService onlineUserBitmapService) { this.onlineUserBitmapService = onlineUserBitmapService; } @PostMapping("/login/{userId}") public String login(@PathVariable Long userId) { onlineUserBitmapService.login(userId); return userId + " 已登錄"; } @PostMapping("/logout/{userId}") public String logout(@PathVariable Long userId) { onlineUserBitmapService.logout(userId); return userId + " 已退出"; } @GetMapping("/count") public Long getCount() { return onlineUserBitmapService.getOnlineCount(); } @GetMapping("/{userId}") public Boolean isOnline(@PathVariable Long userId) { return onlineUserBitmapService.isOnline(userId); } }
使用建議
1. Set方案的適用場景
- 當(dāng)需要精確統(tǒng)計在線用戶數(shù)量,并且能夠獲取在線用戶列表時,可以使用Set方案。
- 適合用戶規(guī)模在百萬級別以下的情況,因為Set會存儲每個用戶的ID。
2. Bitmap方案的適用場景
- 若用戶ID是連續(xù)的整數(shù)(或者可以映射為連續(xù)整數(shù)),Bitmap方案會更節(jié)省內(nèi)存。
- 對于大規(guī)模用戶(比如億級)的在線統(tǒng)計,Bitmap方案具有明顯優(yōu)勢。
- 示例中使用
Long
類型的userId
,在實際應(yīng)用中,你可能需要一個ID映射器,將業(yè)務(wù)ID轉(zhuǎn)換為連續(xù)的整數(shù)。
到此這篇關(guān)于SpringBoot運用Redis統(tǒng)計用戶在線數(shù)量的兩種方法實現(xiàn)的文章就介紹到這了,更多相關(guān)Spring Boot Redis統(tǒng)計用戶在線內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot項目Redis統(tǒng)計在線用戶的實現(xiàn)示例
- SpringBoot+Redis Bitmap實現(xiàn)活躍用戶統(tǒng)計
- SpringBoot+Redis?BitMap實現(xiàn)簽到與統(tǒng)計的項目實踐
- 微服務(wù)Spring Boot 整合 Redis 實現(xiàn)UV 數(shù)據(jù)統(tǒng)計的詳細過程
- 微服務(wù)?Spring?Boot?整合?Redis?BitMap?實現(xiàn)?簽到與統(tǒng)計功能
- SpringBoot整合Redis實現(xiàn)訪問量統(tǒng)計的示例代碼
- SpringBoot使用Redis的zset統(tǒng)計在線用戶信息
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之快速冪的實現(xiàn)
快速冪是用來解決求冪運算的高效方式。本文將詳細為大家介紹如何利用Java實現(xiàn)快速冪,以及利用快速冪求解冪運算問題,需要的可以參考一下2022-03-03Spring Boot應(yīng)用的極速部署腳本示例代碼
最近在工作中遇到了一個問題,需要極速的部署Spring Boot應(yīng)用,發(fā)現(xiàn)網(wǎng)上這方面的資料較少,所以自己來總結(jié)下,這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用的極速部署腳本的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08MyBatis注解方式之@Update/@Delete使用詳解
這篇文章主要介紹了MyBatis注解方式之@Update/@Delete使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11