1
0

dispatcher.rs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. use crate::{cmd, connection::Connection, dispatcher, error::Error, value::Value};
  2. use bytes::Bytes;
  3. use std::convert::TryInto;
  4. use std::time::SystemTime;
  5. use std::time::UNIX_EPOCH;
  6. async fn do_time(_conn: &Connection, _args: &[Bytes]) -> Result<Value, Error> {
  7. let now = SystemTime::now();
  8. let since_the_epoch = now.duration_since(UNIX_EPOCH).expect("Time went backwards");
  9. let seconds = format!("{}", since_the_epoch.as_secs());
  10. let millis = format!("{}", since_the_epoch.subsec_millis());
  11. Ok(vec![seconds.as_str(), millis.as_str()].into())
  12. }
  13. async fn do_command(_conn: &Connection, _args: &[Bytes]) -> Result<Value, Error> {
  14. let now = SystemTime::now();
  15. let since_the_epoch = now.duration_since(UNIX_EPOCH).expect("Time went backwards");
  16. let in_ms: i128 =
  17. since_the_epoch.as_secs() as i128 * 1000 + since_the_epoch.subsec_millis() as i128;
  18. Ok(format!("{}", in_ms).as_str().into())
  19. }
  20. dispatcher! {
  21. list {
  22. blpop {
  23. cmd::list::blpop,
  24. [""],
  25. -3,
  26. },
  27. brpop {
  28. cmd::list::brpop,
  29. [""],
  30. -3,
  31. },
  32. lindex {
  33. cmd::list::lindex,
  34. [""],
  35. 3,
  36. },
  37. linsert {
  38. cmd::list::linsert,
  39. [""],
  40. 5,
  41. },
  42. llen {
  43. cmd::list::llen,
  44. [""],
  45. 2,
  46. },
  47. lpop {
  48. cmd::list::lpop,
  49. [""],
  50. -2,
  51. },
  52. lpos {
  53. cmd::list::lpos,
  54. [""],
  55. -2,
  56. },
  57. lpush {
  58. cmd::list::lpush,
  59. [""],
  60. -3,
  61. },
  62. lpushx {
  63. cmd::list::lpush,
  64. [""],
  65. -3,
  66. },
  67. lrange {
  68. cmd::list::lrange,
  69. [""],
  70. 4,
  71. },
  72. lrem {
  73. cmd::list::lrem,
  74. [""],
  75. 4,
  76. },
  77. rpop {
  78. cmd::list::rpop,
  79. [""],
  80. -2,
  81. },
  82. rpush {
  83. cmd::list::rpush,
  84. [""],
  85. -3,
  86. },
  87. rpushx {
  88. cmd::list::rpush,
  89. [""],
  90. -3,
  91. },
  92. },
  93. hash {
  94. hdel {
  95. cmd::hash::hdel,
  96. [""],
  97. -2,
  98. },
  99. hexists {
  100. cmd::hash::hexists,
  101. [""],
  102. 3,
  103. },
  104. hget {
  105. cmd::hash::hget,
  106. [""],
  107. 3,
  108. },
  109. hgetall {
  110. cmd::hash::hgetall,
  111. [""],
  112. 2,
  113. },
  114. hincrby {
  115. cmd::hash::hincrby::<i64>,
  116. [""],
  117. 4,
  118. },
  119. hincrbyfloat {
  120. cmd::hash::hincrby::<f64>,
  121. [""],
  122. 4,
  123. },
  124. hkeys {
  125. cmd::hash::hkeys,
  126. [""],
  127. 2,
  128. },
  129. hlen {
  130. cmd::hash::hlen,
  131. [""],
  132. 2,
  133. },
  134. hmget {
  135. cmd::hash::hmget,
  136. [""],
  137. -3,
  138. },
  139. hmset {
  140. cmd::hash::hset,
  141. [""],
  142. -3,
  143. },
  144. hrandfield {
  145. cmd::hash::hrandfield,
  146. [""],
  147. -2,
  148. },
  149. hset {
  150. cmd::hash::hset,
  151. [""],
  152. -4,
  153. },
  154. hsetnx {
  155. cmd::hash::hsetnx,
  156. [""],
  157. -4,
  158. },
  159. hstrlen {
  160. cmd::hash::hstrlen,
  161. [""],
  162. 3,
  163. },
  164. hvals {
  165. cmd::hash::hvals,
  166. [""],
  167. 2,
  168. },
  169. },
  170. keys {
  171. del {
  172. cmd::key::del,
  173. ["random" "loading" "stale"],
  174. -2,
  175. },
  176. exists {
  177. cmd::key::exists,
  178. ["read" "fast"],
  179. -2,
  180. },
  181. expire {
  182. cmd::key::expire,
  183. ["read" "write" "fast"],
  184. 3,
  185. },
  186. expireat {
  187. cmd::key::expire_at,
  188. ["read" "write" "fast"],
  189. 3,
  190. },
  191. expiretime {
  192. cmd::key::expire_time,
  193. ["read" "write" "fast"],
  194. 2,
  195. },
  196. persist {
  197. cmd::key::persist,
  198. ["write" "fast"],
  199. 2,
  200. },
  201. pexpire {
  202. cmd::key::expire,
  203. ["read" "write" "fast"],
  204. 3,
  205. },
  206. pexpireat {
  207. cmd::key::expire_at,
  208. ["read" "write" "fast"],
  209. 3,
  210. },
  211. pexpiretime {
  212. cmd::key::expire_time,
  213. ["read" "write" "fast"],
  214. 2,
  215. },
  216. pttl {
  217. cmd::key::ttl,
  218. ["read" "read"],
  219. 2,
  220. },
  221. ttl {
  222. cmd::key::ttl,
  223. ["read" "read"],
  224. 2,
  225. },
  226. },
  227. string {
  228. decr {
  229. cmd::string::decr,
  230. ["write" "denyoom" "fast"],
  231. 2,
  232. },
  233. decrby {
  234. cmd::string::decr_by,
  235. ["write" "denyoom" "fast"],
  236. 3,
  237. },
  238. get {
  239. cmd::string::get,
  240. ["random" "loading" "stale"],
  241. 2,
  242. },
  243. getdel {
  244. cmd::string::getdel,
  245. ["random" "loading" "stale"],
  246. 2,
  247. },
  248. getset {
  249. cmd::string::getset,
  250. ["random" "loading" "stale"],
  251. -3,
  252. },
  253. incr {
  254. cmd::string::incr,
  255. ["write" "denyoom" "fast"],
  256. 2,
  257. },
  258. incrby {
  259. cmd::string::incr_by,
  260. ["write" "denyoom" "fast"],
  261. 3,
  262. },
  263. incrbyfloat {
  264. cmd::string::incr_by_float,
  265. ["write" "denyoom" "fast"],
  266. 3,
  267. },
  268. mget {
  269. cmd::string::mget,
  270. ["random" "loading" "stale"],
  271. -2,
  272. },
  273. set {
  274. cmd::string::set,
  275. ["random" "loading" "stale"],
  276. -3,
  277. },
  278. setex {
  279. cmd::string::setex,
  280. ["random" "loading" "stale"],
  281. 4,
  282. },
  283. psetex {
  284. cmd::string::setex,
  285. ["random" "loading" "stale"],
  286. 4,
  287. },
  288. strlen {
  289. cmd::string::strlen,
  290. ["random" "fast"],
  291. 2,
  292. }
  293. },
  294. connection {
  295. client {
  296. cmd::client::client,
  297. ["random" "loading" "stale"],
  298. -2,
  299. },
  300. echo {
  301. cmd::client::echo,
  302. ["random" "loading" "stale"],
  303. 2,
  304. },
  305. ping {
  306. cmd::client::ping,
  307. ["random" "loading" "stale"],
  308. -1,
  309. },
  310. },
  311. server {
  312. command {
  313. do_command,
  314. ["random" "loading" "stale"],
  315. 1,
  316. },
  317. time {
  318. do_time,
  319. ["random" "loading" "stale"],
  320. 1,
  321. },
  322. }
  323. }