-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkeyserver.rb
More file actions
102 lines (87 loc) · 2.1 KB
/
keyserver.rb
File metadata and controls
102 lines (87 loc) · 2.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
require 'securerandom'
require 'redis'
require 'time'
require_relative 'settings'
#set - UNBLOCKED
#sorted set - BLOCKED
class KeyServer
def initialize(redis)
@redis = redis
end
def generate #O(1)
random_key = SecureRandom.hex
if random_key.nil?
return "Key Generation failed"
else
@redis.setex(random_key,Settings::TIME_TO_LIVE,Time.now)
@redis.set(random_key,Time.now)
@redis.sadd('UNBLOCKED',random_key)
@redis.set(random_key,Time.now)
return "Key Generated"
end
end
def get #O(logn)
key = @redis.spop('UNBLOCKED')
while redis.exists(key)==nil do
key = self.@redis.spop('UNBLOCKED')
end
if key.nil?
temp_array = @redis.zrange('BLOCKED',0,0) # pop last from sorted set
temp_key = temp_array[0]
if temp_key.nil?
return "No Key"
else
if good?(temp_key)
@redis.set(temp_key,Time.now)
@redis.zadd('BLOCKED',@redis.get(temp_key).to_f,temp_key) #push it again
return temp_key
else
return "No Key"
end
end
else
@redis.set(key,Time.now)
@redis.zadd('BLOCKED',@redis.get(key).to_f,key)
return key
end
end
def unblock(key) #O(logn)
if @redis.exists(key)
@redis.zrem('BLOCKED',key)
@redis.sadd('UNBLOCKED',key)
@redis.set(key,Time.now)
"Key unblocked"
else
"Key not exists"
end
end
def delete(key) #O(logn)
if @redis.exists(key)
if @redis.del(key)==1
if @redis.sismember('UNBLOCK',key)
@redis.srem('UNBLOCKED',key)
else
@redis.zrem('BLOCKED',key)
end
"Key deleted"
else
"Key unable to delete"
end
else
"Key not exists"
end
end
def keep_alive(key) #O(1)
if @redis.exists(key)
@redis.setex(key,Settings::TIME_TO_LIVE,Time.now)
@redis.set(key,Time.now)
"Key life extended"
else
"Key not exists"
end
end
def good?(key)
time_touched = @redis.get(key)
return (Time.parse(time_touched)-Time.now).abs >= Settings::T_EXPIRE
end
end