از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
کار با Redis در پایتون با جنگو
سرفصلهای مطلب
معرفی
داده ها به طور فزاینده ای به یک کالای ارزشمند در عصر کنونی فناوری تبدیل می شوند و این امر بهینه سازی ذخیره سازی و دسترسی به این داده ها را ضروری می کند.
چندین راه حل قابل توجه برای ذخیره سازی داده ها وجود دارد، از جمله سیستم های مدیریت پایگاه داده رابطه ای (RDBMS) مانند MySQL و PostgreSQL که داده ها را در قالبی ساختاریافته با استفاده از سطرها و ستون ها و روابط درون داده ها ذخیره می کنند.
به غیر از RDBMS، فروشگاههایی با ارزش کلیدی وجود دارند که دادهها را ذخیره میکنند روی کلیدها و مقادیر منحصر به فرد مانند یک فرهنگ لغت. پایگاه داده های کلید-مقدار تحت عنوان NoSQL خانواده ای از پایگاه های داده که با ماهیت رابطه ای RDBMS مطابقت ندارند.
در این پست به بررسی خواهیم پرداخت ردیس به عنوان یک ذخیره کلید ارزش و استفاده از آن در یک پروژه برای بررسی عملکرد آن.
Redis چیست و چرا از آن استفاده می کنیم؟
ردیس (Remote Dictionary Server)، یک در حافظه ذخیره ساز ساختار داده که می تواند به عنوان پایگاه داده، حافظه پنهان یا کارگزار پیام مورد استفاده قرار گیرد.
داده ها در Redis به شکل ذخیره می شوند کلید-مقدارها جایی که از کلیدها برای مکان یابی و استخراج داده های ذخیره شده استفاده می شود روی نمونه Redis
پایگاه داده های معمولی داده ها را روی دیسک ذخیره می کنند که هزینه اضافی را از نظر زمان و منابع سخت افزاری به همراه دارد. Redis با ذخیره تمام داده ها در حافظه از این امر جلوگیری می کند، که داده ها را به راحتی در دسترس قرار می دهد و سرعت دسترسی و دستکاری داده ها را در مقایسه با پایگاه داده های معمولی افزایش می دهد.
به همین دلیل است که Redis به دلیل قابلیت استثنایی با کارایی بالا شناخته شده است.
Redis به ما امکان می دهد داده ها را در چندین ساختار داده سطح بالا از جمله رشته ها، هش ها، لیست ها، مجموعه ها و مجموعه های مرتب شده ذخیره کنیم. این به ما انعطاف بیشتری می دهد روی نوع و مقدار اطلاعاتی که می توانیم ذخیره کنیم روی یک فروشگاه داده Redis
نوشته شده در ANSI Cردیس سبک و بدون وابستگی خارجی است. همچنین برای توسعه دهندگان کاملاً دوستانه است زیرا از اکثر زبان های سطح بالا مانند Python، JavaScript، Java، C/C++ و PHP پشتیبانی می کند.
چه زمانی باید از Redis استفاده کرد؟
موارد استفاده رایج از Redis عبارتند از:
- ذخیره سازی: با توجه به سرعت آن نسبت به پایگاه داده های سنتی، از نظر عملیات خواندن و نوشتن، Redis به یک راه حل ایده آل برای ذخیره موقت داده ها در حافظه پنهان برای تسریع دسترسی به داده ها در آینده تبدیل شده است.
- صف پیام: با قابلیت پیاده سازی پارادایم پیام رسانی Publish/Subscribe، Redis به یک واسطه پیام برای سیستم های صف پیام تبدیل شده است.
- ذخیره سازی داده ها: از Redis می توان برای ذخیره داده های کلید-مقدار به عنوان پایگاه داده NoSQL استفاده کرد.
شرکت هایی مانند Twitter، Pinterest، GitHub، Snapchat و StackOverflow همگی از Redis برای ذخیره و در دسترس قرار دادن داده ها برای کاربران خود استفاده می کنند.
به عنوان مثال، توییتر جدیدترین توییتهای دریافتی را برای یک کاربر ذخیره میکند روی Redis برای سرعت بخشیدن به تحویل توییت ها به برنامه های مشتری.
Pinterest از Redis برای ذخیره لیستی از کاربران و تابلوهایی که کاربر آنها را دنبال می کند، لیستی از دنبال کنندگان کاربر و لیست افرادی که تابلوهای شما را دنبال می کنند و لیست های دیگر برای بهبود تجربه استفاده می کند. روی پلت فرم
نصب Redis
برای بررسی بیشتر Redis، باید سرور Redis را با استفاده از دستورالعملهای موجود دانلود و نصب کنیم صفحه وب رسمی. Redis نیز به صورت a تصویر داکر روی داکر هاب.
همچنین با a ارسال می شود Redis-CLI ابزاری که می توانیم برای تعامل و دستکاری داده ها در سرور Redis خود استفاده کنیم.
Redis همچنین برای نصب از طریق Homebrew (برای MacOS) و از طریق مخزن پیشفرض apt برای Debian Linux و انواع آن مانند اوبونتو در دسترس است.
برای نصب Redis روی MacOS، به سادگی اجرا کنید:
$ brew install redis
در لینوکس دبیان:
$ sudo apt-get install redis-server
برای تأیید نصب Redis، عبارت را تایپ کنید redis-cli
فرمان، سپس تایپ کنید ping
روی اعلانی که ظاهر می شود:
$ redis-cli -v
redis-cli 5.0.6
$ redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
ما می توانیم ببینیم که سرور Redis ما با پاسخ آماده است – PONG
.
دستورات Redis
Redis، از طریق Redis-CLI، دستورات مفیدی را ارائه می دهد که می توانیم از آنها برای تعامل با سرور Redis و دستکاری داده های ذخیره شده در آنجا استفاده کنیم. به طور پیش فرض سرورهای Redis اجرا می شوند روی پورت 6379 و این قابل مشاهده خواهد بود روی سریع ما
دستورات موجود در اعلان Redis-CLI عبارتند از:
SET
: این دستور برای تنظیم یک کلید و مقدار آن، با پارامترهای اختیاری اضافی برای تعیین انقضای ورودی کلید-مقدار استفاده می شود. بیایید یک کلید تنظیم کنیمhello
با ارزشworld
با انقضای 10 ثانیه:
127.0.0.1:6379> SET hello "world" EX 10
OK
GET
: این دستور برای بدست آوردن مقدار مربوط به یک کلید استفاده می شود. در صورتی که ورودی مقدار کلید از مدت انقضا فراتر رفته باشد،nil
بازگردانده خواهد شد:
127.0.0.1:6379> GET hello
“world”
# After expiry
127.0.0.1:6379> GET hello
(nil)
DELETE
: این دستور یک کلید و مقدار مربوطه را حذف می کند:
127.0.0.1:6379> DEL hello
(integer) 1
TTL
: هنگامی که یک کلید با انقضا تنظیم می شود، از این دستور می توان برای مشاهده مدت زمان باقی مانده استفاده کرد:
127.0.0.1:6379> SET foo "bar" EX 100 # 100 is the number of seconds
OK
127.0.0.1:6379> TTL foo
(integer) 97 # Number of seconds remaining till expiry
127.0.0.1:6379> TTL foo
(integer) 95
127.0.0.1:6379> TTL foo
(integer) 93
PERSIST
: اگر نظر خود را در مورد انقضای یک کلید تغییر دهیم، می توانیم از این دستور برای حذف دوره انقضا استفاده کنیم:
127.0.0.1:6379> PERSIST foo
(integer) 1
127.0.0.1:6379> TTL foo
(integer) -1
127.0.0.1:6379> GET foo
"bar"
RENAME
: این دستور برای تغییر نام کلیدها در سرور Redis ما استفاده می شود:
127.0.0.1:6379> RENAME foo foo2
OK
127.0.0.1:6379> GET foo
(nil)
127.0.0.1:6379> GET foo2
"bar"
FLUSHALL
: این دستور برای پاک کردن تمام ورودیهای مقدار کلیدی که در جلسه فعلی خود تنظیم کردهایم استفاده میشود:
127.0.0.1:6379> RENAME foo foo2
OK
127.0.0.1:6379> GET foo
(nil)
127.0.0.1:6379> GET foo2
(nil)
127.0.0.1:6379> GET hello
(nil)
اطلاعات بیشتر روی این و سایر دستورات Redis را می توان یافت روی را وب سایت رسمی.
ردیس با جنگو
برای نشان دادن روش ادغام Redis در یک برنامه وب، یک API با استفاده از Django و Django REST ایجاد می کنیم که می تواند یک جفت کلید-مقدار را دریافت کرده و آن را در سرور Redis خود ذخیره کند.
API ما همچنین میتواند مقادیر کلیدهای داده شده را بازیابی کند، تمام جفتهای کلید-مقدار ذخیره شده را بازیابی کند و همچنین ورودی کلید-مقدار را حذف کند.
اجازه دهید با ایجاد یک پوشه برای خانه پروژه خود شروع کنیم:
$ mkdir redis_demo && cd $_
سپس، بیایید یک محیط مجازی ایجاد کنیم و آن را فعال کنیم:
$ virtualenv --python=python3 env --no-site-packages
$ source env/bin/activate
و در نهایت، بیایید کتابخانه های مورد نیاز را نصب کنیم:
$ pip install django djangorestframework redis
API برنامه ما درخواست ها را دریافت می کند و با سرور Redis ما با استفاده از Redis-py کتابخانه
حالا بیایید برنامه را ایجاد کنیم:
# Create the project
$ django-admin startproject django_redis_demo
$ cd django_redis_demo
# Create the app
$ django-admin startapp api
# Migrate
$ python manage.py migrate
برای بررسی موفقیت آمیز بودن راه اندازی جنگو، سرور را راه اندازی می کنیم:
$ python manage.py runserver
هنگامی که ما به http:127.0.0.1:8000
، ما مورد استقبال قرار می گیریم:
مرحله بعدی اضافه کردن ما است api
برنامه و Django REST به پروژه ما با به روز رسانی INSTALLED_APPS
لیست یافت شده در django_redis_demo/settings.py
:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'api',
)
Redis-py
برای تعامل به یک نمونه در حال اجرا از Redis نیاز دارد. ما باید این را در خود پیکربندی کنیم django_redis_demo/settings.py
با اضافه کردن:
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
با این تنظیمات، ما همچنین می توانیم از یک نمونه Redis در حال اجرا در یک Docker استفاده کنیم container یا یک نمونه Redis راه دور، حتی اگر ممکن است نیاز به ارائه جزئیات احراز هویت برای آن مورد داشته باشیم. در حال حاضر، ما از نمونه محلی Redis خود که راه اندازی کرده ایم استفاده خواهیم کرد.
در مرحله بعد، میخواهیم مسیری را ایجاد کنیم که برای دسترسی به API استفاده میشود و آن را به برنامه اصلی جنگو پیوند میدهیم. ابتدا یک خالی ایجاد می کنیم api/urls.py
فایل، سپس مسیر ما را در آن ایجاد کنید django_redis_demo/urls.py
:
from django.urls import path, include
urlpatterns = (
...
path('api/', include('api.urls')),
)
همه درخواست ها از طریق api/
نقطه پایانی اکنون توسط ما مدیریت خواهد شد api
کاربرد. آنچه در حال حاضر گم شده است، دیدگاه هایی است که به درخواست ها رسیدگی می کنند.
نماهای ما نماهای مبتنی بر تابع ساده خواهند بود که به ما امکان تعامل با سرور Redis را می دهند. ابتدا، اجازه دهید URL هایی را ایجاد کنیم که با آنها تعامل خواهیم داشت api/urls.py
:
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from .views import manage_items, manage_item
urlpatterns = {
path('', manage_items, name="items"),
path('<slug:key>', manage_item, name="single_item")
}
urlpatterns = format_suffix_patterns(urlpatterns)
مسیر اول به ما امکان میدهد ورودیها را ایجاد کرده و همه ورودیها را مشاهده کنیم، در حالی که مسیر دوم به ما مدیریت گرانول ورودیهای واحد را میدهد.
ما دو نمای مبتنی بر تابع خواهیم داشت: manage_items()
و manage_item()
که به درخواست ها رسیدگی می کند و با نمونه Redis ما تعامل دارد. آنها هر دو در ما ساکن خواهند شد api/views.py
فایل.
برای توضیح بهتر کد، آن را به تکه های مختصرتر تقسیم می کنیم. اگر میخواهید کد کامل را ببینید، پیوندی به مخزن GitHub با کد منبع در پایان این مقاله وجود دارد.
ما با وارد کردن کتابخانه های مورد نیاز و اتصال به نمونه Redis خود شروع می کنیم:
import json
from django.conf import settings
import redis
from rest_framework.decorators import api_view
from rest_framework import status
from rest_framework.response import Response
redis_instance = redis.StrictRedis(host=settings.REDIS_HOST,
port=settings.REDIS_PORT, db=0)
در اینجا، ما شیء اتصال خود را با عبور از Redis ایجاد می کنیم host و پورت همانطور که قبلا در ما پیکربندی شده بود django_redis_demo/settings.py
.
سپس، اولین نمای خود را ایجاد می کنیم manage_items()
که برای بازیابی همه مواردی که در حال حاضر در نمونه در حال اجرا Redis تنظیم شده است استفاده می شود. این نمای همچنین به ما اجازه می دهد تا با ارسال یک شی JSON، ورودی های جدیدی را در نمونه Redis خود ایجاد کنیم:
@api_view(('GET', 'POST'))
def manage_items(request, *args, **kwargs):
if request.method == 'GET':
items = {}
count = 0
for key in redis_instance.keys("*"):
items(key.decode("utf-8")) = redis_instance.get(key)
count += 1
response = {
'count': count,
'msg': f"Found {count} items.",
'items': items
}
return Response(response, status=200)
elif request.method == 'POST':
item = json.loads(request.body)
key = list(item.keys())(0)
value = item(key)
redis_instance.set(key, value)
response = {
'msg': f"{key} successfully set to {value}"
}
return Response(response, 201)
سپس، بیایید تعریف کنیم manage_item()
:
@api_view(('GET', 'PUT', 'DELETE'))
def manage_item(request, *args, **kwargs):
if request.method == 'GET':
if kwargs('key'):
value = redis_instance.get(kwargs('key'))
if value:
response = {
'key': kwargs('key'),
'value': value,
'msg': 'success'
}
return Response(response, status=200)
else:
response = {
'key': kwargs('key'),
'value': None,
'msg': 'Not found'
}
return Response(response, status=404)
elif request.method == 'PUT':
if kwargs('key'):
request_data = json.loads(request.body)
new_value = request_data('new_value')
value = redis_instance.get(kwargs('key'))
if value:
redis_instance.set(kwargs('key'), new_value)
response = {
'key': kwargs('key'),
'value': value,
'msg': f"Successfully updated {kwargs('key')}"
}
return Response(response, status=200)
else:
response = {
'key': kwargs('key'),
'value': None,
'msg': 'Not found'
}
return Response(response, status=404)
elif request.method == 'DELETE':
if kwargs('key'):
result = redis_instance.delete(kwargs('key'))
if result == 1:
response = {
'msg': f"{kwargs('key')} successfully deleted"
}
return Response(response, status=404)
else:
response = {
'key': kwargs('key'),
'value': None,
'msg': 'Not found'
}
return Response(response, status=404)
manage_item()
به ما امکان دسترسی به ورودی های فردی در نمونه Redis را می دهد. این نما از تماس گیرنده می خواهد که کلید آیتم مورد نیاز ما را در URL ارسال کند.
سپس از این کلید برای تعیین مکان مقدار ذخیره شده در نمونه ما استفاده می شود. با استفاده از PUT
روش HTTP و با پاس کردن مقدار جدید یک کلید، می توانیم مقدار کلید را به روز کنیم.
از طریق DELETE
روش، ما می توانیم یک جفت کلید-مقدار را از نمونه Redis خود حذف کنیم.
برای مشاهده عملکرد API خود، از Postman استفاده می کنیم. اما ابتدا اجازه دهید یک یا دو ورودی را با استفاده از عبارت ایجاد کنیم redis-cli
ابزار:
$ redis-cli
127.0.0.1:6379> SET HELLO "WORLD"
OK
127.0.0.1:6379> SET REDIS "DEMO"
OK
پس از تنظیم داده ها، اجازه دهید یک درخواست GET به آن ارسال کنیم localhost:8000/api/items
:
API ما میتواند تمام جفتهای کلید-مقدار را در نمونه فعلی Redis ما واکشی کند. اجازه دهید اکنون یک درخواست POST با بارگذاری زیر را به همان URL ارسال کنیم:
{
"mighty": "mug"
}
اجازه دهید درخواست GET دیگری را به همان نقطه پایانی ارسال کنیم:
می بینیم که کلیدی که با استفاده از API ایجاد کرده ایم ذخیره شده است روی نمونه Redis ما. ما می توانیم وجود آن را با استفاده از ابزار CLI تأیید کنیم.
اجازه دهید اکنون نقطه پایانی دوم را آزمایش کنیم که با ارسال یک درخواست GET، مقدار یک کلید را برمی گرداند http://localhost:8000/api/items/HELLO
:
که خوب پیش رفت. اجازه دهید اکنون مقدار مربوط به the را به روز کنیم HELLO
با ارسال JSON زیر از طریق یک درخواست PUT به همان نقطه پایانی کلید کنید:
{
"new_value": "rasanegar.com"
}
وقتی کلید را می آوریم HELLO
از نو:
ارزش ما با موفقیت به روز شد. آخرین بیتی که باقی میماند، حذف کلیدها است، بنابراین اجازه دهید پیش برویم و a را ارسال کنیم DELETE
درخواست به http://localhost:8000/api/items/HELLO
برای حذف کلیدی که به تازگی به روز کرده ایم.
وقتی سعی می کنیم پس از حذف به همان مورد دسترسی پیدا کنیم:
به ما اطلاع داده شده است که کلید ما حذف شده است. Django API ما با استفاده از Redis با نمونه Redis ما با موفقیت ارتباط برقرار کرده است Redis-py
کتابخانه
نتیجه
Redis یک گزینه ذخیره سازی اطلاعات قدرتمند و سریع است که در صورت استفاده در موقعیت مناسب می تواند مزایای زیادی را به همراه داشته باشد. منحنی یادگیری تند ندارد، بنابراین برداشتن آن آسان است و همچنین با یک ابزار مفید CLI همراه است تا به ما در تعامل با آن از طریق دستورات ساده و شهودی کمک کند.
ما توانستهایم API جنگو خود را با یک نمونه Redis در حال اجرا به صورت محلی یکپارچه کنیم که گواهی بر سهولت استفاده از آن با زبانهای برنامهنویسی سطح بالا رایج است.
کد منبع اسکریپت در این پروژه را می توان یافت اینجا روی GitHub.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-18 23:15:05