def _rc_msetnx(self, mapping): """ Sets each key in the ``mapping`` dict to its corresponding value if none of the keys are already set """ for k in dictkeys(mapping): if self.exists(k): return False return self._rc_mset(mapping)
def function(*args, **kwargs): if name not in StrictRedisCluster._loop_keys: # take care of hash tags tag_start = None tag_end = None key_type = hash_tag = '' # since we don't have "first item" in dict, # this list is needed in order to check hash_tag in mset({"a{a}": "a", "b":"b"}) list_ht = [] if isinstance(args[0], (basestring, bytes)): key_type = 'string' list_ht.append(args[0]) else: if isinstance(args[0], list): key_type = 'list' list_ht.append(args[0][0]) else: key_type = 'dict' list_ht = dictkeys(args[0]) # check for hash tags for k in list_ht: try: tag_start = k.index('{') tag_end = k.index('}') hash_tag = k break except Exception as e: tag_start = None # trigger error msg on tag keys unless we have hash tags e.g. "bar{zap}" if name in StrictRedisCluster._tag_keys and not tag_start: try: return getattr(self, '_rc_' + name)(*args, **kwargs) except AttributeError: raise redis.DataError("rediscluster: Command %s Not Supported (each key name has its own node)" % name) # get the hash key hkey = args[0] # take care of hash tags names for forcing multiple keys on the same node, # e.g. r.set("bar{zap}", "bar"), r.mget(["foo{foo}","bar"]) if tag_start is not None: L = list(args) if key_type != 'string': if key_type == 'list': hkey = L[0][0][tag_start + 1:tag_end] else: hkey = hash_tag[tag_start + 1:tag_end] else: hkey = L[0][tag_start + 1:tag_end] args = tuple(L) # get the node number node = self._getnodenamefor(hkey) if name in StrictRedisCluster._write_keys: redisent = self.redises[node] elif name in StrictRedisCluster._read_keys: redisent = self.redises[node + '_slave'] else: raise redis.DataError("rediscluster: Command %s Not Supported (each key name has its own node)" % name) # Execute the command on the server return getattr(redisent, name)(*args, **kwargs) else: # take care of keys that don't need to go through master and slaves redis servers if name not in self._loop_keys_admin: try: return getattr(self, '_rc_' + name)(*args, **kwargs) except AttributeError: raise redis.DataError("rediscluster: Command %s Not Supported (each key name has its own node)" % name) result = {} for alias, redisent in iteritems(self.redises): if (name in StrictRedisCluster._write_keys and alias.find('_slave') >= 0) or (name in StrictRedisCluster._read_keys and alias.find('_slave') == -1): res = None else: res = getattr(redisent, name)(*args, **kwargs) result[alias] = res return result
def function(*args, **kwargs): if name not in StrictRedisCluster._loop_keys: # take care of hash tags tag_start = None key_type = hash_tag = '' # since we don't have "first item" in dict, # this list is needed in order to check hash_tag in mset({"a{a}": "a", "b":"b"}) list_ht = [] if isinstance(args[0], (basestring, bytes)): key_type = 'string' list_ht.append(args[0]) else: if isinstance(args[0], list): key_type = 'list' list_ht.append(args[0][0]) else: key_type = 'dict' list_ht = dictkeys(args[0]) # check for hash tags for k in list_ht: try: tag_start = k.index('{') hash_tag = k break except Exception as e: tag_start = None # trigger error msg on tag keys unless we have hash tags e.g. "bar{zap}" if name in StrictRedisCluster._tag_keys and not tag_start: try: return getattr(self, '_rc_' + name)(*args, **kwargs) except AttributeError: raise redis.DataError( "rediscluster: Command %s Not Supported (each key name has its own node)" % name) # get the hash key hkey = args[0] # take care of hash tags names for forcing multiple keys on the same node, # e.g. r.set("bar{zap}", "bar"), r.mget(["foo{foo}","bar"]) if tag_start is not None: L = list(args) if key_type != 'string': if key_type == 'list': hkey = L[0][0][tag_start + 1:-1] L[0][0] = L[0][0][0:tag_start] else: hkey = hash_tag[tag_start + 1:-1] L[0][hash_tag[0:tag_start]] = L[0][hash_tag] del L[0][hash_tag] else: hkey = L[0][tag_start + 1:-1] L[0] = L[0][0:tag_start] args = tuple(L) # get the node number node = self._getnodenamefor(hkey) if name in StrictRedisCluster._write_keys: redisent = self.redises[node] elif name in StrictRedisCluster._read_keys: redisent = self.redises[node + '_slave'] else: raise redis.DataError( "rediscluster: Command %s Not Supported (each key name has its own node)" % name) # Execute the command on the server return getattr(redisent, name)(*args, **kwargs) else: # take care of keys that don't need to go through master and slaves redis servers if name not in self._loop_keys_admin: try: return getattr(self, '_rc_' + name)(*args, **kwargs) except AttributeError: raise redis.DataError( "rediscluster: Command %s Not Supported (each key name has its own node)" % name) result = {} for alias, redisent in iteritems(self.redises): if (name in StrictRedisCluster._write_keys and alias.find('_slave') >= 0) or ( name in StrictRedisCluster._read_keys and alias.find('_slave') == -1): res = None else: res = getattr(redisent, name)(*args, **kwargs) result[alias] = res return result