文章目录
- 背景
- 加锁实现
- 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
特点:
- incr的自增是原子性的,是线程安全的,同一时间点只能有一个线程修改。
- 返回值是自增之后的值。
- 操作简单,直接执行指令获取返回值就行了。