Add Redis support

This commit is contained in:
2026-04-20 16:42:53 +03:00
parent 95768e8dfd
commit f4146ea167
4 changed files with 78 additions and 3 deletions
+7 -1
View File
@@ -26,4 +26,10 @@ INFLUXDB3_DATABASE=sensors
MONGO_ACTIVE=false
MONGO_URI=mongodb://localhost:27017
MONGO_DB=movie_data
MONGO_COLLECTION=movies
MONGO_COLLECTION=movies
REDIS_ACTIVE=false
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASS=
+10 -2
View File
@@ -1,6 +1,6 @@
### Пример приложения для работы с БД
Небольшое десктоп-приложение на PyQt5 для работы с PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core и MongoDB.
Небольшое десктоп-приложение на PyQt5 для работы с PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core, MongoDB и Redis.
### Стек
@@ -10,6 +10,7 @@
- Apache AGE — графовая БД в рамках PostgreSQL
- InfluxDB 3 Core — БД временных рядов
- MongoDB (pymongo) — документ-ориентированная БД
- Redis (redis-py) — in-memory key-value БД
### Скриншоты
@@ -29,6 +30,7 @@
- Для Apache AGE: установленное расширение `age` в PostgreSQL и доступ к базе, где оно включено
- Для InfluxDB 3 Core: запущенный сервер, заранее созданная база и токен с правами на запись и чтение
- Для MongoDB: запущенный MongoDB сервер и доступ к целевой базе
- Для Redis: запущенный Redis сервер и доступ к нему
### Настройка окружения
@@ -67,6 +69,12 @@ MONGO_ACTIVE=false # включить MongoDB, установив true
MONGO_URI=mongodb://localhost:27017
MONGO_DB=movie_data
MONGO_COLLECTION=movies
REDIS_ACTIVE=false # включить Redis, установив true
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASS=
```
2. Создайте и активируйте виртуальное окружение:
@@ -101,4 +109,4 @@ pip install -r requirements.txt
py main.py
```
Для PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core и MongoDB запросы выполняются только при `*_ACTIVE=true`.
Для PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core, MongoDB и Redis запросы выполняются только при `*_ACTIVE=true`.
+60
View File
@@ -12,6 +12,7 @@ from PyQt5.QtCore import QSize, Qt
from PyQt5.QtWidgets import QApplication, QGridLayout, QHeaderView, QMainWindow, QTableWidget, QTableWidgetItem, QWidget
MongoClient = importlib.import_module("pymongo").MongoClient
Redis = importlib.import_module("redis").Redis
load_dotenv()
@@ -45,6 +46,12 @@ MONGO_URI = os.getenv("MONGO_URI", "mongodb://localhost:27017")
MONGO_DB = os.getenv("MONGO_DB", "movie_data")
MONGO_COLLECTION = os.getenv("MONGO_COLLECTION", "movies")
REDIS_ACTIVE = os.getenv("REDIS_ACTIVE", "false").lower() == "true"
REDIS_HOST = os.getenv("REDIS_HOST", "localhost")
REDIS_PORT = int(os.getenv("REDIS_PORT", "6379"))
REDIS_DB = int(os.getenv("REDIS_DB", "0"))
REDIS_PASS = os.getenv("REDIS_PASS")
USER_SEED_DATA = [
(1, "Ivan", 15),
(2, "Igor", 22),
@@ -239,6 +246,46 @@ def select_mongo_movies(collection):
return [document["title"] for document in cursor]
def connect_redis():
return Redis(
host=REDIS_HOST,
port=REDIS_PORT,
db=REDIS_DB,
password=REDIS_PASS if REDIS_PASS else None,
decode_responses=True,
)
def insert_redis_movies(client):
if client.exists("movies:seeded"):
print("Redis data is already seeded.")
return
seed_movies = {
"Apollo 13": 1995,
"The Matrix": 1999,
"City of Angels": 1998,
"Toy Story": 1995,
"Alien": 1979,
}
for title, released in seed_movies.items():
client.hset(f"movie:{title}", mapping={"title": title, "released": released})
client.set("movies:seeded", "1")
print("Redis movies inserted.")
def select_redis_movies(client):
titles = []
for key in client.scan_iter(match="movie:*"):
movie = client.hgetall(key)
if not movie:
continue
released = int(movie.get("released", 0))
if 1990 <= released < 2000:
titles.append(movie.get("title", ""))
return sorted(title for title in titles if title)
def load_users():
admin_conn = connect_postgres("postgres")
try:
@@ -428,4 +475,17 @@ if __name__ == "__main__":
except Exception as error:
print(f"MongoDB load failed: {error}")
if REDIS_ACTIVE:
try:
redis_client = connect_redis()
insert_redis_movies(redis_client)
redis_movies = select_redis_movies(redis_client)
redis_window = DataWindow("redis", ["Info"], main_window, len(graph_windows))
redis_window.load_data([(title,) for title in redis_movies])
redis_window.show()
graph_windows.append(redis_window)
except Exception as error:
print(f"Redis load failed: {error}")
sys.exit(app.exec())
+1
View File
@@ -4,3 +4,4 @@ PyQt5
python-dotenv
influxdb3-python
pymongo
redis