Redis: Alat berkuasa untuk membina sistem berskala tinggi, contoh kod khusus diperlukan
Redis ialah sistem storan struktur data dalam memori sumber terbuka yang juga boleh digunakan sebagai baris gilir mesej dan pangkalan data cache. Ia adalah alat berkuasa yang membantu kami membina sistem yang sangat berskala. Artikel ini akan memperkenalkan anda kepada beberapa ciri umum Redis dan kod pelaksanaannya.
Mod Sentinel Redis boleh membantu kami mencapai ketersediaan tinggi. Apabila nod induk turun, Sentinel boleh memilih nod induk baharu secara automatik. Berikut ialah contoh pelaksanaan mod sentri yang mudah:
Fail konfigurasi:
sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000
Kod:
# 使用redis-py实现哨兵模式 import redis sentinel = redis.RedisSentinel( [('127.0.0.1', 26379)], socket_timeout=0.1, ) redis_master = sentinel.master_for('mymaster', socket_timeout=0.1) redis_slave = sentinel.slave_for('mymaster', socket_timeout=0.1) redis_master.set('key', 'value') print(redis_slave.get('key'))
Dalam sistem teragih, untuk mengelakkan masalah konkurensi, kita perlu menggunakan kunci perkongsian yang diedarkan Akses kepada sumber. Redis boleh melaksanakan kunci teragih melalui arahan SETNX dan GETSET. Berikut ialah contoh mudah pelaksanaan kunci yang diedarkan Redis:
Kod:
import redis class RedisLock(object): def __init__(self, name, acquire_timeout=10, expire_time=60): self.redis = redis.Redis() self.name = 'redis_lock_key_{}'.format(name) self.acquire_timeout = acquire_timeout self.expire_time = expire_time def acquire_lock(self): start_time = time.time() while True: end_time = time.time() if self.redis.setnx(self.name, 1): self.redis.expire(self.name, self.expire_time) return True elif end_time - start_time > self.acquire_timeout: return False time.sleep(0.1) def release_lock(self): self.redis.delete(self.name) redis_lock = RedisLock('test') if redis_lock.acquire_lock(): try: # 操作共享资源 pass finally: redis_lock.release_lock()
Mod terbitan/langgan Redis membolehkan pelanggan berbeza berkomunikasi dalam masa nyata melalui saluran. Berikut ialah contoh pelaksanaan mudah bagi corak terbitkan/langgan:
Kod:
import redis import threading def subscribe_channel(redis, channel): pub_sub = redis.pubsub() pub_sub.subscribe(channel) for message in pub_sub.listen(): print(message) redis_sub = redis.StrictRedis(decode_responses=True) redis_pub = redis.StrictRedis(decode_responses=True) redis_thread = threading.Thread(target=subscribe_channel, args=(redis_sub, 'test_channel')) redis_thread.start() redis_pub.publish('test_channel', 'Hello, Redis!')
Redis menyokong operasi kompleks dengan melaksanakan skrip Lua, yang bersifat atom dan boleh dilaksanakan dengan cekap dalam Redis. Berikut ialah contoh pelaksanaan skrip Lua yang mudah:
Kod:
import redis redis_client = redis.Redis() add_script = redis_client.register_script(""" local current_value = redis.call('get', KEYS[1]) current_value = tonumber(current_value) or 0 current_value = current_value + tonumber(ARGV[1]) redis.call('set', KEYS[1], current_value) return current_value """) add_script(keys=['test_lua_key'], args=[1])
Ringkasan
Artikel ini memperkenalkan empat ciri biasa Redis dan menyediakan contoh kod yang sepadan. Mod Sentinel dan kunci yang diedarkan boleh membantu kami mencapai ketersediaan tinggi dan kawalan serentak dengan mod penerbitan/langganan boleh membantu kami mencapai komunikasi masa nyata dan skrip Lua boleh membantu kami melaksanakan operasi yang kompleks; Dengan mempelajari ciri Redis ini, kami boleh membina sistem yang sangat berskala dengan lebih baik.
Atas ialah kandungan terperinci Redis: alat yang berkuasa untuk membina sistem yang sangat berskala. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!