Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/advanced_configuration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ read/write server and secondary servers as read-only.
'OPTIONS': {
'PASSWORD': 'yadayada',
'MASTER_CACHE': '127.0.0.1:6379',
'MASTER_WRITE_ONLY': False,
...
},
...
Expand Down
2 changes: 1 addition & 1 deletion redis_cache/backends/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ def get_master_client(self):
"""
cache = self.options.get('MASTER_CACHE', None)
if cache is None:
return next(iter(self.client_list))
return next(iter(self.clients.values()))

kwargs = parse_connection_kwargs(cache, db=self.db)
return self.clients[(
Expand Down
10 changes: 7 additions & 3 deletions redis_cache/backends/single.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,17 @@ def __init__(self, server, params):
client = self.create_client(server)
self.clients[client.connection_pool.connection_identifier] = client

self.client_list = self.clients.values()
self.master_client = self.get_master_client()
self.master_client = master = self.get_master_client()
master_write_only = self.options.get('MASTER_WRITE_ONLY', False)
self.client_list = [
client for client in self.clients.values()
if not (master_write_only and client is master)
]

def get_client(self, key, write=False):
if write and self.master_client is not None:
return self.master_client
return random.choice(list(self.client_list))
return random.choice(self.client_list)

####################
# Django cache api #
Expand Down
22 changes: 22 additions & 0 deletions tests/testapp/tests/master_slave_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,18 @@
'MASTER_CACHE': MASTER_LOCATION,
},
},
'master_write_only': {
'BACKEND': 'redis_cache.RedisCache',
'LOCATION': LOCATIONS,
'OPTIONS': {
'DB': 1,
'PASSWORD': 'yadayada',
'PARSER_CLASS': 'redis.connection.HiredisParser',
'PICKLE_VERSION': -1,
'MASTER_CACHE': MASTER_LOCATION,
'MASTER_WRITE_ONLY': True,
},
},
})
class MasterSlaveTestCase(SetupMixin, TestCase):

Expand Down Expand Up @@ -93,3 +105,13 @@ def test_clear(self):
time.sleep(.2)
for client in self.cache.clients.values():
self.assertEqual(len(client.keys('*')), 0)

def test_master_in_client_list_by_default(self):
cache = self.get_cache()
master = cache.get_master_client()
self.assertIn(master, cache.client_list)

def test_master_not_in_client_list_if_master_write_only(self):
cache = self.get_cache('master_write_only')
master = cache.get_master_client()
self.assertNotIn(master, cache.client_list)