forked from sushmaratakonda/python-backend-testing
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcache.py
More file actions
262 lines (207 loc) · 7.22 KB
/
Copy pathcache.py
File metadata and controls
262 lines (207 loc) · 7.22 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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
from flask import Flask, request, jsonify
from flask_cors import CORS
import mysql.connector
from mysql.connector import Error
import redis
import json
app = Flask(__name__)
CORS(app)
# =========================
# REDIS CONFIG
# =========================
redis_client = redis.Redis(
host='veera-6nsjc1.serverless.use1.cache.amazonaws.com',
port=6379,
ssl=True,
decode_responses=True,
socket_timeout=5
)
CACHE_TTL = 90
# =========================
# RDS CONFIG (DEV ONLY)
# =========================
db_write_config = {
'host': 'database-1.c8lweogi44to.us-east-1.rds.amazonaws.com',
'user': 'admin',
'password': 'cloud123',
'database': 'dev'
}
db_read_config = {
'host': 'reader.c8lweogi44to.us-east-1.rds.amazonaws.com',
'user': 'admin',
'password': 'cloud123',
'database': 'dev'
}
# =========================
# CONNECTION HELPERS
# =========================
def get_write_connection():
print("✍️ CONNECTING TO RDS WRITER")
return mysql.connector.connect(**db_write_config)
def get_read_connection():
print("👀 CONNECTING TO RDS READER")
return mysql.connector.connect(**db_read_config)
def get_db_info(cursor):
cursor.execute("SELECT @@hostname AS host, @@read_only AS read_only")
return cursor.fetchone()
# =========================
# ROUTES
# =========================
@app.route('/')
def index():
return "API running with Redis + RDS (Reader/Writer)"
# =========================
# READ APIs
# =========================
@app.route('/users', methods=['GET'])
def get_users():
cache_key = "users:all"
try:
# 1️⃣ Redis check
cached_data = redis_client.get(cache_key)
if cached_data:
print("⚡ REDIS CACHE HIT → /users")
return jsonify({
"data": json.loads(cached_data),
"source": "REDIS_CACHE",
"db_role": "READER"
})
print("❌ REDIS CACHE MISS → /users")
# 2️⃣ RDS Reader
conn = get_read_connection()
cursor = conn.cursor(dictionary=True)
cursor.execute("SELECT * FROM users")
users = cursor.fetchall()
db_info = get_db_info(cursor)
print(f"📖 READ FROM RDS READER → host={db_info['host']}")
# 3️⃣ Cache result
redis_client.setex(cache_key, CACHE_TTL, json.dumps(users))
print("📦 DATA STORED IN REDIS CACHE")
return jsonify({
"data": users,
"served_by": db_info["host"],
"read_only": db_info["read_only"],
"db_role": "READER",
"source": "RDS_READER"
})
except Error as err:
print("❌ ERROR:", err)
return jsonify({'error': str(err)}), 500
finally:
if 'cursor' in locals():
cursor.close()
if 'conn' in locals():
conn.close()
@app.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
cache_key = f"user:{user_id}"
try:
cached_data = redis_client.get(cache_key)
if cached_data:
print(f"⚡ REDIS CACHE HIT → /users/{user_id}")
return jsonify({
"data": json.loads(cached_data),
"source": "REDIS_CACHE",
"db_role": "READER"
})
print(f"❌ REDIS CACHE MISS → /users/{user_id}")
conn = get_read_connection()
cursor = conn.cursor(dictionary=True)
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
user = cursor.fetchone()
if not user:
print("⚠️ USER NOT FOUND IN DB")
return jsonify({'error': 'User not found'}), 404
db_info = get_db_info(cursor)
print(f"📖 READ FROM RDS READER → host={db_info['host']}")
redis_client.setex(cache_key, CACHE_TTL, json.dumps(user))
print("📦 USER STORED IN REDIS CACHE")
return jsonify({
"data": user,
"served_by": db_info["host"],
"read_only": db_info["read_only"],
"db_role": "READER",
"source": "RDS_READER"
})
except Error as err:
print("❌ ERROR:", err)
return jsonify({'error': str(err)}), 500
finally:
if 'cursor' in locals():
cursor.close()
if 'conn' in locals():
conn.close()
# =========================
# WRITE APIs
# =========================
@app.route('/users/add', methods=['POST'])
def add_user():
try:
print("✍️ WRITE REQUEST → /users/add")
conn = get_write_connection()
cursor = conn.cursor()
data = request.json
cursor.execute(
"INSERT INTO users (name, email) VALUES (%s, %s)",
(data['name'], data['email'])
)
conn.commit()
print("✅ WRITE SUCCESSFUL ON RDS WRITER")
# Cache invalidation
redis_client.delete("users:all")
print("🧹 CACHE INVALIDATED → users:all")
return jsonify({'message': 'User added successfully'}), 201
except Error as err:
print("❌ WRITE ERROR:", err)
return jsonify({'error': str(err)}), 500
finally:
cursor.close()
conn.close()
@app.route('/users/update/<int:user_id>', methods=['PUT'])
def update_user(user_id):
try:
print(f"✍️ WRITE REQUEST → /users/update/{user_id}")
conn = get_write_connection()
cursor = conn.cursor()
data = request.json
cursor.execute(
"UPDATE users SET name = %s, email = %s WHERE id = %s",
(data['name'], data['email'], user_id)
)
conn.commit()
print("✅ UPDATE SUCCESSFUL ON RDS WRITER")
redis_client.delete("users:all")
redis_client.delete(f"user:{user_id}")
print("🧹 CACHE INVALIDATED → users:all, user:{user_id}")
return jsonify({'message': 'User updated successfully'})
except Error as err:
print("❌ UPDATE ERROR:", err)
return jsonify({'error': str(err)}), 500
finally:
cursor.close()
conn.close()
@app.route('/users/delete/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):
try:
print(f"✍️ WRITE REQUEST → /users/delete/{user_id}")
conn = get_write_connection()
cursor = conn.cursor()
cursor.execute("DELETE FROM users WHERE id = %s", (user_id,))
conn.commit()
print("✅ DELETE SUCCESSFUL ON RDS WRITER")
redis_client.delete("users:all")
redis_client.delete(f"user:{user_id}")
print("🧹 CACHE INVALIDATED → users:all, user:{user_id}")
return jsonify({'message': 'User deleted successfully'})
except Error as err:
print("❌ DELETE ERROR:", err)
return jsonify({'error': str(err)}), 500
finally:
cursor.close()
conn.close()
# =========================
# ENTRY POINT
# =========================
if __name__ == '__main__':
print("🚀 Starting Flask API with Redis + RDS")
app.run(host='0.0.0.0', port=5000, debug=True)