add others

pull/1/head
wanglei 2020-07-30 22:33:20 +08:00
parent 8659c6cac2
commit e5e49aa2a0
5 changed files with 790 additions and 0 deletions

View File

@ -0,0 +1,424 @@
Turing奖最早设立于1966年是美国计算机协会在计算机技术方面所授予的最高奖项被喻为计算机界的诺贝尔奖。它是以英国数学天才Alan Turing先生的名字命名的Alan Turing先生对早期计算的理论和实践做出了突出的贡献。图灵奖主要授予在计算机技术领域做出突出贡献的个人而这些贡献必须对计算机科学与技术有长远而重要的影响。1966年A. J. Perlis因其在新一代编程技术和编译架构方面的贡献成为图灵奖的第一个得主。
每年美国计算机协会将要求提名人推荐本年度的图灵奖候选人并附加一份200到500字的文章说明被提名者为什么应获此奖。任何人都可成为提名人美国计算机协会将组成评选委员会对被提名者进行严格的审核并最终确定当年的获奖者。
<table class="wikitable">
<tr>
<th width="15%">年份</th>
<th width="35%">姓名</th>
<th width="50%">贡献领域</th>
</tr>
<tr>
<td>1966年</td>
<td><a href="/wiki/%E8%89%BE%E4%BC%A6%C2%B7%E4%BD%A9%E5%88%A9" title="艾伦·佩利">艾伦·佩利</a></td>
<td>高级<a href="/wiki/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1" title="程序设计">程序设计</a>技巧,<a href="/wiki/%E7%BC%96%E8%AF%91%E5%99%A8" class="mw-redirect" title="编译器">编译器</a>构造</td>
</tr>
<tr>
<td>1967年</td>
<td><a href="/wiki/%E8%8E%AB%E9%87%8C%E6%96%AF%C2%B7%E5%A8%81%E5%B0%94%E5%85%8B%E6%96%AF" title="莫里斯·威尔克斯">莫里斯·威尔克斯</a></td>
<td>存储过程式计算机<a href="/wiki/EDSAC" class="mw-redirect" title="EDSAC">EDSAC</a><a href="/wiki/EDSAC_2" title="EDSAC 2">EDSAC 2</a>,程序<a href="/wiki/%E5%BA%93" class="mw-disambig" title="库"></a></td>
</tr>
<tr>
<td>1968年</td>
<td><a href="/wiki/%E7%90%86%E6%9F%A5%E5%BE%B7%C2%B7%E8%A1%9B%E6%96%AF%E9%87%8C%C2%B7%E6%BC%A2%E6%98%8E" title="理查德·卫斯里·汉明">理查德·卫斯里·汉明</a></td>
<td>数值方法,自动编码系统,错误检测和纠错码</td>
</tr>
<tr>
<td>1969年</td>
<td><a href="/wiki/%E9%A9%AC%E6%96%87%C2%B7%E9%97%B5%E6%96%AF%E5%9F%BA" title="马文·闵斯基">马文·闵斯基</a></td>
<td><a href="/wiki/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD" title="人工智能">人工智能</a></td>
</tr>
<tr>
<td>1970年</td>
<td><a href="/wiki/%E8%A9%B9%E5%A7%86%E6%96%AF%C2%B7%E7%BB%B4%E5%B0%94%E9%87%91%E6%A3%AE" class="mw-redirect" title="詹姆斯·维尔金森">詹姆斯·维尔金森</a></td>
<td>数值分析,线性代数,倒退错误分析</td>
</tr>
<tr>
<td>1971年</td>
<td><a href="/wiki/%E7%BA%A6%E7%BF%B0%C2%B7%E9%BA%A6%E5%8D%A1%E9%94%A1" title="约翰·麦卡锡">约翰·麦卡锡</a></td>
<td>人工智能</td>
</tr>
<tr>
<td>1972年</td>
<td><a href="/wiki/%E8%89%BE%E5%85%B9%E6%A0%BC%C2%B7%E8%BF%AA%E7%A7%91%E6%96%AF%E5%BD%BB" class="mw-redirect" title="艾兹格·迪科斯彻">艾兹格·迪科斯彻</a></td>
<td><a href="/wiki/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%AF%AD%E8%A8%80" class="mw-redirect" title="程序设计语言">程序设计语言</a>的科学与艺术</td>
</tr>
<tr>
<td>1973年</td>
<td><a href="/wiki/%E6%9F%A5%E7%90%86%E5%A3%AB%C2%B7%E5%B7%B4%E8%B5%AB%E6%9B%BC" class="mw-redirect" title="查理士·巴赫曼">查理士·巴赫曼</a></td>
<td>数据库技术</td>
</tr>
<tr>
<td>1974年</td>
<td><a href="/wiki/%E9%AB%98%E5%BE%B7%E7%BA%B3" title="高德纳">高德纳</a></td>
<td>算法分析、程序设计语言的设计、程序设计</td>
</tr>
<tr>
<td rowspan="2">1975年</td>
<td><a href="/wiki/%E8%89%BE%E4%BC%A6%C2%B7%E7%BA%BD%E5%8E%84%E5%B0%94" title="艾伦·纽厄尔">艾伦·纽厄尔</a></td>
<td rowspan="2">人工智能人类认知心理学和列表处理list processing</td>
</tr>
<tr>
<td><a href="/wiki/%E8%B5%AB%E4%BC%AF%E7%89%B9%C2%B7%E8%A5%BF%E8%92%99" class="mw-redirect" title="赫伯特·西蒙">赫伯特·西蒙</a></td>
</tr>
<tr>
<td rowspan="2">1976年</td>
<td><a href="/wiki/%E8%BF%88%E5%85%8B%E5%B0%94%C2%B7%E6%8B%89%E5%AE%BE" title="迈克尔·拉宾">迈克尔·拉宾</a></td>
<td rowspan="2">非确定性自动机</td>
</tr>
<tr>
<td><a href="/wiki/%E8%BE%BE%E7%BA%B3%C2%B7%E6%96%AF%E7%A7%91%E7%89%B9" title="达纳·斯科特">达纳·斯科特</a></td>
</tr>
<tr>
<td>1977年</td>
<td><a href="/wiki/%E7%BA%A6%E7%BF%B0%C2%B7%E5%B7%B4%E5%85%8B%E6%96%AF" class="mw-redirect" title="约翰·巴克斯">约翰·巴克斯</a></td>
<td>高级编程系统,程序设计语言规范的形式化定义</td>
</tr>
<tr>
<td>1978年</td>
<td><a href="/wiki/%E7%BD%97%E4%BC%AF%E7%89%B9%C2%B7%E5%BC%97%E6%B4%9B%E4%BC%8A%E5%BE%B7" title="罗伯特·弗洛伊德">罗伯特·弗洛伊德</a></td>
<td>设计高效可靠软件的方法学</td>
</tr>
<tr>
<td>1979年</td>
<td><a href="/wiki/%E8%82%AF%E5%B0%BC%E6%96%AF%C2%B7%E8%89%BE%E4%BD%9B%E6%A3%AE" title="肯尼斯·艾佛森">肯尼斯·艾佛森</a></td>
<td>程序设计语言和数学符号互动系统的设计运用APL进行教学程序设计语言的理论与实践</td>
</tr>
<tr>
<td>1980年</td>
<td><a href="/wiki/%E6%9D%B1%E5%B0%BC%C2%B7%E9%9C%8D%E7%88%BE" title="东尼·霍尔">东尼·霍尔</a></td>
<td>程序设计语言的定义与设计</td>
</tr>
<tr>
<td>1981年</td>
<td><a href="/wiki/%E5%9F%83%E5%BE%B7%E5%8A%A0%C2%B7%E7%A7%91%E5%BE%B7" title="埃德加·科德">埃德加·科德</a></td>
<td>数据库系统,尤其是<a href="/wiki/%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93" class="mw-redirect" title="关系型数据库">关系型数据库</a></td>
</tr>
<tr>
<td>1982年</td>
<td><a href="/wiki/%E5%8F%B2%E6%8F%90%E8%8A%AC%C2%B7%E5%8F%A4%E5%85%8B" title="史提芬·古克">史提芬·古克</a></td>
<td><a href="/wiki/%E8%AE%A1%E7%AE%97%E5%A4%8D%E6%9D%82%E5%BA%A6" class="mw-redirect" title="计算复杂度">计算复杂度</a></td>
</tr>
<tr>
<td rowspan="2">1983年</td>
<td><a href="/wiki/%E8%82%AF%C2%B7%E6%B1%A4%E6%99%AE%E9%80%8A" title="肯·汤普逊">肯·汤普逊</a></td>
<td rowspan="2"><a href="/wiki/Unix" class="mw-redirect" title="Unix">UNIX</a>操作系统和<a href="/wiki/C%E8%AF%AD%E8%A8%80" title="C语言">C语言</a></td>
</tr>
<tr>
<td><a href="/wiki/%E4%B8%B9%E5%B0%BC%E6%96%AF%C2%B7%E9%87%8C%E5%A5%87" title="丹尼斯·里奇">丹尼斯·里奇</a></td>
</tr>
<tr>
<td>1984年</td>
<td><a href="/wiki/%E5%B0%BC%E5%85%8B%E5%8A%B3%E6%96%AF%C2%B7%E7%BB%B4%E5%B0%94%E7%89%B9" title="尼克劳斯·维尔特">尼克劳斯·维尔特</a></td>
<td>程序设计语言设计、程序设计</td>
</tr>
<tr>
<td>1985年</td>
<td><a href="/wiki/%E7%90%86%E6%9F%A5%E5%BE%B7%C2%B7%E5%8D%A1%E6%99%AE" title="理查德·卡普">理查德·卡普</a></td>
<td>算法理论,尤其是<a href="/wiki/NP-%E5%AE%8C%E5%85%A8" class="mw-redirect" title="NP-完全">NP-完全性</a>理论</td>
</tr>
<tr>
<td rowspan="2">1986年</td>
<td><a href="/wiki/%E7%B4%84%E7%BF%B0%C2%B7%E9%9C%8D%E6%99%AE%E5%85%8B%E6%B4%9B%E5%A4%AB%E7%89%B9" title="约翰·霍普克洛夫特">约翰·霍普克洛夫特</a></td>
<td rowspan="2">算法和数据结构的设计与分析</td>
</tr>
<tr>
<td><a href="/wiki/%E7%BD%97%E4%BC%AF%E7%89%B9%C2%B7%E5%A1%94%E6%89%AC" class="mw-redirect" title="罗伯特·塔扬">罗伯特·塔扬</a></td>
</tr>
<tr>
<td>1987年</td>
<td><a href="/wiki/%E7%BA%A6%E7%BF%B0%C2%B7%E7%A7%91%E5%85%8B" class="mw-redirect" title="约翰·科克">约翰·科克</a></td>
<td>编译理论,大型系统的体系结构,及精简指令集(<a href="/wiki/%E7%B2%BE%E7%AE%80%E6%8C%87%E4%BB%A4%E9%9B%86" title="精简指令集">RISC</a>)计算机的开发</td>
</tr>
<tr>
<td>1988年</td>
<td><a href="/wiki/%E4%BC%8A%E5%87%A1%C2%B7%E8%8B%8F%E6%B3%BD%E5%85%B0" class="mw-redirect" title="伊凡·苏泽兰">伊凡·苏泽兰</a></td>
<td><a href="/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9B%BE%E5%BD%A2%E5%AD%A6" title="计算机图形学">计算机图形学</a></td>
</tr>
<tr>
<td>1989年</td>
<td><a href="/wiki/%E5%A8%81%E5%BB%89%C2%B7%E5%8D%A1%E9%9F%93" title="威廉·卡韩">威廉·卡韩</a></td>
<td><a href="/wiki/%E6%95%B0%E5%80%BC%E5%88%86%E6%9E%90" title="数值分析">数值分析</a></td>
</tr>
<tr>
<td>1990年</td>
<td><a href="/wiki/%E8%B4%B9%E5%B0%94%E5%8D%97%E5%A4%9A%C2%B7%E8%80%83%E5%B7%B4%E6%89%98" class="mw-redirect" title="费尔南多·考巴托">费尔南多·考巴托</a></td>
<td><a href="/wiki/CTSS" class="mw-redirect" title="CTSS">CTSS</a><a href="/wiki/Multics" title="Multics">Multics</a></td>
</tr>
<tr>
<td>1991年</td>
<td><a href="/wiki/%E7%BD%97%E5%AE%BE%C2%B7%E7%B1%B3%E5%B0%94%E7%BA%B3" title="罗宾·米尔纳">罗宾·米尔纳</a></td>
<td><a href="/w/index.php?title=LCF%E5%AE%9A%E7%90%86%E8%AF%81%E6%98%8E&amp;action=edit&amp;redlink=1" class="new" title="LCF定理证明页面不存在">LCF</a><a href="/wiki/ML%E8%AA%9E%E8%A8%80" class="mw-redirect" title="ML语言">ML语言</a><a href="/w/index.php?title=%E9%80%9A%E4%BF%A1%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%AE%A1%E7%AE%97&amp;action=edit&amp;redlink=1" class="new" title="通信系统的计算(页面不存在)">CCS</a></td>
</tr>
<tr>
<td>1992年</td>
<td><a href="/wiki/%E5%B7%B4%E7%89%B9%E5%8B%92%C2%B7%E8%98%AD%E6%99%AE%E6%A3%AE" title="巴特勒·兰普森">巴特勒·兰普森</a></td>
<td>分布式,个人计算环境</td>
</tr>
<tr>
<td rowspan="2">1993年</td>
<td><a href="/wiki/%E5%B0%A4%E9%87%8C%E6%96%AF%C2%B7%E5%93%88%E7%89%B9%E9%A9%AC%E5%B0%BC%E6%96%AF" title="尤里斯·哈特马尼斯">尤里斯·哈特马尼斯</a></td>
<td rowspan="2">计算复杂度理论</td>
</tr>
<tr>
<td><a href="/wiki/%E7%90%86%E6%9F%A5%E5%BE%B7%C2%B7%E6%96%AF%E7%89%B9%E6%81%A9%E6%96%AF" title="理查德·斯特恩斯">理查德·斯特恩斯</a></td>
</tr>
<tr>
<td rowspan="2">1994年</td>
<td><a href="/wiki/%E7%88%B1%E5%BE%B7%E5%8D%8E%C2%B7%E8%B4%B9%E6%A0%B9%E9%B2%8D%E5%A7%86" class="mw-redirect" title="爱德华·费根鲍姆">爱德华·费根鲍姆</a></td>
<td rowspan="2">大规模人工智能系统</td>
</tr>
<tr>
<td><a href="/wiki/%E6%8B%89%E5%90%89%C2%B7%E7%91%9E%E8%BF%AA" title="拉吉·瑞迪">拉吉·瑞迪</a></td>
</tr>
<tr>
<td>1995年</td>
<td><a href="/wiki/%E6%9B%BC%E7%BA%BD%E5%B0%94%C2%B7%E5%B8%83%E5%8D%A2%E5%A7%86" title="曼纽尔·布卢姆">曼纽尔·布卢姆</a></td>
<td>计算复杂度理论,及其在<a href="/wiki/%E5%AF%86%E7%A0%81%E5%AD%A6" title="密码学">密码学</a>和程序校验上的应用</td>
</tr>
<tr>
<td>1996年</td>
<td><a href="/wiki/%E9%98%BF%E7%B1%B3%E5%B0%94%C2%B7%E4%BC%AF%E5%8A%AA%E5%88%A9" title="阿米尔·伯努利">阿米尔·伯努利</a></td>
<td><a href="/wiki/%E6%97%B6%E5%BA%8F%E9%80%BB%E8%BE%91" class="mw-redirect" title="时序逻辑">时序逻辑</a>,程序与系统<a href="/wiki/%E9%A9%97%E8%AD%89" title="验证">验证</a></td>
</tr>
<tr>
<td>1997年</td>
<td><a href="/wiki/%E9%81%93%E6%A0%BC%E6%8B%89%E6%96%AF%C2%B7%E6%81%A9%E6%A0%BC%E5%B0%94%E5%B7%B4%E7%89%B9" title="道格拉斯·恩格尔巴特">道格拉斯·恩格尔巴特</a></td>
<td>互动计算</td>
</tr>
<tr>
<td>1998年</td>
<td><a href="/wiki/%E8%A9%B9%E5%A7%86%E6%96%AF%C2%B7%E5%B0%BC%E5%8F%A4%E6%8B%89%C2%B7%E6%A0%BC%E9%9B%B7" title="詹姆斯·尼古拉·格雷">詹姆斯·尼古拉·格雷</a></td>
<td>数据库与事务处理</td>
</tr>
<tr>
<td>1999年</td>
<td><a href="/wiki/%E5%BC%97%E9%9B%B7%E5%BE%B7%E9%87%8C%E5%85%8B%C2%B7%E5%B8%83%E9%B2%81%E5%85%8B%E6%96%AF" class="mw-redirect" title="弗雷德里克·布鲁克斯">弗雷德里克·布鲁克斯</a></td>
<td><a href="/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84" class="mw-redirect" title="计算机体系结构">计算机体系结构</a><a href="/wiki/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F" title="操作系统">操作系统</a><a href="/wiki/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B" title="软件工程">软件工程</a></td>
</tr>
<tr>
<td>2000年</td>
<td><a href="/wiki/%E5%A7%9A%E6%9C%9F%E6%99%BA" title="姚期智">姚期智</a><sup id="cite_ref-4" class="reference"><a href="#cite_note-4">[4]</a></sup></td>
<td>计算理论,包括<a href="/wiki/%E4%BC%AA%E9%9A%8F%E6%9C%BA%E6%95%B0" class="mw-redirect" title="伪随机数">伪随机数</a>生成,密码学与通信复杂度</td>
</tr>
<tr>
<td rowspan="2">2001年</td>
<td><a href="/wiki/%E5%A5%A5%E5%88%A9-%E7%BA%A6%E7%BF%B0%C2%B7%E8%BE%BE%E5%B0%94" class="mw-redirect" title="奥利-约翰·达尔">奥利-约翰·达尔</a></td>
<td rowspan="2"><a href="/wiki/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%BC%96%E7%A8%8B" class="mw-redirect" title="面向对象编程">面向对象编程</a></td>
</tr>
<tr>
<td><a href="/wiki/%E5%85%8B%E5%88%A9%E6%96%AF%E7%99%BB%C2%B7%E5%A5%88%E5%8A%A0%E7%89%B9" title="克利斯登·奈加特">克利斯登·奈加特</a></td>
</tr>
<tr>
<td rowspan="3">2002年</td>
<td><a href="/wiki/%E7%BD%97%E7%BA%B3%E5%BE%B7%C2%B7%E6%9D%8E%E7%BB%B4%E6%96%AF%E7%89%B9" title="罗纳德·李维斯特">罗纳德·李维斯特</a></td>
<td rowspan="3"><a href="/wiki/%E5%85%AC%E9%92%A5%E5%AF%86%E7%A0%81%E5%AD%A6" class="mw-redirect" title="公钥密码学">公钥密码学</a><a href="/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95" title="RSA加密算法">RSA加密算法</a></td>
</tr>
<tr>
<td><a href="/wiki/%E9%98%BF%E8%BF%AA%C2%B7%E8%90%A8%E8%8E%AB%E5%B0%94" title="阿迪·萨莫尔">阿迪·萨莫尔</a></td>
</tr>
<tr>
<td><a href="/wiki/%E4%BC%A6%E7%BA%B3%E5%BE%B7%C2%B7%E9%98%BF%E5%BE%B7%E6%9B%BC" title="伦纳德·阿德曼">伦纳德·阿德曼</a></td>
</tr>
<tr>
<td>2003年</td>
<td><a href="/wiki/%E8%89%BE%E4%BC%A6%C2%B7%E5%87%AF" title="艾伦·凯">艾伦·凯</a></td>
<td><a href="/wiki/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%BC%96%E7%A8%8B" class="mw-redirect" title="面向对象编程">面向对象编程</a></td>
</tr>
<tr>
<td rowspan="2">2004年</td>
<td><a href="/wiki/%E6%96%87%E7%89%B9%C2%B7%E7%91%9F%E5%A4%AB" class="mw-redirect" title="文特·瑟夫">文特·瑟夫</a></td>
<td rowspan="2"><a href="/wiki/TCP/IP" class="mw-redirect" title="TCP/IP">TCP/IP</a>协议</td>
</tr>
<tr>
<td><a href="/wiki/%E7%BD%97%E4%BC%AF%E7%89%B9%C2%B7%E5%8D%A1%E6%81%A9" title="罗伯特·卡恩">罗伯特·卡恩</a></td>
</tr>
<tr>
<td>2005年</td>
<td><a href="/wiki/%E5%BD%BC%E5%BE%97%C2%B7%E8%AF%BA%E5%B0%94" class="mw-redirect" title="彼得·诺尔">彼得·诺尔</a></td>
<td><a href="/wiki/Algol_60" class="mw-redirect" title="Algol 60">Algol 60</a>语言</td>
</tr>
<tr>
<td>2006年</td>
<td><a href="/wiki/%E6%B3%95%E8%98%AD%C2%B7%E8%89%BE%E5%80%AB" class="mw-redirect" title="法兰·艾伦">法兰西斯·艾伦</a></td>
<td>优化编译器</td>
</tr>
<tr>
<td rowspan="3">2007年<br />
<sup id="cite_ref-5" class="reference"><a href="#cite_note-5">[5]</a></sup></td>
<td><a href="/wiki/%E7%88%B1%E5%BE%B7%E8%92%99%C2%B7%E5%85%8B%E6%8B%89%E5%85%8B" title="爱德蒙·克拉克">爱德蒙·克拉克</a></td>
<td rowspan="3">开发自动化方法检测计算机硬件和软件中的设计错误</td>
</tr>
<tr>
<td><a href="/wiki/%E8%89%BE%E4%BC%A6%C2%B7%E7%88%B1%E9%BB%98%E7%94%9F" title="艾伦·爱默生">艾伦·爱默生</a></td>
</tr>
<tr>
<td><a href="/wiki/%E7%BA%A6%E7%91%9F%E5%A4%AB%C2%B7%E6%96%AF%E5%8F%91%E5%9F%BA%E6%96%AF" title="约瑟夫·斯发基斯">约瑟夫·斯发基斯</a></td>
</tr>
<tr>
<td>2008年</td>
<td><a href="/wiki/%E8%8A%AD%E8%8A%AD%E6%8B%89%C2%B7%E5%88%A9%E6%96%AF%E7%A7%91%E5%A4%AB" title="芭芭拉·利斯科夫">芭芭拉·利斯科夫</a></td>
<td>编程语言和系统设计的实践与理论</td>
</tr>
<tr>
<td>2009年</td>
<td><a href="/wiki/%E6%9F%A5%E5%B0%94%E6%96%AF%C2%B7%E8%90%A8%E5%85%8B%E5%B0%94" title="查尔斯·萨克尔">查尔斯·萨克尔</a></td>
<td>帮助设计、制造第一款现代PC</td>
</tr>
<tr>
<td>2010年</td>
<td><a href="/wiki/%E8%8E%B1%E6%96%AF%E5%88%A9%C2%B7%E7%93%A6%E4%BC%A6%E7%89%B9" class="mw-redirect" title="莱斯利·瓦伦特">莱斯利·瓦伦特</a></td>
<td>对众多<a href="/wiki/%E8%AE%A1%E7%AE%97%E7%90%86%E8%AE%BA" title="计算理论">计算理论</a>所做的变革性的贡献</td>
</tr>
<tr>
<td>2011年</td>
<td><a href="/wiki/%E6%9C%B1%E8%BF%AA%E4%BA%9A%C2%B7%E7%8F%80%E5%B0%94" title="朱迪亚·珀尔">朱迪亚·珀尔</a></td>
<td>通过<a href="/wiki/%E6%A6%82%E7%8E%87%E8%AE%BA" title="概率论">概率论</a><span class="ilh-all" data-orig-title="因果推理" data-lang-code="en" data-lang-name="英语" data-foreign-title="Causal reasoning"><span class="ilh-page"><a href="/w/index.php?title=%E5%9B%A0%E6%9E%9C%E6%8E%A8%E7%90%86&amp;action=edit&amp;redlink=1" class="new" title="因果推理(页面不存在)">因果推理</a></span><span class="noprint ilh-comment"><span class="ilh-lang">英语</span><span class="ilh-colon"></span><span class="ilh-link"><a href="https://en.wikipedia.org/wiki/Causal_reasoning" class="extiw" title="en:Causal reasoning"><span lang="en" dir="auto">Causal reasoning</span></a></span></span></span><a href="/wiki/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD" title="人工智能">人工智能</a>领域作出的根本性贡献</td>
</tr>
<tr>
<td rowspan="2">2012年</td>
<td><a href="/wiki/%E8%8E%8E%E8%8F%B2%C2%B7%E6%88%88%E5%BE%B7%E7%93%A6%E5%A1%9E%E5%B0%94" title="莎菲·戈德瓦塞尔">莎菲·戈德瓦塞尔</a></td>
<td rowspan="2">在密码科学领域里,于复杂理论的基础之上,做出变革性工作;并领先发展出新的具有数学可证明性的有效验证机制<sup id="cite_ref-6" class="reference"><a href="#cite_note-6">[6]</a></sup></td>
</tr>
<tr>
<td><a href="/wiki/%E5%B8%8C%E7%88%BE%E7%B6%AD%E5%A5%A7%C2%B7%E7%B1%B3%E5%8D%A1%E5%88%A9" title="希尔维奥·米卡利">希尔维奥·米卡利</a></td>
</tr>
<tr>
<td>2013年</td>
<td><a href="/wiki/%E8%8E%B1%E6%96%AF%E5%88%A9%C2%B7%E5%85%B0%E6%B3%A2%E7%89%B9" title="莱斯利·兰波特">莱斯利·兰波特</a></td>
<td>对于分布式及并形系统的理论与实践具有基础性贡献,尤其是诸如因果逻辑时序(<span lang="en">causality and logical clocks</span>)、安全性与存活度(<span lang="en">safety and liveness</span>)、复制状态机(<span lang="en">replicated state machines</span>)及<span class="ilh-all" data-orig-title="循序一致性" data-lang-code="en" data-lang-name="英语" data-foreign-title="sequential consistency"><span class="ilh-page"><a href="/w/index.php?title=%E5%BE%AA%E5%BA%8F%E4%B8%80%E8%87%B4%E6%80%A7&amp;action=edit&amp;redlink=1" class="new" title="循序一致性(页面不存在)">循序一致性</a></span><span class="noprint ilh-comment"><span class="ilh-lang">英语</span><span class="ilh-colon"></span><span class="ilh-link"><a href="https://en.wikipedia.org/wiki/sequential_consistency" class="extiw" title="en:sequential consistency"><span lang="en" dir="auto">sequential consistency</span></a></span></span></span><span lang="en">sequential consistency</span>)等理论概念的发明<sup id="cite_ref-7" class="reference"><a href="#cite_note-7">[7]</a></sup></td>
</tr>
<tr>
<td>2014年</td>
<td><a href="/wiki/%E8%BF%88%E5%85%8B%E5%B0%94%C2%B7%E6%96%AF%E9%80%9A%E5%B8%83%E9%9B%B7%E5%85%8B" title="迈克尔·斯通布雷克">迈克尔·斯通布雷克</a></td>
<td>对现代数据库的概念和实践作出的根本性贡献</td>
</tr>
<tr>
<td rowspan="2">2015年</td>
<td><a href="/wiki/%E6%83%A0%E7%89%B9%E8%8F%B2%E7%88%BE%E5%BE%B7%C2%B7%E8%BF%AA%E8%8F%B2" title="惠特菲尔德·迪菲">惠特菲尔德·迪菲</a></td>
<td rowspan="2">发明<a href="/wiki/%E8%BF%AA%E8%8F%B2-%E8%B5%AB%E7%88%BE%E6%9B%BC%E5%AF%86%E9%91%B0%E4%BA%A4%E6%8F%9B" title="迪菲-赫尔曼密钥交换">迪菲-赫尔曼密钥交换</a>,对<a href="/wiki/%E5%85%AC%E5%BC%80%E5%AF%86%E9%92%A5%E5%8A%A0%E5%AF%86" title="公开密钥加密">公开密钥加密</a>技术有重大贡献<sup id="cite_ref-8" class="reference"><a href="#cite_note-8">[8]</a></sup></td>
</tr>
<tr>
<td><a href="/wiki/%E9%A6%AC%E4%B8%81%C2%B7%E8%B5%AB%E7%88%BE%E6%9B%BC" title="马丁·赫尔曼">马丁·赫尔曼</a></td>
</tr>
</table>
1966 A. J. Perlis因在新一代编程技术和编译架构方面的贡献而获奖
1967 Maurice V. Wilkes因设计出第一台具有内置存储程序的计算机而获奖
1968 Richard W. Hamming因在计数方法、自动编码系统、检测及纠正错码方面的贡献被授予图灵奖
1969 Marvin Minsky 因对人工智能的贡献被授予图灵奖
1970 J. H. Wilkinson因在利用数值分析方法来促进高速数字计算机的应用方面的研究而获奖
1971 John McCarthy因对人工智能的贡献被授予图灵奖
1972 Edsger W. Dijkstra因在编程语言方面的出众表现而获奖
1973 Charles W. Bachman因在数据库方面的杰出贡献而获奖
1974 Donald E. Knuth因设计和完成TEX(一种创新的具有很高排版质量的文档制作工具)而被授予该奖
1975 Allen Newell和Herbert A.Simon因在人工智能、人类心理识别和列表处理等方面进行的基础研究而获奖
1976 Michael O. Robin和Dana S. Scott因他们的论文"有限自动机与它们的决策问题"中所提出的非确定性机器这一很有价值的概念而获奖
1977 John Backus因对可用的高级编程系统设计有深远和重大的影响而获奖
1978 Robert W. F编程的算法方面的深远影响并开创了包括剖析理论、编程语言的语义、自动程序检验、自动程序合成和算法分析在内的多项计算机子学科而被授予该奖
1979 Kenneth E. Iverson因对程序设计语言理论、互动式系统及APL的贡献被授予该奖
1980 C. Anthony R. Hoare因对程序设计语言的定义和设计所做的贡献而获奖
1981 Edgar F. Codd因在数据库管理系统的理论和实践方面的贡献而获
1982 Steven A. Cook因奠定了NP-Completeness理论的基础而获奖
1983 Ken Thompson和Dennis M. Ritchie因在通用操作系统理论方面的突出贡献, 特别是对UNIX操作系统的推广的贡献而获奖
1984 Niklaus Wirth因开发了EULER, ALGOL-W, MODULA和PASCAL一系列崭新的计算语言而获奖
1985 Richard M. Karp因对算法理论的贡献而获奖
1986 John E. Hopcroft因在算法及数据结构的设计和分析中所取得的决定性成果而获奖
1987 John Cocke因在面向对象的编程语言和相关的编程技巧方面的贡献而获奖
1988 Ivan E. Sutherland因在计算机图形学方面的贡献而获奖
1989 William V.Kahan因在数值分析方面的贡献而获奖
1990 Fernando J.Corbato因在开发大型多功能可实现时间和资源共享的计算系统如CTSS和Multics方面的贡献而获奖
1991 Robin Milner因在可计算的函数逻辑(LCF)、ML和并行理论(CCS)这三个方面的贡献而获奖
1992 Butler Lampson因在个人分布式计算机系统方面的贡献而获奖
1993 Jurlis Hartmanis和Richard E. Stearns因奠定了计算复杂性理论的基础而获奖
1994 Raj Reddy和Edward Feigenbaum因对大型人工智能系统的开拓性研究而获奖
1995 Manuel Blum因奠定了计算复杂性理论的基础和在密码术及程序校验方面的贡献而获奖
1996 Amir Pnueli因在中引入临时逻辑和对程序及系统检验的贡献而获奖
1997 Douglas Engelbart因提出交互计算概念并创造出实现这一概念的重要技术而获奖
1998 James Gray因在数据库和事务处理方面的突出贡献而获奖
1999 Frederick P. Brooks, Jr. 由于在计算机体系架构、操作系统以及软件工程方面所做出的具有里程碑式意义的贡献。《人月神话》的作者
2000 Andrew Chi-Chih Yao(姚期智) 由于在计算理论方面的贡献而获奖,包括伪随机数的生成算法、加密算法和通讯复杂性
2001 Ole-Johan Dahl, Kristen Nygaard 由于面向对象编程始发于他们基础性的构想这些构想集中体现在他们所设计的编程语言SIMULA I 和SIMULA 67中
2002 Ronald L. Rivest, Adi Shamir, Leonard M. Adleman 由于在公共密钥理论和实践方面的基础性工作而获奖
2003 Alan Kay 由于在面向对象语言方面原创性思想领导了Smalltalk的开发团队以及对PC的基础性贡献。至理名言预测未来的最好方法是创造它
2004 Vinton G. Cerf, Robert E. Kahn 由于在互联网方面开创性的工作这包括设计和实现了互联网的基础通讯协议TCP/IP以及在网络方面卓越的领导
2005 Naur Peter 因他在设计Algol 60语言于其定义的清晰性Algol 60成为了许多现代程序设计语言的原型。在语法描述中广泛使用的BNF范式其中的“N”便是来自Peter Naur的名字
2006 Frances E. Allen因其在编译器优化理论和实践方面做出的开创性贡献而获奖。Allen是该奖项创立40年来的第一位女性得主。
2007 Edmund M. ClarkeAllen Emerson和Joseph Sifakis因为“在将模型检查发展为被硬件和软件业中所广泛采纳的高效验证技术上的贡献”而荣获该奖
2008 Barbara Liskov因在计算机软件更加可靠、安全和更具一致性方面的贡献而获奖。她也成为历史上第二位获得图灵奖的女性
2009 Chuck Thacker以表彰他对第一台现代个人计算机——施乐帕克Xerox PARCAlto的先驱性设计以及在局域网包括以太网、多处理器工作站、窥探高速缓存一致性协议和平板PC等方面的杰出成就与贡献。他是以太局域网的发明者之一也是世界是第一台激光打印机发明者之一
2010 Leslie G. Valiant因对众多的计算理论包括PAC学习、枚举复杂性和代数计算和并行与分布式计算所做的变革性的贡献而获奖
2011 Judea Pearl因在人工智能领域的基础性工作获奖他提出的概率和因果性推理演算法彻底改变了人工智能当初基于规则和推理的方向
TURING奖获得者分类(1966--2010)
硬件
Maurice V. Wilkes (1967) ——第一台具有内部存储程序的计算机EDSAC
John Cocke (1987) —— RISC & 编译优化
Vinton Gray Cerf (2004) —— Internet基础通讯协议
Chuck Thacke2009—— 局域网
Frances E. Allen2006—— 编译器优化理论
Edmund M. ClarkeAllen Emerson和Joseph Sifakis2007——模型验证
程序语言设计与实现
Alan J. Perlis (1966) ——ALGOL
John McCarthy (1971) —— LISP
Edsger Wybe Dijkstra (1972) —— ALGOL
John W. Backus (1977) —— FORTRAN
Kenneth Eugene Iverson (1979) ——APL程序语言
Niklaus Wirth (1984) —— PASCAL
John Cocke (1987) ——RISC & 编译优化
Ole-Johan DahlKristen Nygaard (2001) —— Simula语言和面向对象概念 (获奖前30年)
Alan Kay(2003) ——SmallTalk语言和面向对象程序设计
Peter Naur(2005) —— ALGOL60以及编译设计
Barbara Liskov(2008) ——数据抽象与分布式计算
Edmund M. ClarkeAllen Emerson和Joseph Sifakis2007——模型验证
算法
Richard Hamming (1968) —— 汉明码
James Hardy Wilkinson (1970) —— 数值分析
Donald E. Knuth —— art of computer programming
John E. HopcroftRobert Endre. Tarjan (1986) ——数据结构和算法设计
William (Velvel) Morton Kahan (1989) —— 浮点运算IEEE标准主要设计师
Andrew Chi-Chih Yao (姚期智) (2000) ——伪随机数复杂性,密码系统和通讯复杂性
Ronald L. Rivest, Adi Shamir, Leonard M. Adleman(2002) ——公钥密码技术
自动机和可计算性
Dana Stewart Scott (1976) —— 自动机
Michael Oser Rabin (1976) ——自动机
Stephen Arthur Cook (1982) —— NP完全性
Richard Manning Karp (1985) —— 证明一个问题是否是属于NP完全
Juris HartmanisRichard Edwin Stearns (1993) —— 计算复杂性
Manuel Blum (1995) —— 计算复杂性,密码系统和程序检查验证
Leslie G. Valiant2010——计算复杂性
人工智能
Marvin Lee Minsky (1969) —— 神经元网络
John McCarthy (1971) —— LISP
Allen NewellHerbert Simon (1975) —— Logic Theory Machine
Raj ReddyEdward Feigenbaum(1994) ——专家系统
Leslie G. Valiant2010——机器学习
Judea Pearl2011—— 概率和因果性推理演算法
操作系统
Dennis MacAlistair RitchieKen Thompson (1983) —— UNIX
Fernando Jose Corbato (1990) ——分时系统
Frederick P. Brooks(1999) —— IBM System360 操作系统
数据库
Charles W. Bachman (1973) —— 数据库
Edgar Frank Codd (1981) ——关系数据模型
James Gray(1998) —— 数据库和事务处理
图像处理和交互式系统
Ivan Edward Sutherland (1988) ——图像处理CAD
Douglas Engelbart(1998) —— 交互式系统,鼠标发明人
程序语言语义
Dana Stewart Scott (1976) ——自动机
Robert W. Floyd (1978) —— 编程语言语义,自动程序验证
C. Antony R. Hoare (1980) —— Hoare Logic, CSP
Robin Milner (1991) —— LCFMLCCSPI-calculus
Amir Pnueli (1996) —— 时序逻辑和系统验证

