我对C++很陌生,所以在我学习的时候,我倾向于设计很多Java主义.无论如何,在Java中,如果我的类具有"搜索"方法,该方法T将从Collection< T >匹配特定参数的对象返回一个对象,我将返回该对象,如果在集合中找不到该对象,我将返回null.然后在我的调用函数中,我会检查if(tResult != null) { ... }
在C++中,我发现null如果对象不存在,我就无法返回值.我只想返回一个类型为T的'指示符',它通知调用函数没有找到任何对象.我不想抛出异常,因为它并不是一个特例.
这就是我的代码现在的样子:
class Node {
Attr& getAttribute(const string& attribute_name) const {
//search collection
//if found at i
return attributes[i];
//if not found
return NULL; // what should this be?
}
private:
vector<Attr> attributes;
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能改变它以便我能给出那种标记?
我正在寻找一个使用redis哨兵的jedis的例子.我无法使用jedis设施进行哨兵,我找不到任何好的示例或文档.
我们目前正在使用Redis 2.8.4和StackExchange.Redis(并且喜欢它),但目前还没有针对硬件故障等的任何形式的保护.我正在尝试使解决方案正常工作,我们有主/从和监控但不能完全到达那里,我在搜索后找不到任何真正的指针.
所以目前我们已经做到了这一点:
我们在每个节点上有3个redis服务器和sentinel(由Linux人员设置):devredis01:6383(master)devredis02:6383(slave)devredis03:6383(slave)devredis01:26379(sentinel)devredis02:26379(sentinel)devredis03: 26379(哨兵)
我能够将StackExchange客户端连接到redis服务器并进行写入/读取,并使用Redis Desktop Manager验证是否正在跨所有redis实例复制数据.
我也可以使用不同的ConnectionMultiplexer连接到sentinel服务,查询配置,请求主redis节点,请求奴隶等.
我们还可以终止主redis节点并验证其中一个从服务器是否已升级为主服务器,并且复制到另一个从服务器继续工作.我们可以观察redis连接尝试重新连接到主设备,如果我重新创建ConnectionMultiplexer,我可以再次写入/读取新升级的主设备并从从设备读取.
到现在为止还挺好!
我缺少的是你如何在生产系统中将它们整合在一起?
我应该从sentinel获取redis端点并使用2个ConnectionMultiplexers吗?我究竟需要做些什么来检测节点是否已经关闭?StackExchange可以自动为我执行此操作还是通过事件,以便重新连接我的redis ConnectionMultiplexer?我应该处理ConnectionFailed事件然后重新连接,以便ConnectionMuliplexer找出新主设备是什么?据推测,当我重新连接任何写入的尝试都会丢失?
我希望我不会错过一些非常明显的东西,我只是在努力将它们放在一起.
提前致谢!
在阅读Eric Niebler的范围提议时,
我遇到了哨兵一词,作为最终迭代器的替代品.
我很难理解哨兵对末端迭代器的好处.
有人可以提供一个明确的例子,说明发送到表中的内容是不能用标准迭代器对完成的吗?
" 哨兵是过去的迭代器的抽象.哨兵是常规类型,可用于表示范围的结束.表示范围的哨兵和迭代器应为EqualityComparable.哨兵表示一个元素.迭代器我比较等于哨兵,我指向那个元素." - N4382
我认为哨兵在确定范围的结束时起着作用,而不仅仅是位置?
我尝试了以下错误消息推荐的所有内容:
(错误)DENIED Redis正在受保护模式下运行,因为启用了保护模式,未指定绑定地址,也未向客户端请求身份验证密码.在此模式下,仅从环回接口接受连接.如果要从外部计算机连接到Redis,可以采用以下解决方案之一:1)通过从服务器的同一主机连接到Redis,只需禁用保护模式从环回接口发送命令'CONFIG SET protected-mode no'正在运行,但如果您这样做,则无法通过互联网公开访问.使用CONFIG REWRITE使此更改成为永久更改.2)或者,您可以通过编辑Redis配置文件并将protected mode选项设置为"no"来禁用保护模式,然后重新启动服务器.3)如果您手动启动服务器进行测试,请使用"--protected-mode no"选项重新启动它.4)设置绑定地址或验证密码.注意:您只需要执行上述操作之一,服务器就可以开始接受来自外部的连接.
我的/etc/redis/sentinel.conf:
daemonize yes sentinel myid XXX sentinel monitor master XXX 6379 2 sentinel down-after-milliseconds master 60000 sentinel config-epoch master 0 protected-mode no bind 0.0.0.0 port 26379
编辑:我的/etc/redis/redis.conf:
port 6379 bind 0.0.0.0 protected-mode no
我也尝试过添加sentinel auth-pass master XXX.
我的整个后端都在私有子网上.我已经进入防火墙后面的数据中心,来自同一个专用网络,我仍然可以只在本地连接而不会收到令人沮丧的错误消息.
服务器环境: Debian 8,Redis 3.2.6
客户端环境: Ubuntu 16.10,redis-cli 3.2.1
Redis实例: 3个
Sentinel实例: 3
我不只是一个,而是建议的3/4(没有设置命令行标志).有没有人有任何指导或想法?我显然遗漏了一些我无法从错误消息,文档,Stackoverflow,Google和试错中找到的东西.在想深入了解源代码之前,我想先在这里发一个问题.
任何帮助表示赞赏.谢谢!
...而且,是的,我在配置更改后重新启动了守护进程.:)
>>> class foo(object):
... def test(s):
... pass
...
>>> a=foo()
>>> a.test is a.test
False
>>> print a.test
<bound method foo.test of <__main__.foo object at 0x1962b90>>
>>> print a.test
<bound method foo.test of <__main__.foo object at 0x1962b90>>
>>> hash(a.test)
28808
>>> hash(a.test)
28808
>>> id(a.test)
27940656
>>> id(a.test)
27940656
>>> b = a.test
>>> b is b
True
Run Code Online (Sandbox Code Playgroud) 关于gnu的C的文档说明如果函数有,__attribute__((sentinel))它必须NULL作为函数的最后一个参数.
是否可以将任何其他值作为结束参数列表的标记?
好吧,我觉得我错过了一些重要的信息.
本地我有1个主服务器和1个从服务器redis服务器在不同的端口上运行 http://redis.io/topics/sentinel
我也有3个哨兵,他们似乎都相互了解并按预期工作.
现在我有一个很大的java代码指向我的主redis服务器127.0.0.1:6379.
如果我取下主人,哨兵会像预期的那样推动奴隶掌握,所以现在新的主人开启了
127.0.0.1:6380
我的问题是我的代码如何知道这一点和自动切换?
我正在使用NLog日志记录框架,我正在尝试获取异常和堆栈跟踪信息,这些信息显示在任何UDP记录器应用程序中,例如Sentinel和Log2Console,但只能显示日志消息部分.输出到文件的效果很好,因为大多数示例都是如此,因此问题围绕着使用NLog的网络目标.
如果自定义格式可以应用于内部异常和堆栈跟踪,则可以获得奖励,但这不是必需的.Exception.ToString()会有很长的路要走.
关于示例代码的注意事项:使用Log2Console,我发现了一篇关于如何将异常作为单独的日志条目发送的文章.虽然这很有效,但我对解决方案并不满意.
示例异常记录代码:
Logger Log = LogManager.GetCurrentClassLogger();
try
{
throw new InvalidOperationException("My ex", new FileNotFoundException("My inner ex1", new AccessViolationException("Innermost ex")));
}
catch (Exception e)
{
Log.ErrorException("TEST", e);
}
Run Code Online (Sandbox Code Playgroud)
示例NLog.config:
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets async="true">
<!-- Send by UDP to Sentinel with NLogViewer protocol -->
<target name="network" xsi:type="NLogViewer" address="udp://192.168.1.3:9999" layout="${message}${onexception:inner=${newline}${exception:format=tostring}}" />
<!-- Send message by UDP to Log2Console with Chainsaw protocol -->
<target name="network2" xsi:type="Chainsaw" address="udp://192.168.1.3:9998" …Run Code Online (Sandbox Code Playgroud) 我的任务是使用循环来添加一系列数字,并且该循环需要它的sentinel值0才能停止.然后它应该显示添加的总数.到目前为止,我的代码是:
total = 0
print("Enter a number or 0 to quit: ")
while True:
number = int(input("Enter a number or 0 to quit: "))
print("Enter a number or 0 to quit: ")
if number == 0:
break
total = total + number
print ("The total number is", total)
Run Code Online (Sandbox Code Playgroud)
然而,当我运行它时,我输入后不打印总数0.它只是打印"Enter a number or 0 to quit",虽然它不是一个无限循环.