大厂Redis重试战略剖析-深化摸索行业通常 (大厂redis面试题)
受网络和运转环境影响,运行程序或许遇到临时性缺点,如刹时网络颤抖、服务临时无法用、服务忙碌造成超时等。
智能重试机制可大幅防止此类缺点,保证操作成功口头。
1引发临时性缺点的要素 1.1缺点触发了高可用机制
云支持节点肥壮形态监测,当监测到实例中的主节点无法用时,会智能触发主备切换,例如将主节点和从节点启动调换,保证实例的高可用性。此时,客户端或许会遇到下列临时性缺点:秒级的衔接闪断。30秒内的只读形态(用于防止主备切换惹起潜在的数据失落危险和双写)。
更多参见:主备切换()
1.2慢查问惹起了恳求梗塞
口头期间复杂度为O(N)的操作,引发慢查问和恳求的梗塞,此时,客户端动员的其余恳求或许出现临时性失败。
1.3复杂的网络环境
由于客户端与Redis主机之间复杂网络环境惹起,或许出现偶发的网络颤抖、数据重传等疑问,此时,客户端动员的恳求或许会出现临时性失败。
2介绍的重试准绳 2.1仅重试幂等的操作
由于超时或许出当初下述任一阶段:该命令由客户端发送成功,但尚未抵达Redis。命令抵达Redis,但口头超时。命令在Redis中口头完结,但结果前往给客户端时出现超时。假设口头重试或许造成某个操作在Redis中被重复口头,因此不是一切操作均适宜设计重试机制。通常介绍仅重试幂等的操作,例如SET操作,即屡次口头SETab命令,那么a的值只或许是b或口头失败;假设口头LPUSHmylista则不是幂等的,或许造成mylist中蕴含多个a元素。
2.2适当的重试次数与距离
依据业务需求和实践场景调整适当的重试次数与距离,否则或许引发下述疑问:假设重试次数无余或距离太长,运行程序或许无法成功操作而造成失败。假设重试次数过大或距离过短,运行程序或许会占用过多的系统资源,且或许因恳求过多而梗塞在主机上无法复原。经常出现的重试距离形式包括立刻重试、固定期间重试、指数参与期间重试、随机期间重试等。
2.3防止重试嵌套
防止重试嵌套,否则或许会造成重复的重试且无法中止。
2.4记载重试意外并打印失败报告
在重试环节中,倡导在WARN级别上打印重试失误日志,同时,仅在重试失败时打印意外信息。
倡导经常使用Jedis4.0.0及以上版本,介绍经常使用最新的Jedis版本,以下代码为Jedis5.0.0的重试示例。
![大厂redis面试题](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
3.1参与Jedis的Pom依赖<dependency>
<groupId>redis.clients</groupId>
3.2重试实战①规范架构实例或集群架构代理(Proxy)形式
经常使用JedisPool形式。
该示例会将SET命令智能重试5次,且总重试期间不超越10s,每次重试之间期待类指数距离的期间,假设最终不成功,则抛出意外。
PooledConnectionProviderprovider=newPooledConnectionProvider(HostAndPort.from("127.0.0.1:6379"));
intmaxAttempts=5;//最大重试次数
DurationmaxTotalRetriesDuration=Duration.ofSeconds(10);//最大的重试期间
UnifiedJedisjedis=newUnifiedJedis(provider,maxAttempts,maxTotalRetriesDuration);
System.out.println("setkey:"+jedis.set("key","value"));
}catch(Exceptione){
//示意尝试maxAttempts次或抵达了最大查问期间maxTotalRetriesDuration依旧没有访问成功。
e.printStackTrace;
②集群架构直连形式
经常使用JedisCluster形式。
可以经过性能maxAttempts参数来定义失败状况下的重试次数,自动值为5,假设最终不成功,则抛出意外。
HostAndPorthostAndPort=HostAndPort.from("127.0.0.1:30001");
intconnectionTimeout=5000;
intsoTimeout=2000;
intmaxAttempts=5;
ConnectionPoolConfigconfig=newConnectionPoolConfig;
JedisClusterjedisCluster=newJedisCluster(hostAndPort,connectionTimeout,soTimeout,maxAttempts,config);
System.out.println("setkey:"+jedisCluster.set("key","value"));
}catch(Exceptione){
//示意尝试maxAttempts之后依旧没有访问成功。
e.printStackTrace;
Redisson客户端提供了两个参数来控制重试逻辑:
重试示例如下:
Configconfig=newConfig;
config.useSingleServer
.setTimeout(1000)
.setRetryAttempts(3)
.setRetryInterval(1500)//ms
.setAddress("redis://127.0.0.1:6379");
RedissonClientconnect=Redisson.create(config);
5StackExchange.Redis
StackExchang.Redis客户端目前仅支稳健试时衔接,重试示例如下:
varconn=ConnectionMultiplexer.Connect("redis0:6380,redis1:6380,connectRetry=3");
说明
如需成功API级别的重试战略,请参见Polly。
Lettuce客户端未提供在命令超时后重试的参数,然而您可以经过下述参数来成功命令重试战略:
说明
重试示例:
clientOptions.isAutoReconnect?Reliability.AT_LEAST_ONCE:Reliability.AT_MOST_ONCE;
参考:
为什么大学课程不开设php?
你可以不会PHP,但你必须会ASP。 再有就是教师水平,老师每天教学工作很忙,还要写论文,评职称,很难挤出时间去学习新知识,尤其今天流行PHP,明天可能就是别的了,教和学还不一样,必须对语言有深刻了解,教学成本偏高。 第三就是PHP还没有达到Java那种主流地位,就像现在各大学,书店为什么铺天盖地学Java呢,同样是一种惯性,也正因为这种惯性,造成了国内软件市场的单一,对新技术接受能力低下。 现在国外已经开始逐渐向云计算语言转型了,我们却仍在跨平台阶段摸索。 大量轻量级语言涌现,国内对此还知之甚少。 所以说,因为市场需要主流的东西,所以学校必须迎合这个趋势,本来就很落后的大学教育,再不讲点有实际意义的,那就没什么盼头了。 PHP只是很容易上手,并不是简单,一个星期只能说弄明白PHP是怎么回事,还得有C语言之类的基础,否则半年之内很难写出什么像样的东西。
wcf怎么和redis缓存结合
Redis是一个不错的缓存数据库,读取数据速度效率都很不错。 今天大家共同研究下redis的用法。 结合网上的资料和自己的摸索,先来看下安装与配置把。 咱们主要看在WINDOWS上怎样使用REDIS数据库。 下载地址:1. 选择一个版本进行下载,我们这里使用Redis-2.1.5 - Win32版本的。 下载解压后的文件如下图:2. 在D建立一个redis 文件夹(当然建在其他盘也可以),然后把上面解压的32bit文件夹下面的所有文件拷贝到redis文件夹里面。 3.打开服务器端 通过CMD命令行打开服务器端,首先通过命令行转到d:\redis文件夹,然后输入如下命令 4.打开客户端 服务器端的CMD命令行不要关闭,再单独打开一个CMD命令行,切换到d:\redis文件夹,输入如下命令 -h 127.0.0.1 -p 6379 然后输入 set pwd get pwd获取返回值成功,说明服务器端配置成功,中怎样使用Redis存储数据. 在中比较常用的客户端类库是ServiceStack,看下通过servicestack怎样存储数据。 DLL下载:,下载完成后,DLL中包括四个DLL文件,然后把这四个文件添加到自己的项目中。 6.示例代码 Redis中包括四种数据类型,Strings, Lists,Sets, Sorted Sets接下来我们一一看这四种类型的用法。 [csharp] view plaincopyprivate void Redis(){RedisClient client = new RedisClient(127.0.0.1, 6379);(username, 郭靖);(pwd, );string username = (username);int pwd = (pwd);(读取缓存, + 姓名: + username + ,密码: + pwd + );}private void RedisForManyServer(){using (var manager = new PooledRedisClientManager(127.0.0.1, 192.1680.30.90)){IRedisClient iclient = ();UserInfo user = new UserInfo(); = 杨过; = 18;(user, user);UserInfo user2 = (user); (读取分布式缓存集群, + 姓名: + + ,年龄: + + ); } }
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。