利用redis在集群的情况下生成全局唯一时间戳

如题,需要保证两点:

  • 唯一
  • 原子操作

当时间戳相同的情况下,需要对其做+1操作以保证唯一
使用lua脚本保证原子操作

1
2
3
4
5
6
7
8
9
10
local newTS = 0;
if (redis.call('exists', KEYS[1]) == 1) then
newTS = redis.call('get', KEYS[1]);
end
if (newTS < ARGV[1]) then
newTS = ARGV[1];
end
newTS = newTS + 1;
redis.call('set', KEYS[1], newTS);
return redis.call('get', KEYS[1]);

其中KEY[1]为保存时间戳的key, 可自定义任意值
ARGV[1] 为客户端本地取得的当前毫秒戳

java泛型中,extends和super

三个基本类型定义

1
2
3
4
5
class Parent {}

class SubA extends Parent {}

class SubB extends Parent {}

extends

1
2
3
4
List<? extends Parent> list = new ArrayList<>();
// 报错
list.add(new SubA());
list.add(new SubB());

报错原因:
extends 指定类型的上界,什么意思呢?
即:? extends Parent 表示Parent的子类,但是具体不能确定是哪个子类
List<? extends Parent> 可能是List<SubA>, List<SubB>, 所以add报错

super

1
2
3
List<? super Parent> list = new ArrayList<>();
list.add(new SubA());
list.add(new SubB());

编译通过,原因:
super指定类型的下界
即: ? super Parent 表示类型只能为Parent或Parent的父类, 那么当添加元素时,由于子类可以转换为父类,所以只要是Parent的子类,都可以添加成功
List<? super Parent> 可能是List<Parent>, List<Object>, 所以,add时,作为Parent的子类, 自然不会报错

Remark:用自己最能理解的方式表达出来!
Remark Again: ? super Parent & ? extends Parent表示的是传给List的泛型参数,将其作为一个整体来看待的话

flowcharttest

参考链接

st=>start: Start|past:>http://www.google.com[blank] e=>end: End:>http://www.google.com op1=>operation: My Operation|past op2=>operation: Stuff|current sub1=>subroutine: My Subroutine|invalid cond=>condition: Yes or No?|approved:>http://www.google.com c2=>condition: Good idea|rejected io=>inputoutput: catch something...|request st->op1(right)->cond cond(yes, right)->c2 cond(no)->sub1(left)->op1 c2(yes)->io->e c2(no)->op2->e

,