View File

@ -0,0 +1,188 @@
## 1.Redis数据结构概览
Redis总共包含有五种数据结构
1.String单个key单个value一个redis字符串中最大有512M。
2. Hash 是一个键值对的集合
3. List 是一个链表结构
4. Set 是一个无序集合,并且无重复
5. Zset(sort set) 是一个有序集合,无重复
## 2.String
value是字符串类型
常用的命令包括
```
set key value设置key、value
setex key seconds value设置key、value有效期seconds秒
setnx key value设置key、value如果key存在则setnx失败返回 0 set key value nx等价
get key获取key的值
getset key value设置key、value并返回value
mset key value key value批量设置key、value
mget key key批量获取key的值
incr keykey对应的value自增如果key对应value不是整数返回错误如果key不存在将value设置为 1
decr key:key对应的value自减
incrby key incrementkey对应的value增加increment
decrby key incrementkey对应的value减少increment
incrbyfloat key incrementkey对应的浮点数value增加increment只有incrbyfloat命令没有decrbyfloat命令可以用incrbyfloat一个负数实现decrbyfloat命令
```
在服务器上测试
```
xxx:7001> set abc 10
-> Redirected to slot [7638] located at 10.38.164.94:7004
OK
xxx:7004> get abc
"10"
xxx:7004> incr abc
(integer) 11
xxx:7004> incrby abc 20
(integer) 31
xxx:7004> object encoding abc
"int"
xxx:7004> set a1 helloworldandredisandjava
OK
xxx:7004> object encoding a1
"embstr"
xxx:7004> set a2 helloworldandredisandjavaandpythonandscalaandcandshell
-> Redirected to slot [11786] located at 10.38.164.94:7002
OK
10.38.164.94:7002> object encoding a2
"raw"
```
String的内部编码方式
int8 个字节的长整型
embstr小于等于 39 个字节的字符串
raw大于 39 个字节的字符串
其中incr命令可用于计数mget、mset命令可以在多条命令时减少网络层传输时间setnx命令可用于分布式锁的一种实现方案保证只有一个客户端能请求成功。
## 3.Hash
即value是Hash的类型value={f1:v1, f2:v2}这种样子。
经常使用的命令
```
HSET key field value 设置hash
HSETNX key field value 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。若域 field 已经存在,该操作无效。如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。设置成功,返回 1 。如果给定域已经存在且没有操作被执行,返回 0 。
HMSET key field value [field value ...] 同时将多个 field-value (域-值)对设置到哈希表 key 中
HGET key field 返回哈希表 key 中给定域 field 的值。
HGETALL key 返回哈希表 key 中,所有的域和值
HKEYS key 返回哈希表 key 中的所有域。
HVALS key 返回哈希表 key 中所有域的值。
HLEN key 返回哈希表 key 中域的数量。
HEXISTS key field 给定域 field 是否存在
HDEL key field [field ...] 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
HINCRBY key field increment 为哈希表 key 中的域 field 的值加上增量 increment
```
在服务器上测试
```
xx:7004> HSET people name zhangsan
(integer) 1
xx:7004> HSET people age 18
(integer) 1
xx:7004> HSET people sex male
(integer) 1
xx:7004> HGET people name
"zhangsan"
xx:7004> HKEYS people
1) "name"
2) "age"
3) "sex"
xx:7004> HVALS people
1) "zhangsan"
2) "18"
3) "male"
xx:7004> HLEN people
(integer) 3
```
hash对象底层存储结构为ziplist压缩列表和hashtable。当对象满足一下两条时hash对象使用ziplist编码。
1.hash对象保存的所有kv对的k与v的字符串长度都小于64Byte。
2.hash对象的kv数量小于512个。
由上面的分析hash类型十分适合对象类数据的存储field就是对象的各个属性而field的值为对象属性的值。
## 4.List
list 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
List常用的命令包括
```
LPUSH key value [value ...] 将一个或多个值 value 插入到列表 key 的表头。
LPUSHX key value 将 value 插入到列表 key 的表头 当 key 不存在时, LPUSHX 命令什么也不做
RPUSH key value [value ...] 将一个或多个值 value 插入到列表 key 的表尾(最右边)。
RPUSHX key value 将值 value 插入到列表 key 的表尾 当 key 不存在时, RPUSHX 命令什么也不做
LPOP key 移除并返回列表 key 的头元素。
RPOP key 移除并返回列表 key 的尾元素。
LLEN key 返回列表 key 的长度。
LRANGE key start stop 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
LINDEX key index 返回列表 key 中,下标为 index 的元素。
LSET key index value 将列表 key 下标为 index 的元素的值设置为 value 。
LINSERT key BEFORE|AFTER pivot value 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
BLPOP key [key ...] timeout 它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素
BRPOP key [key ...] timeout 与BLPOP类似
```
list在内部的编码有两种方式:ziplist与linkedlist。ziplist使用更加紧凑的结构实现多个元素的连续存储在内存方便比linkedlist优秀linkedlist在读写效率方面会比ziplist高。
当元素数量小于512或者所有元素占用的字节数都小于64Byte时会使用ziplist存储。
list的使用场景
1.消息队列使用lpush + rpop就可以。如果是lpush+brpop可以实现阻塞队列。
2.栈使用lpush + lpop就可以。
3. list 结构的数据查询两端附近的数据性能非常好适合一些需要获取最新数据的场景比如取最新的新闻最近的topN等操作。
## 5.Set
set 是string类型的无序集合可以方便进行求交集并集差集等工作。set中的元素是无序的所以增加删除查找的炒作都是O(1)时间复杂度。
```
SADD key member [member ...] 在集合key中插入一个或多个元素。如果key不存在则先创建集合key。
SCARD key 返回集合中的元素个数。
SDIFF key [key ...] 返回多个集合的差集如果某些集合key不存在认为是空集
SDIFFSTORE destination key [key ...] 计算多个集合的差集并存储在 destination 中
SINTER key [key ...] 返回多个集合的交集
SUNION key [key ...] 返回多个集合的并集
SISMEMBER key member 判断member是否存在于集合key中。
SMEMBERS key 返回集合key的所有元素。如果key不存在认为是空集。
SREM key member [member ...] 从集合key中移除一个或多个元素。
```
set 的内部实现是一个 value永远为null的HashMap实际就是通过计算hash的方式来快速排重的这也是set能提供判断一个成员是否在集合内的原因。
使用场景:
1.一个用户关注的所有人。
2.一个用户的所有粉丝。
3.两个用户的共同关注,共同喜好,二度好友等。
## 6.Zset
Zset有序集合和Set一样不能有重复的元素并且可以对元素进行排序。
在 set 的基础上给集合中每个元素关联了一个分数(score),往有序集合中插入数据时会自动根据这个分数排序。
```
zadd key score member [score member …]:添加成员
zcard key计算成员数量
zscore key member计算某个成员的分数
zrank key member计算成员的排名从低到高计算
zrevrank key member计算成员的排名从高到低计算
zrem key member [member …]:删除成员
zincrby key increment member增加成员的分数
zrange key start end [withscores]从低到高排序取指定元素如果带上withscores则同时返回score
zrevrange key start end [withscores]从高到低排序取指定元素如果带上withscores则同时返回score
zrangebyscore key min max [withscores]从低到高排序显示分值在min到max之间的成员包括min和max
zrevrangebyscore key min max [withscores]从高到低排序显示分值在min到max之间的成员包括min和max
zcount key min max统计分值在min到max之间的成员包括min和max个数
```
Zset 内部编码有两种方式 1.ziplist 2.skiplist
当元素数量小于128每个元素都小于64Byte时使用ziplist存储可以节约内存。
使用场景:
1.排行榜。排行榜一般都是唯一id并且需要进行排序。
2.带权重的消息队列

