利用Redis实现亿级别用户登录统计(活跃度以及登录次数统计)


用: 位图法 bit-map

Log0721:  ‘011001...............0’

 

......

log0726 :   ‘011001...............0’

Log0727 :  ‘0110000.............1’

 

 

1: 记录用户登陆:

每天按日期生成一个位图, 用户登陆后,把user_id位上的bit值置为1

 

2: 把1周的位图  and 计算,

位上为1的,即是连续登陆的用户

 

 

redis 127.0.0.1:6379> setbit mon 100000000 0

(integer) 0

redis 127.0.0.1:6379> setbit mon 3 1

(integer) 0

redis 127.0.0.1:6379> setbit mon 5 1

(integer) 0

redis 127.0.0.1:6379> setbit mon 7 1

(integer) 0

redis 127.0.0.1:6379> setbit thur 100000000 0

(integer) 0

redis 127.0.0.1:6379> setbit thur 3 1

(integer) 0

redis 127.0.0.1:6379> setbit thur 5 1

(integer) 0

redis 127.0.0.1:6379> setbit thur 8 1

(integer) 0

redis 127.0.0.1:6379> setbit wen 100000000 0

(integer) 0

redis 127.0.0.1:6379> setbit wen 3 1

(integer) 0

redis 127.0.0.1:6379> setbit wen 4 1

(integer) 0

redis 127.0.0.1:6379> setbit wen 6 1

(integer) 0

redis 127.0.0.1:6379> bitop and  res mon feb wen

(integer) 12500001

 

 

如上例,优点:

1: 节约空间, 1亿人每天的登陆情况,用1亿bit,约1200WByte,约10M 的字符就能表示

2: 计算方便

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是实现步骤: 1. 首先需要在 pom.xml 中添加 Redis 相关的依赖,例如:jedis、spring-boot-starter-data-redis 等。 2. 在 application.properties 文件中配置 Redis 相关信息,如下: ``` spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= ``` 3. 创建一个 User 类,用于存储用户信息,例如:用户 id、用户名、密码等。 ``` public class User { private String id; private String username; private String password; // getter 和 setter 方法省略 } ``` 4. 创建一个 UserService 类,用于操作 Redis 存储用户信息。具体包括以下方法: - saveUser(User user):将用户信息存储到 Redis 中。 - getUserById(String id):根据用户 id 从 Redis 中获取用户信息。 - deleteUserById(String id):根据用户 id 从 Redis 中删除用户信息。 示例代码如下: ``` @Service public class UserService { @Autowired private StringRedisTemplate redisTemplate; private static final String REDIS_KEY_PREFIX = "user:"; public void saveUser(User user) { String key = REDIS_KEY_PREFIX + user.getId(); redisTemplate.opsForHash().put(key, "id", user.getId()); redisTemplate.opsForHash().put(key, "username", user.getUsername()); redisTemplate.opsForHash().put(key, "password", user.getPassword()); } public User getUserById(String id) { String key = REDIS_KEY_PREFIX + id; String username = (String) redisTemplate.opsForHash().get(key, "username"); String password = (String) redisTemplate.opsForHash().get(key, "password"); User user = new User(); user.setId(id); user.setUsername(username); user.setPassword(password); return user; } public void deleteUserById(String id) { String key = REDIS_KEY_PREFIX + id; redisTemplate.delete(key); } } ``` 5. 在登录接口中,验证用户信息是否正确,并将用户信息保存到 Redis 中。示例代码如下: ``` @RestController public class LoginController { @Autowired private UserService userService; @PostMapping("/login") public String login(@RequestBody User user) { // 验证用户信息是否正确 if (!"admin".equals(user.getUsername()) || !"123456".equals(user.getPassword())) { return "用户名或密码错误"; } // 将用户信息存储到 Redis 中 userService.saveUser(user); return "登录成功"; } } ``` 6. 在需要验证用户信息的接口中,从 Redis 中获取用户信息,并验证用户是否已登录。示例代码如下: ``` @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/user") public String getUser(@RequestParam String userId, HttpServletRequest request) { // 从 Redis 中获取用户信息 User user = userService.getUserById(userId); if (user == null) { return "用户不存在"; } // 验证用户是否已登录 String sessionId = request.getSession().getId(); String loginUserId = redisTemplate.opsForValue().get("login:" + sessionId); if (!userId.equals(loginUserId)) { return "用户登录"; } // TODO:返回用户信息 } } ``` 以上就是使用 Spring Boot 和 Redis 实现用户登录用户信息存储以及验证的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值