RandomService.java
package org.example.testjedis;
import java.util.Random;
public class RandomService {
private static final Random r = new Random();
public static int rand(int start, int end) {
return Math.abs(r.nextInt()) % (end - start + 1) + start;
}
}
RoomIdService.java
package org.example.testjedis;
import redis.clients.jedis.Jedis;
public class RoomIdService {
private static final int beganRoomId = 111111;
private static final int endRoomId = 999999;
private static final String ROOM_ID_KEY = "roomid";
public static int getRoomId() {
int roomId = -1;
long ret = 0;
int count = 0;
while (ret == 0) {
roomId = RandomService.rand(beganRoomId, endRoomId);
try (Jedis jedis = new Jedis()) {
ret = jedis.hsetnx(ROOM_ID_KEY, String.valueOf(roomId), "1");
}
// 没找到,则说明房间号紧缺,创建房间号失败. 基本不会发生这样的情况
if (ret == 0) {
if (++count > 1000) {
roomId = -1;
break;
}
}
}
return roomId;
}
public static boolean delRoomId(int roomId) {
long del = 0;
try (Jedis jedis = new Jedis()) {
del = jedis.hdel(ROOM_ID_KEY, String.valueOf(roomId));
}
return del == 1;
}
public static void clearAllRoomId() {
System.out.println("开始清理房间号...");
try (Jedis jedis = new Jedis()) {
jedis.del(ROOM_ID_KEY);
}
System.out.println("清理房间号结束...");
}
public static int getUsedRoomIdSize() {
long len = 0;
try (
Jedis jedis = new Jedis()
) {
len = jedis.hlen(ROOM_ID_KEY);
}
return (int) len;
}
}
Main.java
package org.example.testjedis;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
RoomIdService.clearAllRoomId();
Set roomIdSet = new HashSet<>();
for (int i = 0; i < 88; i++) {
int roomId = RoomIdService.getRoomId();
if (roomId > 0) {
roomIdSet.add(roomId);
} else {
System.err.println("创建房间失败");
}
}
System.out.println(roomIdSet);
System.out.println(roomIdSet.size());
System.out.println(RoomIdService.getUsedRoomIdSize());
}
}
总结:对于全球同服这种,房间号统一管理用redis则非常方便