View File

@ -0,0 +1,84 @@
python是搞数据同学的不二选择。因此面对redis集群自然就想到怎么用python去操作redis集群了。
## 1.python的redis模块无法操作redis集群
之前用python里的redis模块操作过redis实例。但redis模块操作的不是redis集群不知道能否实现操作集群的功能。写个简单的代码测试一下先
```
import redis
def redis_node():
node =redis.StrictRedis(host='192.168.222.66',port=6379)
node.set("name_test","admin")
print node.get("name_test")
redis_node()
```
运行代码,不出所料报错了:
```
...
File "/Library/Python/2.7/site-packages/redis/connection.py", line 582, in read_response
raise response
redis.exceptions.ResponseError: MOVED 12285 192.168.222.66:6384
```
## 2.安装redis-py-cluster模块
既然redis模块不能搞集群那咱们再找找别的。通过google爸爸找到了redis-py-cluster咱们试试。
先安装:
```
sudo pip install redis-py-cluster
```
稍等片刻,安装好上面的模块。
## 3.使用redis-py-cluster模块操作redis集群
先上一个简单的代码
```
#!/usr/bin/env python
#coding:utf-8
'''
Created on 2016年7月7日
@author: lei.wang
'''
from rediscluster import StrictRedisCluster
import sys
def redis_cluster():
redis_nodes = [{'host':'192.168.222.66','port':6378},
{'host':'192.168.222.66','port':6380},
{'host':'192.168.222.66','port':6381},
{'host':'192.168.222.66','port':6382},
{'host':'192.168.222.66','port':6383},
{'host':'192.168.222.66','port':6384},
{'host':'192.168.222.66','port':6385}
]
try:
redisconn = StrictRedisCluster(startup_nodes=redis_nodes)
except Exception,e:
print "Connect Error!"
sys.exit(1)
redisconn.set('name','admin')
redisconn.set('age',18)
print "name is: ", redisconn.get('name')
print "age is: ", redisconn.get('age')
redis_cluster()
```
让代码run起来
```
name is: admin
age is: 18
```
OK这就是最简单的操作redis集群的方式
## 4.值得注意的小地方
测试的时候故意将某几个host写错发现照样能连接上redis集群。经过测试发现只要有一个host写正确都能连上redis集群。只有当所有host都不正确时候才会连接失败。具体原因以及影响后续再进行观察了解。

