1 | N = require '../..'
|
2 | redis = require \redis
|
3 | Debug = require '../Helpers/Debug'
|
4 |
|
5 | debug-cache = new Debug 'N::Resource::Cache'
|
6 |
|
7 | class RedisCache
|
8 |
|
9 | ({host = '127.0.0.1', port = 6379, database = 0}) ->
|
10 |
|
11 | @client = redis.createClient {host, port}
|
12 | @client.select database
|
13 | @client.flushdb()
|
14 |
|
15 | Get: (name, done) ->
|
16 | @client.get name, (err, reply) ->
|
17 | return done err if err?
|
18 |
|
19 | done null, reply
|
20 |
|
21 | Set: (name, value, done) ->
|
22 | @client.set name, value, (err, reply) ~>
|
23 | return done err if err?
|
24 |
|
25 | @client.expire(name, 3600);
|
26 | done null, reply
|
27 |
|
28 | Delete: (name, done) ->
|
29 | @client.del name, (err, reply) ~>
|
30 | return done err if err?
|
31 |
|
32 | done null, reply
|
33 |
|
34 | Reset: ->
|
35 | @client.flushdb()
|
36 |
|
37 | class MemCache
|
38 |
|
39 | ->
|
40 | @client = {}
|
41 |
|
42 | Get: (name, done) ->
|
43 | if @client[name]?
|
44 | return done null, reply
|
45 |
|
46 | done!
|
47 |
|
48 | Set: (name, value, done) ->
|
49 | @client[name] = value
|
50 |
|
51 | done!
|
52 |
|
53 | Delete: (name, done) ->
|
54 | delete @client[name]
|
55 |
|
56 | done!
|
57 |
|
58 | Reset: ->
|
59 | @client = {}
|
60 |
|
61 |
|
62 | class Cache
|
63 |
|
64 | ->
|
65 | if N.config?.cache?.type is \Redis or N.config?.cache is \Redis
|
66 | debug-cache.Warn 'Redis cache init'
|
67 | @client = new RedisCache N.config.cache if not is-type \String N.config.cache
|
68 | @client = new RedisCache {} if is-type \String N.config.cache
|
69 | else if N.config?.cache?.type is \Mem or N.config?.cache is \Mem
|
70 | debug-cache.Warn 'Mem cache init'
|
71 | @client = new MemCache
|
72 | else
|
73 | debug-cache.Warn 'No cache activated'
|
74 |
|
75 | Get: (name, done) ->
|
76 | return done! if not @client?
|
77 | @client.Get name, (err, reply) ->
|
78 | return done! done err if err?
|
79 |
|
80 | debug-cache.Warn 'Cache answered for ' + name
|
81 | done null, reply
|
82 |
|
83 | Set: (name, value, done) ->
|
84 | return done! if not @client?
|
85 | @client.Set name, value, (err, reply) ~>
|
86 | return done! done err if err?
|
87 |
|
88 | debug-cache.Warn 'Cache updated for ' + name
|
89 | done null, reply
|
90 |
|
91 | Delete: (name, done) ->
|
92 | return done! if not @client?
|
93 | @client.Delete name, (err, reply) ~>
|
94 | return done! done err if err?
|
95 |
|
96 | debug-cache.Warn 'Cache deleted for ' + name
|
97 | done null, reply
|
98 |
|
99 | Reset: ->
|
100 | return if not @client?
|
101 | @client.Reset!
|
102 |
|
103 | module.exports = new Cache
|