文章目录

  • 背景
  • 加锁实现
  • redis incr实现


背景

在游戏中每个玩家都必须要有一个唯一id来标识玩家的唯一性,很多服务器都是多线程高并发运行着的,那么此时就需要考虑多线程对资源的竞争问题,即在多线程的状态下怎样保证每个玩家的uuid都是唯一的。

加锁实现

此时有一个很简单的方法,那就是使加锁。

int getUUID(){
	lock();
	id++;
	unlock();
	return id;
}

但是为了这一行代码而去加锁的话,似乎消耗太大,有点得不偿失的感jio。

redis incr实现

所以,这里可以基于redis提供的自增id,incr来实现唯一id。

redis:6379> SET mykey "10"
"OK"
redis:6379> INCR mykey
(integer) 11
redis:6379> GET mykey
"11"

对于一个不存在的key来说会先创建,并赋值为0,然后再进行自增
redis:6379> INCR mykey2
(integer) 1

特点:

  1. incr的自增是原子性的,是线程安全的,同一时间点只能有一个线程修改。
  2. 返回值是自增之后的值。
  3. 操作简单,直接执行指令获取返回值就行了。