当前位置: 首页 > news >正文

Spring Boot:运用Redis统计用户在线数量

在Spring Boot里运用Redis统计用户在线数量。

项目依赖与配置

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实现精确统计

1. 创建Redis操作Service

编写一个Redis操作Service,用于处理用户在线状态:

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);}// 获取在线用户数public Long getOnlineCount() {return redisTemplate.opsForSet().size(ONLINE_USERS_KEY);}// 获取所有在线用户IDpublic Set<String> getOnlineUsers() {return redisTemplate.opsForSet().members(ONLINE_USERS_KEY);}
}
2. 控制器示例

创建一个控制器,用于测试上述功能:

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实现按位存储

1. Bitmap操作Service

创建一个专门用于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));}// 获取在线用户数public Long getOnlineCount() {return redisTemplate.execute((RedisCallback<Long>) connection ->connection.bitCount(ONLINE_USERS_BITMAP_KEY.getBytes()));}// 统计指定范围内的在线用户数public Long getOnlineCount(long start, long end) {return redisTemplate.execute((RedisCallback<Long>) connection ->connection.bitCount(ONLINE_USERS_BITMAP_KEY.getBytes(), start, end));}
}
2. 控制器示例

创建对应的控制器:

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方案的适用场景
  • 当需要精确统计在线用户数量,并且能够获取在线用户列表时,可以使用Set方案。
  • 适合用户规模在百万级别以下的情况,因为Set会存储每个用户的ID。
2. Bitmap方案的适用场景
  • 若用户ID是连续的整数(或者可以映射为连续整数),Bitmap方案会更节省内存。
  • 对于大规模用户(比如亿级)的在线统计,Bitmap方案具有明显优势。
  • 示例中使用Long类型的userId,在实际应用中,你可能需要一个ID映射器,将业务ID转换为连续的整数。
http://www.lqws.cn/news/497935.html

相关文章:

  • Flask学习笔记
  • 1.2、CAN总线帧格式
  • DeepSeek今天喝什么随机奶茶推荐器
  • Redis简介
  • 通过使用gitee发布项目到Maven中央仓库最新教程
  • 前端高频面试题汇总
  • 【AI 测试】测试用例设计:人工智能语言大模型性能测试用例设计
  • Qt源码分析: QChildEvent
  • Robyn高性能Web框架系列04:事件、中间件与错误处理
  • 异步IO框架io_uring实现TCP服务器
  • Postgresql中不同数据类型的长度限制
  • 用Python“看见未来”:自动驾驶感知系统实战全解析
  • 矩阵阶数(线性代数) vs. 张量维度(深度学习):线性代数与深度学习的基石辨析,再也不会被矩阵阶数给混淆了
  • react快速开始项目模板
  • 越南数学家吴宝珠恶搞式证明朗兰兹纲领
  • HTML基础结构
  • 速通KVM(云计算学习指南)
  • /var/lib/docker/overlay2目录过大怎么办
  • 深入浅出Node.js中间件机制
  • Android开发 原生设置-apps-里面隐藏应用信息
  • OpenSSL 混合加密
  • 企业级AI平台的能力架构与模块化规划
  • 大数据时代UI前端的变革:从静态展示到动态交互
  • TypeScript移动端导航工具实现
  • Arrays.asList和 List<String> list = new ArrayList<>();有什么区别
  • 飞算 JavaAI:重构 Java 开发范式的工程化实践
  • 可以把一套三维设计软件装在云服务器上5人同时并发使用吗
  • 通信网络编程3.0——JAVA
  • Deepoc大模型重构核工业智能基座:混合增强架构与安全增强决策技术​
  • Node.js 中的 JWT 认证:从生成到验证的完整指南