Menggunakan Redis dengan Python adalah kombinasi yang kuat bagi engineer data yang ingin membangun sistem berkinerja tinggi, terukur, dan mudah dipelihara. Baik Anda mengoptimalkan lapisan cache, mengelola aliran peristiwa real-time, atau menerapkan penguncian terdistribusi, Redis menyediakan solusi yang fleksibel dan efisien.
Dalam panduan ini, kami akan membahas dasar-dasar penggunaan Redis dengan Python untuk membantu Anda mengintegrasikannya secara mulus ke dalam alur kerja rekayasa data Anda.
Apa itu Python Redis?
Redis adalah penyimpanan struktur data in-memory open-source yang digunakan sebagai database, cache, dan message broker. Nama Redis merupakan singkatan dari Remote Dictionary Server dan awalnya dirancang sebagai sistem penyimpanan key-value dengan waktu akses yang cepat.
Redis mendukung berbagai struktur data seperti string, hash, list, set, dan sorted set dengan kueri rentang. Redis juga menyediakan fitur lanjutan seperti transaksi, pesan pub/sub, skrip Lua, serta kemampuan replikasi dan klaster bawaan untuk ketersediaan dan skalabilitas yang lebih baik.
Kasus penggunaan Redis yang umum
Potensi kasus penggunaan Redis sangat luas dan beragam.
Beberapa kasus penggunaan paling umum dalam rekayasa data meliputi:
Caching: Mempercepat kueri database dan respons API.
Antrian pesan: Mendukung arsitektur berbasis peristiwa dan pipeline pemrosesan job.
Analitik real-time: Memproses dan menganalisis data streaming dengan latensi minimal.
Leaderboard: Mengurutkan dan mengambil entitas berperingkat teratas secara efisien.
Penyimpanan sesi: Memelihara manajemen state sesi yang cepat dan terukur.
Manajemen antrian job: Memastikan penjadwalan dan eksekusi tugas yang efisien.
Pengindeksan geospasial: Menyimpan dan melakukan kueri data berbasis lokasi.
Redis juga umum digunakan bersama teknologi lain seperti web server (mis. NGINX), database (mis. MySQL), dan sistem messaging (mis. Kafka) untuk mengoptimalkan kinerja dan skalabilitas.
Mengapa menggunakan Redis dengan Python?
Python adalah bahasa dominan dalam rekayasa data karena fleksibilitas, ekosistem yang luas, dan kemudahan integrasi dengan teknologi big data.
Menggabungkannya dengan Redis dapat menghadirkan banyak manfaat bagi aplikasi Anda:
Performa cepat: Karena Redis menyimpan data di memori, ia menawarkan waktu akses yang jauh lebih cepat dibandingkan database tradisional yang menyimpan data di disk. Ini ideal untuk kasus yang memerlukan kinerja tinggi, seperti caching dan aplikasi real-time.
Skalabilitas: Redis dirancang dengan mempertimbangkan skalabilitas, sehingga mudah menangani data dalam jumlah besar tanpa mengorbankan kinerja.
Kemudahan penggunaan: Sintaks Python yang sederhana dan ekosistem pustaka yang kaya memudahkan bekerja dengan Redis. Pustaka klien resmi Redis-py juga menyediakan antarmuka yang ramah pengguna untuk berinteraksi dengan Redis dari kode Python Anda.
Apa itu Redis-py?
Redis-py adalah pustaka klien resmi Redis untuk Python. Pustaka ini menyediakan antarmuka yang mudah digunakan untuk berkomunikasi dengan Redis dari dalam kode Python Anda.
Beberapa fitur utamanya meliputi:
Dukungan untuk semua tipe data Redis
Dukungan pipeline dan transaksi untuk operasi yang efisien dan atomik
Dukungan pesan pub/sub
Enkode/dekode otomatis data ke/dari bytes, string, dan tipe Python lainnya
Dukungan mode klaster untuk bekerja dengan klaster Redis
Menyiapkan Redis untuk Pengembangan Python
Mari kita lihat cara menyiapkan Redis menggunakan Python.
docker run --name my-redis -p6379:6379 -d redisDidukung oleh
docker pull redis mengunduh image resmi Redis terbaru. docker run --name my-redis -p 6379:6379 -d redis memulai container baru bernama my-redis. Parameter -p 6379:6379 memetakan port 6379 mesin lokal ke port 6379 container, sehingga Anda dapat terhubung ke Redis di localhost:6379. Flag -d menjalankan container di latar belakang (detached mode).
Selanjutnya, Anda perlu memasang pustaka redis-py agar dapat mengakses database menggunakan Python. Sebelum memasang pustaka, pastikan Anda telah memasang Python dan Redis secara terpisah.
Perintah ini mengunduh dan memasang pustaka klien Python Redis (redis-py) dari PyPI. Jika Anda menggunakan virtual environment, pastikan Anda mengaktifkannya sebelum menjalankan perintah ini.
Verifikasi dengan:
python -c"import redis; print(redis.__version__)"Didukung oleh
Ini akan mencetak nomor versi (mis., 5.2.1).
Menyiapkan server Redis
Jika Anda mengikuti salah satu metode di atas (Docker, WSL, atau build pihak ketiga), sekarang Anda seharusnya memiliki server Redis yang berjalan di localhost:6379. Itu sudah cukup untuk pengembangan lokal di Windows.
Bekerja dengan Struktur Data Redis
Di bawah ini adalah contoh Python yang mendemonstrasikan cara terhubung dan memanipulasi berbagai tipe data Redis. Setiap blok kode menyertakan komentar penjelas tentang cara kerja metode atau perintahnya.
String di Redis
import redis
# Instantiate a Redis client, connecting to localhost on port 6379
r = redis.Redis(
host='localhost',
port=6379,
db=0# The default Redis database index)# 1. SET command: store a string under 'mykey'
r.set("mykey","hello from Windows")# 2. GET command: retrieve the value stored at 'mykey'
value = r.get("mykey")print(value)# Output is b'hello from Windows', since redis-py returns bytes.# 3. Convert bytes to stringprint(value.decode())# prints "hello from Windows"# 4. DEL command: remove 'mykey' from Redis
r.delete("mykey")Didukung oleh
Kita membuat objek Redis yang terhubung ke server Redis lokal.
r.set("mykey", "hello from Windows") menyimpan string "hello from Windows" di bawah key "mykey".
r.get("mykey") mengambil nilai yang disimpan di mykey. Redis mengembalikan bytes, jadi kita decode untuk output yang mudah dibaca manusia.
r.delete("mykey") menghapus key mykey sepenuhnya.
Contoh: Menyimpan dan mengambil sesi pengguna
Berikut contoh kode manajemen sesi pengguna:
import uuid
defstore_user_session(user_id):"""
Generates a unique session token (UUID) for a user and stores it in Redis.
The session is stored under the key pattern: user:{user_id}:session
"""
session_key =f"user:{user_id}:session"
token =str(uuid.uuid4())# Generate a random UUID as a session token
r.set(session_key, token)# Store token in Redisreturn token
defget_user_session(user_id):"""
Retrieves the stored session token for the given user_id.
Returns None if the session does not exist or is expired.
"""
session_key =f"user:{user_id}:session"
token = r.get(session_key)return token.decode('utf-8')if token elseNonedefdelete_user_session(user_id):"""
Deletes the session entry from Redis for the specified user_id.
"""
session_key =f"user:{user_id}:session"
r.delete(session_key)# Usage demonstration
session_token = store_user_session(1001)print(f"Stored session token: {session_token}")
retrieved_token = get_user_session(1001)print(f"Retrieved session token: {retrieved_token}")
delete_user_session(1001)print(f"Session after delete: {get_user_session(1001)}")# Should be None or emptyDidukung oleh
store_user_session(user_id): Membuat ID unik global melalui uuid.uuid4() dan menyimpannya di bawah key spesifik pengguna. get_user_session(user_id): Membaca kembali token sesi. Jika None, sesi tidak ada atau telah kedaluwarsa. delete_user_session(user_id): Menghapus key sesi dari Redis, sehingga pengguna efektif keluar.
List di Redis
List Redis adalah urutan string yang terurut. List mendukung operasi di kedua ujungnya, sehingga cocok untuk antrian, stack, atau log.
# LPUSH: Push an element to the head (left) of the list
r.lpush("task_queue","task1")# RPUSH: Push an element to the tail (right) of the list
r.rpush("task_queue","task2")
r.rpush("task_queue","task3")# LPOP: Pop (remove and return) the element at the head
task = r.lpop("task_queue")print(task)# b'task1'# Optional: RPOP removes and returns the element at the tail
task = r.rpop("task_queue")print(task)# b'task3'Didukung oleh
lpush("task_queue", "task1") menambahkan "task1" ke sisi kiri list bernama "task_queue". rpush("task_queue", "task2") dan rpush("task_queue", "task3") menambahkan tugas ke sisi kanan. lpop("task_queue") dan rpop("task_queue") menghapus dan mengembalikan item dari masing-masing ujung list.
Contoh: Menerapkan antrian sederhana berbasis Redis
defenqueue_task(queue_name, task):"""
Appends a task to the end (right) of the Redis list named queue_name.
"""
r.rpush(queue_name, task)defdequeue_task(queue_name):"""
Removes a task from the front (left) of the Redis list named queue_name.
Returns the task as a string, or None if the queue is empty.
"""
task = r.lpop(queue_name)return task.decode('utf-8')if task elseNone# Example usage:
enqueue_task("my_queue","send_email")
enqueue_task("my_queue","generate_report")whileTrue:
task = dequeue_task("my_queue")ifnot task:print("No more tasks in queue.")breakprint(f"Processing task: {task}")Didukung oleh
enqueue_task selalu menambahkan tugas baru ke akhir list, yang meniru antrian FIFO tradisional. dequeue_task menghapus tugas dari depan. Jika list kosong, fungsi ini mengembalikan None.
While-loop memproses tugas hingga antrian kosong, lalu berhenti.
Hash di Redis
Hash mirip dengan kamus (dictionary) Python tetapi disimpan di Redis. Hash sangat cocok untuk mengelompokkan field terkait (mis., detail pengguna).
# HSET: Store 'name' and 'email' fields for a user hash key
r.hset("user:1001","name","Alice")
r.hset("user:1001","email","[email protected]")# HGET: Retrieve a single field from the hash
email = r.hget("user:1001","email")print(email.decode('utf-8'))# [email protected]# HDEL: Remove a field from the hash
r.hdel("user:1001","email")Didukung oleh
hset("user:1001", "name", "Alice") menetapkan field "name" bernilai "Alice" di dalam hash pada key "user:1001". hget("user:1001", "email") mengambil field "email". hdel("user:1001", "email") menghapus field "email" dari hash tersebut.
Contoh: Menyimpan dan mengakses profil pengguna terstruktur
defcreate_user_profile(user_id, name, email):"""
Creates a user profile in Redis under the key 'user:{user_id}'.
'name' and 'email' are stored as separate fields in the hash.
"""
user_key =f"user:{user_id}"
r.hset(user_key, mapping={"name": name,"email": email})defget_user_profile(user_id):"""
Retrieves and returns all fields in the user profile hash
as a Python dictionary. Keys and values are decoded from bytes.
"""
user_key =f"user:{user_id}"
profile_data = r.hgetall(user_key)return{k.decode('utf-8'): v.decode('utf-8')for k, v in profile_data.items()}defdelete_user_profile(user_id):"""
Deletes the entire user profile key from Redis.
"""
user_key =f"user:{user_id}"
r.delete(user_key)# Usage demonstration
create_user_profile(1002,"Bob","[email protected]")print(get_user_profile(1002))# e.g. {'name': 'Bob', 'email': '[email protected]'}
delete_user_profile(1002)Didukung oleh
Kita menyimpan nama dan email pengguna di dalam hash. mapping={"name": name, "email": email} memanfaatkan kemampuan redis-py untuk menetapkan beberapa field sekaligus. r.hgetall(user_key) mengambil semua field dan nilai, dikembalikan sebagai dictionary berisi bytes mentah yang kita decode menjadi string. delete_user_profile menghapus seluruh key hash.
Set dan Sorted Set
Data di Redis dapat dikelola menggunakan set atau sorted set.
Set adalah koleksi nilai unik, sedangkan sorted set adalah koleksi pasangan key-nilai dengan skor terkait pada setiap nilai. Struktur data ini menyediakan cara yang efisien untuk menyimpan dan mengambil data, sehingga berguna untuk aplikasi yang memerlukan pencarian cepat.
Set
Set di Redis mirip dengan himpunan matematika – berisi kumpulan elemen unik, dan tidak diperbolehkan ada duplikat. Set dapat digunakan untuk memodelkan hubungan antar entitas, seperti pengguna yang menyukai sebuah posting di media sosial.
Berikut demonstrasi set:
# SADD: Add multiple members to a set
r.sadd("tags:python","redis","windows","backend")# SMEMBERS: Retrieve all unique members in the set
tags = r.smembers("tags:python")print(tags)# {b'redis', b'windows', b'backend'}Didukung oleh
Set Redis memastikan keunikan anggota. Upaya menambahkan anggota duplikat tidak akan berpengaruh.
Hasil smembers adalah set Python berisi bytes.
Sorted set
Sorted set di Redis mirip dengan set biasa, tetapi setiap anggotanya juga memiliki skor terkait. Ini memungkinkan operasi pengurutan dan pemeringkatan yang efisien pada set.
Sorted set sering digunakan untuk leaderboard, di mana skor merepresentasikan peringkat atau poin pemain.
Berikut demonstrasi sorted set:
# ZADD: Add members with scores
r.zadd("leaderboard",{"player1":10,"player2":20})# ZRANGE: Retrieve members in ascending order of score
leaders = r.zrange("leaderboard",0,-1, withscores=True)print(leaders)# [(b'player1', 10.0), (b'player2', 20.0)]Didukung oleh
Sorted set menyimpan anggota dalam urutan tertentu yang ditentukan oleh skor numeriknya. zrange("leaderboard", 0, -1, withscores=True) mengembalikan semua anggota dari peringkat 0 hingga akhir, termasuk skornya.
Contoh: Mengelola tag atau leaderboard
Penggunaan sorted set dapat membantu dalam mengelola tag atau membuat leaderboard.
defadd_tag(post_id, tag):"""
Adds a 'tag' to the set of tags belonging to a specific post.
Each post has its own set under 'post:{post_id}:tags'.
"""
r.sadd(f"post:{post_id}:tags", tag)defget_tags(post_id):"""
Retrieves all tags for a specific post, decoding the bytes into strings.
"""
raw_tags = r.smembers(f"post:{post_id}:tags")return{tag.decode('utf-8')for tag in raw_tags}defupdate_leaderboard(player, score):"""
Updates or inserts a player's score in the 'game:leaderboard' sorted set.
A higher score indicates a better position if sorting descending.
"""
r.zadd("game:leaderboard",{player: score})defget_leaderboard():"""
Returns an ascending list of (player, score) tuples from the leaderboard.
To invert the sorting (highest first), you'd use ZREVRANGE.
"""
entries = r.zrange("game:leaderboard",0,-1, withscores=True)return[(player.decode('utf-8'), score)for player, score in entries]# Usage demonstration
add_tag(123,"python")
add_tag(123,"redis")print(get_tags(123))
update_leaderboard("Alice",300)
update_leaderboard("Bob",450)print(get_leaderboard())Didukung oleh
add_tag dan get_tags mendemonstrasikan sistem tagging one-to-many, menyimpan tag dalam Set. update_leaderboard dan get_leaderboard menunjukkan cara mengimplementasikan leaderboard gim.
Fitur Redis dalam Aplikasi Python
Redis memiliki beberapa fitur yang menjadikannya pilihan populer untuk penyimpanan data dalam aplikasi Python: antrian, penguncian, dan caching.
Berikut implementasinya dalam Python:
Redis sebagai antrian (dengan blocking)
Mari jelajahi penggunaan Redis sebagai antrian dengan blocking menggunakan BLPOP.
BLPOP adalah operasi blocking yang menunggu hingga elemen tersedia dalam list.
defblocking_consumer(queue_name):"""
Continuously listens to the specified queue (Redis list) using BLPOP,
which blocks until new items are pushed. Once an item arrives,
it is removed from the queue and processed.
"""print(f"Waiting on queue: {queue_name}")whileTrue:
result = r.blpop(queue_name)if result:
list_name, task_bytes = result
task = task_bytes.decode('utf-8')print(f"Received task: {task}")else:print("Queue is empty or an error occurred.")breakdefenqueue_task(queue_name, task):"""
Pushes a task to the end of a Redis list (queue).
"""
r.rpush(queue_name, task)# Example usage:
enqueue_task("blocking_queue","task_block_1")
enqueue_task("blocking_queue","task_block_2")# In a real application, the consumer might run in a separate thread or process
blocking_consumer("blocking_queue")Didukung oleh
blocking_consumer menggunakan blpop dalam loop. Jika list kosong, blpop akan menunggu hingga item lain didorong masuk.
Setelah item diterima, item dihapus dari list dan dicetak.
Pendekatan ini ideal untuk pola produsen-konsumen di mana worker mengonsumsi tugas saat muncul.
Menerapkan lock di Redis
Lock terdistribusi mencegah beberapa klien atau proses secara bersamaan memodifikasi sumber daya yang sama. Redis dapat membantu menghindari race condition di lingkungan terdistribusi.
import time
from redis.exceptions import LockError
defprocess_critical_section():"""
Acquires a lock named 'resource_lock' with a timeout of 10 seconds.
The lock automatically expires after 10 seconds to prevent deadlocks.
"""
lock = r.lock("resource_lock", timeout=10)try:# Attempt to acquire the lock, wait for up to 5 seconds if another process holds it
acquired = lock.acquire(blocking=True, blocking_timeout=5)if acquired:print("Lock acquired; performing critical operation...")
time.sleep(3)# Simulate some operationelse:print("Failed to acquire lock within 5 seconds.")except LockError:print("A LockError occurred, possibly releasing already released lock.")finally:# Always release the lock in a finally block to ensure cleanup
lock.release()print("Lock released.")# Usage demonstration
process_critical_section()Didukung oleh
Kita membuat lock dengan timeout=10, artinya jika lock tidak dirilis secara manual, Redis akan otomatis menghapusnya dalam 10 detik untuk mencegah blocking tanpa batas (deadlock). lock.acquire(blocking=True, blocking_timeout=5) mencoba memperoleh lock selama 5 detik sebelum menyerah. Setelah selesai, lock.release() membebaskan sumber daya untuk proses lain.
Caching dengan Redis
Caching adalah skenario penggunaan umum: menyimpan data yang sering diakses di memori, mengurangi beban pada database atau API eksternal.
import requests
import json
defget_user_data(user_id):"""
Retrieves user data from a hypothetical API endpoint.
If the data is found in Redis (cache), use that. Otherwise, call the API,
store the response in Redis with a 60-second expiration, and return it.
"""
cache_key =f"user_data:{user_id}"
cached_data = r.get(cache_key)if cached_data:print("Cache hit!")return json.loads(cached_data)print("Cache miss. Fetching from API...")
response = requests.get(f"https://api.example.com/users/{user_id}")
user_info = response.json()# Store in Redis for 60 seconds
r.setex(cache_key,60, json.dumps(user_info))return user_info
# Usage
user = get_user_data(42)# First call => cache miss
user_again = get_user_data(42)# Subsequent call => cache hitDidukung oleh
Kita memeriksa apakah user_data:{user_id} ada di Redis. Jika ada, itu cache hit, dan kita melewati pemanggilan API. Jika tidak, kita ambil dari API jarak jauh, lalu setex (set + kedaluwarsa) selama 60 detik. Panggilan berikutnya dalam rentang waktu tersebut akan mengambil data dari cache, menurunkan latensi.
Topik Lanjutan di Redis
Sudah merasa cukup paham Redis? Mari bahas beberapa topik yang lebih lanjut.
Menggunakan Pub/Sub dengan Redis
Pub/Sub (Publish/Subscribe) adalah pola messaging populer untuk komunikasi real-time. Publisher mengirim pesan ke sebuah kanal, dan semua subscriber kanal tersebut menerima pesan.
import threading
defsubscriber(r, channel_name):"""
Subscribes to the given Redis channel and listens for messages.
When a new message is published on that channel, it is printed.
"""
pubsub = r.pubsub()
pubsub.subscribe(channel_name)print(f"Subscribed to {channel_name}")# pubsub.listen() yields messages from the subscribed channel(s) in real timefor message in pubsub.listen():if message['type']=='message':print(f"Received message: {message['data'].decode('utf-8')}")defpublisher(r, channel_name, message):"""
Publishes a message to the specified Redis channel.
All subscribers to this channel immediately receive the message.
"""
r.publish(channel_name, message)# Example usage
channel ="updates"# Start subscriber in a separate thread to avoid blocking the main thread
sub_thread = threading.Thread(target=subscriber, args=(r, channel))
sub_thread.start()# Publish messages
publisher(r, channel,"Hello from Windows!")
publisher(r, channel,"Another update!")Didukung oleh
pubsub = r.pubsub() membuat objek PubSub. pubsub.subscribe(channel_name) menginstruksikan Redis untuk mengirim pesan dari kanal tersebut ke objek PubSub. pubsub.listen() adalah iterator tak terbatas, menghasilkan pesan saat datang. r.publish(channel_name, message) mengirim pesan ke semua subscriber channel_name.
Masa berlaku (expiry) key di Redis
Redis mendukung time-to-live (TTL). Ini penting untuk data sementara seperti sesi atau cache berumur pendek.
# EXPIRE: Set a 30-second expiration on a key
r.set("temp_key","some value")
r.expire("temp_key",30)# SETEX: Combined set + expire in one command
r.setex("temp_key2",60,"another value")Didukung oleh
r.expire("temp_key", 30) menetapkan TTL 30 detik. Setelah 30 detik, temp_key otomatis dihapus. r.setex("temp_key2", 60, "another value") adalah jalan pintas yang menetapkan key dan masa berlaku sekaligus.
Contoh: Kedaluwarsa sesi
Berikut contoh bagaimana Anda dapat menggunakan key yang kedaluwarsa untuk menetapkan sesi berakhir setelah durasi waktu tertentu.
defstore_session_with_expiry(user_id, token, ttl=3600):"""
Stores a session token for a specific user with a time-to-live (TTL).
By default, the session expires after 1 hour (3600 seconds).
"""
session_key =f"user:{user_id}:session"
r.setex(session_key, ttl, token)defget_session_with_expiry(user_id):"""
Retrieves the session token for the user. Returns None if the key doesn't exist
or if it has expired.
"""
session_key =f"user:{user_id}:session"
token = r.get(session_key)return token.decode('utf-8')if token elseNone# Usage
store_session_with_expiry(2001,"session_token_abc",3600)
retrieved_token = get_session_with_expiry(2001)print(f"Retrieved token: {retrieved_token}")Didukung oleh
store_session_with_expiry menggunakan setex di balik layar untuk menyimpan user:{user_id}:session dengan TTL tertentu. Jika Anda tidak menetapkan TTL, key dapat bertahan tanpa batas.
Saat TTL berakhir, Redis akan menghapus key secara otomatis, sehingga sesi tidak dapat diambil lagi.
Praktik Terbaik Menggunakan Redis dengan Python
Mengelola Redis memerlukan beberapa pertimbangan dan praktik terbaik untuk memastikan kinerja optimal dan menghindari jebakan umum.
Beberapa kiat yang perlu diingat meliputi:
Konfigurasikan opsi persistensi dengan tepat demi keamanan data.
Pantau penggunaan memori untuk mencegah error kehabisan memori.
Gunakan pipelining untuk operasi batch yang efisien.
Perhatikan latensi jaringan karena dapat berdampak pada kinerja saat bekerja dengan server Redis jarak jauh.
Amankan koneksi Redis dengan kata sandi dan firewall.
Kesimpulan
Redis adalah alat yang kuat dan serbaguna untuk mengelola data dalam aplikasi Python. Menggunakan Python dengan Redis dapat menghadirkan banyak aplikasi dan use case, mulai dari caching data hingga mengelola antrian.
Ingin mempelajari lebih lanjut tentang Redis? Introduction to NoSQL kami dapat membantu Anda mempelajari cara menangani data key-value. Tertarik dengan Python? Maka Python Data Fundamentals skill track kami mungkin menjadi tempat terbaik untuk mulai.
Python Redis FAQs
Mengapa menggunakan Python untuk Redis?⌄
Python adalah bahasa pemrograman yang serbaguna dan populer yang memungkinkan manipulasi data secara efisien dan mudah, menjadikannya pilihan ideal untuk bekerja dengan database Redis.
Bisakah saya menggunakan bahasa lain selain Python dengan Redis?⌄
Ya, Redis mendukung banyak bahasa seperti Java, JavaScript, PHP, dan lainnya. Namun, Python dikenal karena kesederhanaan dan fleksibilitasnya saat bekerja dengan Redis.
Apakah Redis sulit dipelajari bagi pemula?⌄
Meskipun mungkin ada kurva pembelajaran di awal, sintaks Python yang jelas membuatnya relatif mudah dipelajari. Selain itu, banyak sumber daya daring tersedia untuk membantu pemula mempelajari cara menggunakan Redis.
Apa yang bisa saya lakukan dengan Python dan Redis? ⌄
Dengan Python dan Redis, Anda dapat melakukan berbagai tugas seperti manipulasi data, caching, messaging, dan lainnya. Anda juga dapat mengintegrasikan Redis dengan alat dan teknologi lain untuk meningkatkan aplikasi Anda.
Apa saja use case praktis menggunakan Python dan Redis bersama-sama?⌄
Beberapa use case umum mencakup analitik real-time, manajemen sesi, antrian tugas, dan caching database. Selain itu, Anda dapat menggunakan Python dan Redis untuk membangun aplikasi web yang terukur, chatbot, dan model pembelajaran mesin.
Saya Austin, seorang blogger dan penulis teknologi dengan pengalaman bertahun-tahun sebagai data scientist dan analis data di bidang kesehatan. Memulai perjalanan teknologi dengan latar belakang biologi, kini saya membantu orang lain melakukan transisi yang sama melalui blog teknologi saya. Ketertarikan saya pada teknologi mendorong kontribusi tulisan saya untuk puluhan perusahaan SaaS, menginspirasi orang lain dan membagikan pengalaman saya.
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dapatkan keterampilan yang sangat dicari untuk mengelola data dengan efisien, termasuk mengimpor, membersihkan, mengelola data, serta menjadwalkan dan memantau pipeline, sehingga Anda dapat menonjol di bidang data engineering.
Telusuri lebih dalam keahlian tingkat lanjut dan alat-alat terkini yang merevolusi peran insinyur data saat ini melalui program Professional Data Engineer kami.
Menggunakan Redis dengan Python adalah kombinasi yang kuat bagi engineer data yang ingin membangun sistem berkinerja tinggi, terukur, dan mudah dipelihara. Baik Anda mengoptimalkan lapisan cache, mengelola aliran peristiwa real-time, atau menerapkan penguncian terdistribusi, Redis menyediakan solusi yang fleksibel dan efisien.
Dalam panduan ini, kami akan membahas dasar-dasar penggunaan Redis dengan Python untuk membantu Anda mengintegrasikannya secara mulus ke dalam alur kerja rekayasa data Anda.
Apa itu Python Redis?
Redis adalah penyimpanan struktur data in-memory open-source yang digunakan sebagai database, cache, dan message broker. Nama Redis merupakan singkatan dari Remote Dictionary Server dan awalnya dirancang sebagai sistem penyimpanan key-value dengan waktu akses yang cepat.
Redis mendukung berbagai struktur data seperti string, hash, list, set, dan sorted set dengan kueri rentang. Redis juga menyediakan fitur lanjutan seperti transaksi, pesan pub/sub, skrip Lua, serta kemampuan replikasi dan klaster bawaan untuk ketersediaan dan skalabilitas yang lebih baik.
Kasus penggunaan Redis yang umum
Potensi kasus penggunaan Redis sangat luas dan beragam.
Beberapa kasus penggunaan paling umum dalam rekayasa data meliputi:
Redis juga umum digunakan bersama teknologi lain seperti web server (mis. NGINX), database (mis. MySQL), dan sistem messaging (mis. Kafka) untuk mengoptimalkan kinerja dan skalabilitas.
Mengapa menggunakan Redis dengan Python?
Python adalah bahasa dominan dalam rekayasa data karena fleksibilitas, ekosistem yang luas, dan kemudahan integrasi dengan teknologi big data.
Menggabungkannya dengan Redis dapat menghadirkan banyak manfaat bagi aplikasi Anda:
Apa itu Redis-py?
Redis-py adalah pustaka klien resmi Redis untuk Python. Pustaka ini menyediakan antarmuka yang mudah digunakan untuk berkomunikasi dengan Redis dari dalam kode Python Anda.
Beberapa fitur utamanya meliputi:
Menyiapkan Redis untuk Pengembangan Python
Mari kita lihat cara menyiapkan Redis menggunakan Python.
Ada tiga cara utama untuk menjalankan Redis:
Metode A: Menggunakan Docker
Pertama, saat menggunakan Docker, Anda perlu memasang Docker Desktop di mesin Anda. Ini dapat diunduh dari situs DockerHub.
Setelah Docker terpasang, buka command prompt dan masukkan perintah berikut.
Berikutnya, kita akan memulai container baru.
docker pull redismengunduh image resmi Redis terbaru.docker run --name my-redis -p 6379:6379 -d redismemulai container baru bernama my-redis. Parameter-p 6379:6379memetakan port 6379 mesin lokal ke port 6379 container, sehingga Anda dapat terhubung ke Redis dilocalhost:6379. Flag-dmenjalankan container di latar belakang (detached mode).Untuk verifikasi, jalankan:
Seharusnya merespons dengan
PONG.Metode B: Menggunakan Windows Subsystem for Linux (WSL)
Untuk mesin Windows, metode lain yang memungkinkan adalah menggunakan Windows Subsystem for Linux. Proses pemasangan akan dilakukan melalui Linux.
Perintah ini memasang dan mengonfigurasi distribusi Ubuntu bawaan di WSL. Mulai ulang jika diperlukan.
Lalu, buka terminal Ubuntu Anda (dari Microsoft Store atau dengan mengetik wsl di PowerShell) dan jalankan:
Selanjutnya, mulai server Redis Anda.
Mari lakukan uji untuk memastikan server aktif berjalan.
Berikut penjelasan detail perintah yang kita gunakan di atas:
sudo apt-get updatemengambil definisi paket terbaru.sudo apt-get install redis-servermemasang Redis di lingkungan Ubuntu.sudo service redis-server startsegera memulai layanan Redis.redis-cli pingmenguji konektivitas ke server Redis lokal, mengembalikanPONGjika berhasil.Metode C: Build pihak ketiga
Solusi ini menyediakan binary Windows native. Setelah mengunduh dan memasang atau mengekstrak, jalankan:
Setelah dijalankan, redis-server.exe akan menampilkan log yang menunjukkan sedang mendengarkan pada 127.0.0.1:6379.
Anda dapat mengonfirmasi menggunakan CLI yang disertakan (jika ada):
Anda akan mendapatkan hasil
PONGjika berhasil.Memasang pustaka redis-py
Selanjutnya, Anda perlu memasang pustaka redis-py agar dapat mengakses database menggunakan Python. Sebelum memasang pustaka, pastikan Anda telah memasang Python dan Redis secara terpisah.
Perintah ini mengunduh dan memasang pustaka klien Python Redis (redis-py) dari PyPI. Jika Anda menggunakan virtual environment, pastikan Anda mengaktifkannya sebelum menjalankan perintah ini.
Verifikasi dengan:
Ini akan mencetak nomor versi (mis., 5.2.1).
Menyiapkan server Redis
Jika Anda mengikuti salah satu metode di atas (Docker, WSL, atau build pihak ketiga), sekarang Anda seharusnya memiliki server Redis yang berjalan di
localhost:6379. Itu sudah cukup untuk pengembangan lokal di Windows.Bekerja dengan Struktur Data Redis
Di bawah ini adalah contoh Python yang mendemonstrasikan cara terhubung dan memanipulasi berbagai tipe data Redis. Setiap blok kode menyertakan komentar penjelas tentang cara kerja metode atau perintahnya.
String di Redis
Kita membuat objek Redis yang terhubung ke server Redis lokal.
r.set("mykey", "hello from Windows")menyimpan string "hello from Windows" di bawah key "mykey".r.get("mykey")mengambil nilai yang disimpan di mykey. Redis mengembalikan bytes, jadi kita decode untuk output yang mudah dibaca manusia.r.delete("mykey")menghapus key mykey sepenuhnya.Contoh: Menyimpan dan mengambil sesi pengguna
Berikut contoh kode manajemen sesi pengguna:
store_user_session(user_id): Membuat ID unik global melaluiuuid.uuid4()dan menyimpannya di bawah key spesifik pengguna.get_user_session(user_id): Membaca kembali token sesi. JikaNone, sesi tidak ada atau telah kedaluwarsa.delete_user_session(user_id): Menghapus key sesi dari Redis, sehingga pengguna efektif keluar.List di Redis
List Redis adalah urutan string yang terurut. List mendukung operasi di kedua ujungnya, sehingga cocok untuk antrian, stack, atau log.
lpush("task_queue", "task1")menambahkan"task1"ke sisi kiri list bernama "task_queue".rpush("task_queue", "task2")danrpush("task_queue", "task3")menambahkan tugas ke sisi kanan.lpop("task_queue") dan rpop("task_queue")menghapus dan mengembalikan item dari masing-masing ujung list.Contoh: Menerapkan antrian sederhana berbasis Redis
enqueue_taskselalu menambahkan tugas baru ke akhir list, yang meniru antrian FIFO tradisional.dequeue_taskmenghapus tugas dari depan. Jika list kosong, fungsi ini mengembalikanNone.While-loop memproses tugas hingga antrian kosong, lalu berhenti.
Hash di Redis
Hash mirip dengan kamus (dictionary) Python tetapi disimpan di Redis. Hash sangat cocok untuk mengelompokkan field terkait (mis., detail pengguna).
hset("user:1001", "name", "Alice")menetapkan field"name"bernilai "Alice" di dalam hash pada key "user:1001".hget("user:1001", "email")mengambil field"email".hdel("user:1001", "email")menghapus field"email"dari hash tersebut.Contoh: Menyimpan dan mengakses profil pengguna terstruktur
Kita menyimpan nama dan email pengguna di dalam hash.
mapping={"name": name, "email": email}memanfaatkan kemampuanredis-pyuntuk menetapkan beberapa field sekaligus.r.hgetall(user_key)mengambil semua field dan nilai, dikembalikan sebagai dictionary berisi bytes mentah yang kita decode menjadi string.delete_user_profilemenghapus seluruh key hash.Set dan Sorted Set
Data di Redis dapat dikelola menggunakan set atau sorted set.
Set adalah koleksi nilai unik, sedangkan sorted set adalah koleksi pasangan key-nilai dengan skor terkait pada setiap nilai. Struktur data ini menyediakan cara yang efisien untuk menyimpan dan mengambil data, sehingga berguna untuk aplikasi yang memerlukan pencarian cepat.
Set
Set di Redis mirip dengan himpunan matematika – berisi kumpulan elemen unik, dan tidak diperbolehkan ada duplikat. Set dapat digunakan untuk memodelkan hubungan antar entitas, seperti pengguna yang menyukai sebuah posting di media sosial.
Berikut demonstrasi set:
Set Redis memastikan keunikan anggota. Upaya menambahkan anggota duplikat tidak akan berpengaruh.
Hasil
smembersadalah set Python berisi bytes.Sorted set
Sorted set di Redis mirip dengan set biasa, tetapi setiap anggotanya juga memiliki skor terkait. Ini memungkinkan operasi pengurutan dan pemeringkatan yang efisien pada set.
Sorted set sering digunakan untuk leaderboard, di mana skor merepresentasikan peringkat atau poin pemain.
Berikut demonstrasi sorted set:
Sorted set menyimpan anggota dalam urutan tertentu yang ditentukan oleh skor numeriknya.
zrange("leaderboard", 0, -1, withscores=True)mengembalikan semua anggota dari peringkat 0 hingga akhir, termasuk skornya.Contoh: Mengelola tag atau leaderboard
Penggunaan sorted set dapat membantu dalam mengelola tag atau membuat leaderboard.
add_tagdanget_tagsmendemonstrasikan sistem tagging one-to-many, menyimpan tag dalam Set.update_leaderboarddanget_leaderboardmenunjukkan cara mengimplementasikan leaderboard gim.Fitur Redis dalam Aplikasi Python
Redis memiliki beberapa fitur yang menjadikannya pilihan populer untuk penyimpanan data dalam aplikasi Python: antrian, penguncian, dan caching.
Berikut implementasinya dalam Python:
Redis sebagai antrian (dengan blocking)
Mari jelajahi penggunaan Redis sebagai antrian dengan blocking menggunakan
BLPOP.BLPOPadalah operasi blocking yang menunggu hingga elemen tersedia dalam list.blocking_consumermenggunakanblpopdalam loop. Jika list kosong,blpopakan menunggu hingga item lain didorong masuk.Setelah item diterima, item dihapus dari list dan dicetak.
Pendekatan ini ideal untuk pola produsen-konsumen di mana worker mengonsumsi tugas saat muncul.
Menerapkan lock di Redis
Lock terdistribusi mencegah beberapa klien atau proses secara bersamaan memodifikasi sumber daya yang sama. Redis dapat membantu menghindari race condition di lingkungan terdistribusi.
Kita membuat lock dengan
timeout=10, artinya jika lock tidak dirilis secara manual, Redis akan otomatis menghapusnya dalam 10 detik untuk mencegah blocking tanpa batas (deadlock).lock.acquire(blocking=True, blocking_timeout=5)mencoba memperoleh lock selama 5 detik sebelum menyerah. Setelah selesai,lock.release()membebaskan sumber daya untuk proses lain.Caching dengan Redis
Caching adalah skenario penggunaan umum: menyimpan data yang sering diakses di memori, mengurangi beban pada database atau API eksternal.
Kita memeriksa apakah
user_data:{user_id}ada di Redis. Jika ada, itu cache hit, dan kita melewati pemanggilan API. Jika tidak, kita ambil dari API jarak jauh, lalusetex(set + kedaluwarsa) selama 60 detik. Panggilan berikutnya dalam rentang waktu tersebut akan mengambil data dari cache, menurunkan latensi.Topik Lanjutan di Redis
Sudah merasa cukup paham Redis? Mari bahas beberapa topik yang lebih lanjut.
Menggunakan Pub/Sub dengan Redis
Pub/Sub (Publish/Subscribe) adalah pola messaging populer untuk komunikasi real-time. Publisher mengirim pesan ke sebuah kanal, dan semua subscriber kanal tersebut menerima pesan.
pubsub = r.pubsub()membuat objek PubSub.pubsub.subscribe(channel_name)menginstruksikan Redis untuk mengirim pesan dari kanal tersebut ke objek PubSub.pubsub.listen()adalah iterator tak terbatas, menghasilkan pesan saat datang.r.publish(channel_name, message)mengirim pesan ke semua subscriberchannel_name.Masa berlaku (expiry) key di Redis
Redis mendukung time-to-live (TTL). Ini penting untuk data sementara seperti sesi atau cache berumur pendek.
r.expire("temp_key", 30)menetapkan TTL 30 detik. Setelah 30 detik,temp_keyotomatis dihapus.r.setex("temp_key2", 60, "another value")adalah jalan pintas yang menetapkan key dan masa berlaku sekaligus.Contoh: Kedaluwarsa sesi
Berikut contoh bagaimana Anda dapat menggunakan key yang kedaluwarsa untuk menetapkan sesi berakhir setelah durasi waktu tertentu.
store_session_with_expirymenggunakansetexdi balik layar untuk menyimpanuser:{user_id}:sessiondengan TTL tertentu. Jika Anda tidak menetapkan TTL, key dapat bertahan tanpa batas.Saat TTL berakhir, Redis akan menghapus key secara otomatis, sehingga sesi tidak dapat diambil lagi.
Praktik Terbaik Menggunakan Redis dengan Python
Mengelola Redis memerlukan beberapa pertimbangan dan praktik terbaik untuk memastikan kinerja optimal dan menghindari jebakan umum.
Beberapa kiat yang perlu diingat meliputi:
Kesimpulan
Redis adalah alat yang kuat dan serbaguna untuk mengelola data dalam aplikasi Python. Menggunakan Python dengan Redis dapat menghadirkan banyak aplikasi dan use case, mulai dari caching data hingga mengelola antrian.
Ingin mempelajari lebih lanjut tentang Redis? Introduction to NoSQL kami dapat membantu Anda mempelajari cara menangani data key-value. Tertarik dengan Python? Maka Python Data Fundamentals skill track kami mungkin menjadi tempat terbaik untuk mulai.