View File

@ -0,0 +1,42 @@
登录到Redis服务器上以后输入info命令在Stats部分会看到如下数据
```
# Stats
total_connections_received:7429663
total_commands_processed:5927397034
instantaneous_ops_per_sec:1
total_net_input_bytes:1206431541918
total_net_output_bytes:1398071851083
instantaneous_input_kbps:0.12
instantaneous_output_kbps:25.19
rejected_connections:0
sync_full:1
sync_partial_ok:0
sync_partial_err:1
expired_keys:25055057
expired_stale_perc:0.00
expired_time_cap_reached_count:162215
evicted_keys:0
keyspace_hits:73592202
keyspace_misses:103528090
...
```
其中
```
keyspace_hits命中的次数
keyspace_misses没有命中的次数
```
所以缓存命中率的计算方法
```
keyspace_hits / (keyspace_hits + keyspace_misses)
```
本例中,缓存命中率为
```
73592202 / (73592202 + 103528090) = 0.41549277707830334
```

View File

@ -0,0 +1,52 @@
## 1.缓存穿透
一个缓存系统正常情况下我们去查询的时候大部分key都是存在的。
如果去请求一个缓存系统中没有的数据,此时系统如果没有经过优化,会将请求继续打到数据库上,但其实数据库上也没有这条数据。上面这种情况就叫缓存穿透。
如果有人要对系统进行攻击拿大量不存在的key去发起请求你的系统将会产生大量的请求直接访问数据库这样数据库的压力太大很有可能直接宕机整个服务直接挂掉。
针对上面这种情况,一般有如下的解决办法。
如果对应的key空数据量级不大且重复访问请求比较多那么我们可以将这么key对应的value全部设为null加入缓存中。这样该key只有第一次请求时候访问数据库后面再出现这个key的请求时候直接返回null不会再去访问数据库。
如果异常的key很多且没有什么重复请求这个时候如果我们将这些key都缓存起来将会浪费大量的内存。这个时候可以在缓存之前先加一层BloomFilter查询的时候先去BloomFilter中判断key是否存在。如果key不存在可以直接返回。如果key存在再去查缓存或者查后端数据库。
## 2.缓存击穿
对于高并发系统如果有大量的请求同时去查询一个key刚好这个key失效如果没有优化大量的请求也会直接打到后端数据库有可能导致宕机这个叫缓存击穿。
业界比较常用的做法是使用mutex。简单地来说就是在缓存失效的时候判断拿出来的值为空不是立即去load db而是先使用缓存工具的某些带成功操作返回值的操作比如Redis的SETNX或者Memcache的ADD去set一个mutex key当操作返回成功时再进行load db的操作并回设缓存否则就重试整个get缓存的方法。
SETNX是「SET if Not eXists」的缩写也就是只有不存在的时候才设置可以利用它来实现锁的效果。
```
public String get(key) {
String value = redis.get(key);
if (value == null) { //代表缓存值过期
//设置3min的超时防止del操作失败的时候下次缓存过期一直不能load db
if (redis.setnx(key_mutex, 1, 3 * 60) == 1) { //代表设置成功
value = db.get(key);
redis.set(key, value, expire_secs);
redis.del(key_mutex);
} else { //这个时候代表同时候的其他线程已经load db并回设到缓存了这时候重试获取缓存值即可
sleep(50);
get(key); //重试
}
} else {
return value;
}
}
```
## 3.缓存雪崩
当缓存系统某一时刻发生大规模的缓存失效的情况比如你的缓存服务宕机了会有大量的请求进来直接打到DB上面。结果就是DB hold不住宕机了这个就叫缓存雪崩。
针对这种情况首先我们需要保证的是缓存服务的高可用性。比如现在redis一般是集群模式不会是点个服务器。另外关键服务部分可能还会使用主从+哨兵备份集群避免redis服务全部挂掉。
使用 ehcache 本地缓存的目的也是考虑在 Redis Cluster 完全不可用的时候ehcache 本地缓存还能够支撑一阵。使用 Hystrix进行限流 & 降级 比如一秒来了5000个请求我们可以设置假设只能有一秒 2000个请求能通过这个组件那么其他剩余的 3000 请求就会走限流逻辑。然后去调用我们自己开发的降级组件(降级),比如设置的一些默认值呀之类的。以此来保护最后的 MySQL 不会被大量的请求给打死。
另外实际中还有一个简单的方案就是使缓存失效的时间分开。比如我们可以在原有的失效时间基础上增加一个随机值比如1-5分钟随机这样每一个缓存的过期时间的重复率就会降低就很难引发集体失效的事件。
## 4.RDB与AOF
RDB是redis database。其工作原理就是在指定时间间隔内将内存中的数据集快照写入磁盘相当于是全量备份所以有点在于数据集小数据备份迁移都比较方便而且恢复起来速度也快。但是缺点也显而易见如果快照的时间间隔比较大那数据丢失也比较多。因为是全量备份当数据量较大的时候耗时也会比较长。
AOF是append only file 是把每一次数据变化都写入到一个aof里面。以日志的形式记录每个操作将Redis执行过的所有指令全部记录下来读操作不记录只许追加文件但不可以修改文件Redis启动时会读取AOF配置文件重构数据。换句话说就是Redis重启就会根据日志内容从头到尾执行一次来完成数据的恢复工作。AOF的有点是数据丢失比较少而且文件可读缺点是文件增长比较快因为记录的是redis的操作日志同时恢复起来速度也会比较慢。