Example #1
0
            public override IRedisSocket GetRedisSocket(CommandPacket cmd)
            {
                if (cmd != null && (_rw_splitting || !_is_single))
                {
                    var cmdset = CommandSets.Get(cmd._command);
                    if (cmdset != null)
                    {
                        if (!_is_single && (cmdset.Status & CommandSets.LocalStatus.check_single) == CommandSets.LocalStatus.check_single)
                        {
                            throw new RedisServerException($"RedisClient: Method cannot be used in {UseType} mode. You can set \"max pool size=1\", but it is not singleton mode.");
                        }

                        if (_rw_splitting &&
                            ((cmdset.Tag & CommandSets.ServerTag.read) == CommandSets.ServerTag.read ||
                             (cmdset.Flag & CommandSets.ServerFlag.@readonly) == CommandSets.ServerFlag.@readonly))
                        {
                            var rndkeys = _ib.GetKeys(v => v == null || v.IsAvailable && v._policy._connectionStringBuilder.Host != _masterHost);
                            if (rndkeys.Any())
                            {
                                var rndkey      = rndkeys[_rnd.Value.Next(0, rndkeys.Length)];
                                var rndpool     = _ib.Get(rndkey);
                                var rndcli      = rndpool.Get();
                                var rndrds      = rndcli.Value.Adapter.GetRedisSocket(null);
                                var rndrdsproxy = DefaultRedisSocket.CreateTempProxy(rndrds, () => rndpool.Return(rndcli));
                                rndrdsproxy._pool = rndpool;
                                return(rndrdsproxy);
                            }
                        }
                    }
                }
                var poolkey = _masterHost;

                if (string.IsNullOrWhiteSpace(poolkey))
                {
                    throw new RedisClientException($"【{_connectionString.Host}】Redis Sentinel is switching");
                }
                var pool     = _ib.Get(poolkey);
                var cli      = pool.Get();
                var rds      = cli.Value.Adapter.GetRedisSocket(null);
                var rdsproxy = DefaultRedisSocket.CreateTempProxy(rds, () => pool.Return(cli));

                rdsproxy._pool = pool;
                return(rdsproxy);
            }
Example #2
0
        internal bool IsReadOnlyCommand()
        {
            var cmdset = CommandSets.Get(_command);

            return(cmdset != null && ((cmdset.Tag & CommandSets.ServerTag.read) == CommandSets.ServerTag.read || (cmdset.Flag & CommandSets.ServerFlag.@readonly) == CommandSets.ServerFlag.@readonly));
        }