Skip to content

Commit bfa5c4d

Browse files
committed
feat: expire time for key
1 parent ae101bd commit bfa5c4d

File tree

16 files changed

+1277
-84
lines changed

16 files changed

+1277
-84
lines changed

client/client_main.cc

Lines changed: 57 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,72 @@
11
#include <iostream>
22
#include "kvclient.h"
33

4-
int main(int argc, char** argv) {
5-
KVClient* kvclient = new KVClient("127.0.0.1", 6789);
6-
int res = kvclient->setKV("yunfei", "23", MiniKV_STRING);
4+
void testExpire(KVClient* c) {
5+
int res = c->setKV("yunfei", "23", MiniKV_STRING);
76
if (res == MiniKV_SET_SUCCESS) {
87
fprintf(stdout, "set key success!\n");
98
} else {
109
fprintf(stderr, "set key failed!\n");
1110
exit(1);
1211
}
13-
GetRes ans = kvclient->getK("yunfei");
14-
if (ans.encoding == MiniKV_GET_SUCCESS) {
15-
fprintf(stdout, "get key success!\n");
12+
GetRes ans = c->getK("yunfei");
13+
std::cout << ans.data[0] << std::endl;
14+
res = c->setExpires("yunfei", 1000);
15+
if (res == MiniKV_SET_EXPIRE_SUCCESS) {
16+
fprintf(stdout, "set expire success!\n");
1617
} else {
17-
fprintf(stderr, "get key failed!\n");
18+
fprintf(stderr, "set expire failed!\n");
1819
exit(1);
1920
}
20-
for (int i = 0; i < ans.data.size(); ++i) {
21-
std::cout << ans.data[i] << " ";
22-
}std::cout << std::endl;
21+
sleep(3);
22+
ans = c->getK("yunfei");
23+
std::cout << (ans.data.empty() ? "expired" : "expire doesn't work") << std::endl;
24+
}
2325

24-
res = kvclient->setKV("qjx", "23", MiniKV_LIST);
25-
if (res == MiniKV_SET_SUCCESS) {
26-
fprintf(stdout, "set key success!\n");
27-
} else {
28-
fprintf(stderr, "set key failed!\n");
29-
exit(1);
30-
}
31-
res = kvclient->setKV("qjx", "24", MiniKV_LIST);
32-
if (res == MiniKV_SET_SUCCESS) {
33-
fprintf(stdout, "set key success!\n");
34-
} else {
35-
fprintf(stderr, "set key failed!\n");
36-
exit(1);
37-
}
38-
ans = kvclient->getK("qjx");
39-
if (ans.encoding == MiniKV_GET_SUCCESS) {
40-
fprintf(stdout, "get key success!\n");
41-
} else {
42-
fprintf(stderr, "get key failed!\n");
43-
exit(1);
44-
}
45-
for (int i = 0; i < ans.data.size(); ++i) {
46-
std::cout << ans.data[i] << " ";
47-
} std::cout << std::endl;
26+
int main(int argc, char** argv) {
27+
KVClient* kvclient = new KVClient("127.0.0.1", 6789);
28+
testExpire(kvclient);
29+
// int res = kvclient->setKV("yunfei", "23", MiniKV_STRING);
30+
// if (res == MiniKV_SET_SUCCESS) {
31+
// fprintf(stdout, "set key success!\n");
32+
// } else {
33+
// fprintf(stderr, "set key failed!\n");
34+
// exit(1);
35+
// }
36+
// GetRes ans = kvclient->getK("yunfei");
37+
// if (ans.encoding == MiniKV_GET_SUCCESS) {
38+
// fprintf(stdout, "get key success!\n");
39+
// } else {
40+
// fprintf(stderr, "get key failed!\n");
41+
// exit(1);
42+
// }
43+
// for (int i = 0; i < ans.data.size(); ++i) {
44+
// std::cout << ans.data[i] << " ";
45+
// }std::cout << std::endl;
46+
47+
// res = kvclient->setKV("qjx", "23", MiniKV_LIST);
48+
// if (res == MiniKV_SET_SUCCESS) {
49+
// fprintf(stdout, "set key success!\n");
50+
// } else {
51+
// fprintf(stderr, "set key failed!\n");
52+
// exit(1);
53+
// }
54+
// res = kvclient->setKV("qjx", "24", MiniKV_LIST);
55+
// if (res == MiniKV_SET_SUCCESS) {
56+
// fprintf(stdout, "set key success!\n");
57+
// } else {
58+
// fprintf(stderr, "set key failed!\n");
59+
// exit(1);
60+
// }
61+
// ans = kvclient->getK("qjx");
62+
// if (ans.encoding == MiniKV_GET_SUCCESS) {
63+
// fprintf(stdout, "get key success!\n");
64+
// } else {
65+
// fprintf(stderr, "get key failed!\n");
66+
// exit(1);
67+
// }
68+
// for (int i = 0; i < ans.data.size(); ++i) {
69+
// std::cout << ans.data[i] << " ";
70+
// } std::cout << std::endl;
4871
return 0;
4972
}

client/kvclient.cc

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,21 @@ GetRes KVClient::getK(std::string key) {
5555
}
5656
ans.data = data;
5757
return ans;
58+
}
59+
60+
int KVClient::setExpires(std::string key, uint64_t millisecond) {
61+
auto now = std::chrono::system_clock::now();
62+
auto timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();
63+
uint64_t expires = timestamp + millisecond;
64+
kv::ReqExpire req;
65+
kv::SetExpireResponse res;
66+
req.set_key(key);
67+
req.set_expires(expires);
68+
grpc::ClientContext context;
69+
grpc::Status status = stub_->SetExpire(&context, req, &res);
70+
if (!status.ok() || res.flag() == false) {
71+
// TODO: log
72+
return MiniKV_SET_EXPIRE_FAIL;
73+
}
74+
return MiniKV_SET_EXPIRE_SUCCESS;
5875
}

client/kvclient.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class KVClient {
1717

1818
int setKV(std::string key, std::string val, uint32_t encoding);
1919
int delK(std::string key);
20+
int setExpires(std::string key, uint64_t millisecond);
2021
GetRes getK(std::string key);
2122
private:
2223
std::unique_ptr<kv::KVServer::Stub> stub_;

minikv.rdb

-27 Bytes
Binary file not shown.

proto/kvserver.grpc.pb.cc

Lines changed: 42 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)