Redis--回顾提要

一、写在前

知识学了就忘!不用就忘!我太健忘!特此记录!用于复习打卡!Redis干就完事了!

二、来辣!

  1. Redis做异步队列:一般list结构做队列,rpush生产消息,lpop消费消息,当lpop没有消息的时候,要适当sleep一会儿;如果不sleep,就用blpop,会阻塞;生产一次消费多次,使用pub/sub主题订阅模式,可以实现1:N的消息队列,缺点:消费者下线的时候,消息会丢。

  2. 延时队列:使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒前的数据轮询处理。

  3. Redis分布式锁:拿setnx来争抢锁,抢到之后再用expire给缩加一个过期时间防止锁忘记释放。如果在setnx之后,expire之前进程意外crash或者重要维护了,咋办:锁永远得不到释放,咋办:set指令有复杂的参数,可以把setnx和expire合成一条指令执行哒。

  4. memched与redis区别:redis支持string,list,set,zset,hash,HyperLogLog,Geo,Pub/Sub。memcached支持简单字符串;redis更快;redis支持持久化。

  5. redis没有使用一致性hash,而是引入哈希槽的概念:redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放哪个槽,集群的每一个节点负责一部分hash槽。

  6. redis集群方案什么情况下会导致整个集群不可用:三个节点的集群,在没有复制模型的情况下,如果B节点挂了,整个集群会因为缺少5501-11000这个范围的槽而不可用。

  7. 为什么这么快:完全基于内存;数据结构简单,对数据操作简单;采用单线程,避免不必要的上下文切换和竞争条件,也不存在多进程和多线程导致的切换而消耗CPU,不存在加锁释放锁操作,也不会死锁;使用I/O复用模型,非阻塞IO;自己构建了VM机制,一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

  8. 场景:计数器;缓存;session缓存;全页缓存(FPC);消息队列(发布订阅);分布式锁(setnx或RedLock);set交集、并集找共同好友;zset可以实现有序,排行榜等功能。

  9. RDB:默认,将内存中的数据以快照方式保存到硬盘,产生dump.rdb文件。优点:只有一个文件,方便持久化;容灾性好,一个文件可以保存到安全的磁盘。性能最大化,fork子进程完成写,主进程继续处理命令,IO最大化,主进程没有任何IO,高性能。缺点:安全性低,如果持久化之间挂了,丢一部分数据。

  10. AOF:append-only file。两种方式同时开启,恢复数据会先用AOF。优点:数据安全,可以配置appendfsync属性,有always,每进行一次命令就记录一次;通过append模式写文件,即时中途宕机,可以通过redis-check-aof工具解决一致性问题;rewrite模式,(文件过大时会对命令进行合并重写),没有rewrite之前,可以删除某些命令,(比如误操作的flushall)。缺点:文件大,恢复慢;数据集大的时候,比rdb启动效率低。

  11. 当做缓存时如何扩容:使用一致性哈希实现动态的扩容缩容。

  12. 当做持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定就不能变。

  13. 过期键的删除策略:1)定时过期:每个设置过期时间的key都要创建一个定时器,到过期时间就会立即清除。立即清除,对内存友好。但会占用大量的cpu资源,影响响应时间和吞吐量。2)惰性过期:当访问的时候,才去判断是否已过期,过期就清除。可最大化节省cpu资源,对内存不友好;但是极端情况下,可能出现大量过期的key未被清理,占用大量内存。3)定期过期:折中方案,每隔一定时间,会扫描一定数量的expires字典中一定数量的key,并清除其中过期的。(expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指redis中存储的所有键。)默认同时使用了惰性过期和定期过期。

  14. expire设置过期时间,persist设置永久有效。

  15. 内存淘汰策略:(用于缓存的内存不足时,怎么处理新写入且需要额外申请空间的数据)。1)noevication,禁止淘汰,写入会报错。2)allkeys-lru:全键空间内,移除最近最少使用的(常用)。3)allkeys-random:随机移除。4)volatile-lru:设置了过期的键空间中,移除最近最少使用的。5)volatile-random:随机移除。6)volatile-ttl:设置了过期的键空间中,优先移除有更早过期时间的key。

  16. 内存优化:合理利用集合类型,小的k/v可以以更紧凑的方式存放,尽可能使用散列表(hashes),散列表使用的内存小。尽可能将数据抽象到一个散列表,比如用户,的名称,密码等所有信息存储到一个散列表。

  17. 事务:事务中的所有命令都会被序列化,就是一次性、顺序性、排他性的执行一个队列中的一系列命令。三个阶段:事务开始MULTI-命令入队-事务执行EXEC。执行过程中,如果服务端收到EXEC、DISCARD、WATCH、MULTI之外的请求,会把请求放入对列中排队。WATCH命令是一个乐观锁,可以为redis事务提供CAS行为。可以监控一个或多个键,一旦其中有一个键被修改、删除,之后的事务不会被执行,监控一直持续到EXEC命令。MULTI用于开启事务,总是返回OK,开启后,可以继续向服务器发送任意多行命令,不会立即执行,被放队列,当EXEC被调用时才执行。EXEC用于执行事务块内的命令,返回所有事务块中命令的返回值,按命令执行的先后顺序排序,当操作被打断,返回空值。DISCARD可以清空事务列表,并放弃执行事务,并且客户端会从事务状态中退出。UNWATCH可以取消watch对所有key的监控。

  18. redis的事务总是支持ACID中的一致性和隔离性,其他不支持。当运行在_AOF_持久化模式下,且appendfsyn选项为always时,事务也具有 耐久性。

  19. 单条命令是原子性执行的,基于Lua脚本,可以保证脚本内命令一次性、顺序执行完成。但是事务不保证原子性,且没有回滚。事务的任意命令执行失败,其余命令也会继续执行。

三、写在后

只是简要知识点概括,看到就能回忆起相关内容为最妙~~直接评论打卡,开整!!!

作者: letscrazy

出处: http://www.cnblogs.com/letscrazy/

关于作者:letscrazy

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(licz163@163.com)咨询.

本文转载于网络 如有侵权请联系删除

相关文章

  • S7-1200的故障诊断(带视频) | 精选留言赠廖老师最新《S7-1200 PLC编程及应用 第4版》

    JZGKCHINA工控技术分享平台复制1.打开在线和诊断视图打开配套资源中的例程“电动机控制”的设备视图,组态一个并不存在的8DI模块,其字节地址为IB8。生成诊断中断组织块OB82,在其中编写将MW20加1的程序。用以太网电缆连接计算机和CPU的以太网接口,将组态信息下载到CPU,下载后切换到RUN模式,ERRORLED闪烁。 双击项目树PLC_1文件夹中的“在线和诊断”,在工作区打开“在线和诊断”视图(见图6-55),自动选中左边浏览窗口的“在线访问”。单击工具栏上的“转至在线”按钮,进入在线模式。工作区右边窗口中的计算机和CPU图形之间出现绿色的连线,表示它们建立起了连接。被激活的项目树或工作区的标题栏的背景色变为表示在线的橙色,其他窗口的标题栏下沿出现橙色的线条。项目树中的项目、PLC、程序块、PLC变量、“本地模块”和“分布式I/O”的右边,都有表示状态的图标(见图6-60)。选中图6-55工作区左边窗口的“诊断状态”,右边窗口显示“模块存在”“出错”和“LED(SF)故障”。如果单击工具栏上的“转至离线”按钮,将进入离线模式,窗口标题栏的橙色、与在线状态有关的图标和文字消失

  • SAP Spartacus UnitDetailsComponent对应的UI插入,是在路由框架里完成的

    如下图所示,真实的DOM操作是由platform-browser.js完成的:parent.insertBefore,这是HTML原生代码:/** *Insertsanativenodebeforeanothernativenodeforagivenparentusing{@linkRenderer3}. *Thisisautilityfunctionthatcanbeusedwhennativenodesweredetermined-itabstractsan *actualrendererbeingused. */ functionnativeInsertBefore(renderer,parent,child,beforeNode){ ngDevMode&&ngDevMode.rendererInsertBefore++; if(isProceduralRenderer(renderer)){ renderer.insertBefore(parent,child,beforeNode); } else{ parent.insertBefore(child,befo

  • 京东自建数据中心项目获得2017年度基础设施设计创新大奖

    9月27日,在北京国家会议中心举办的ICT中国高层论坛的高性能数据中心评选活动中,京东宿迁自建数据中心项目获得了2017年数据中心年度基础设施设计创新奖!今年的ICT中国高层论坛邀请到工信部、电信运营商、华为、大唐电信集团、英特尔、诺基亚贝尔、中国信息通信研究院等高层,从中国城市信息化进程的角度,思考与探索5G、云计算、物联网、大数据、城市信息化等新科技对经济社会以及百姓民生的支撑作用和所产生的潜移默化影响,充分展示ICT领域创新发展成果。工业和信息化部通信发展司黄业晶处长在论坛上特别提到,高性能数据中心作为高可靠的基础保障平台,核心技术的创新及应用尤为重要。同时对数据中心的核心技术与运营能力提出了更高层次的要求。工业和信息化部通信发展司黄业晶处长对数据中心发展提出要求中国数据中心联盟理事长代晓慧女士也谈到:“如何设计、施工、运营和维护高可靠性、高可用性、高服务质量、高能效水平的数据中心,已经越来越受到行业的关注。”中国数据中心联盟理事长代晓慧女士为获奖企业颁奖因此在“2017高性能数据中心发展论坛”上,特别针对数据中心设计、IT设备、能效、运维等多个层面具有核心技术以及创新设计应用的

  • Golang 中 for-loop 和 goroutine 的问题

    00.背景最近在学习MIT的分布式课程6.824的过程中,使用Go实现Raft协议时遇到了一些问题。参见如下代码:fori:=0;i<len(rf.peers);i++{ DPrintf("i=%d",i) ifi==rf.me{ DPrintf("skippingmyself#%d",rf.me) continue } gofunc(){ DPrintf("lenofrf.peers=%d",len(rf.peers)) DPrintf("server#%dsendingrequestvotetoserver%d",rf.me,i) reply:=&RequestVoteReply{} ok:=rf.sendRequestVote(i,args,reply) ifok&&reply.VoteGranted&&reply.Term==rf.currentTerm{ rf.voteCount++ ifrf.voteCount>

  • 腾讯云私有网络修改辅助CIDRapi接口

    1.接口描述接口请求域名:vpc.tencentcloudapi.com。 本接口(ModifyAssistantCidr)用于批量修改辅助CIDR,支持新增和删除。 默认接口请求频率限制:100次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:ModifyAssistantCidr。 Version 是 String 公共参数,本接口取值:2017-03-12。 Region 是 String 公共参数,详见产品支持的地域列表。 VpcId 是 String VPC实例ID。形如:vpc-6v2ht8q5 NewCidrBlocks.N 否 ArrayofString 待添加的辅助CIDR。CIDR数组,格式如["10.0.0.0/16&qu

  • OS第三章错题

    OS第三章错题 ​ 现在看不知道当时为啥做错了…… ​ 这个题要做对,就要分清楚作业和进程不同的状态。作业有收容、运行、完成三种状态。其中在运行时,作业内的若干进程就是我们熟知的进程五状态模型(新建、就绪、运行、阻塞、终止)。所以本题答案就很显而易见了,如果是进程调度,那就调就绪态的进程上处理机,如果是作业调度,那就将收容状态的作业调入主存运行 ​ 概念性题目,响应比就是等待时间与计算时间的比值,也可以是1+等待时间/要求服务时间 ​ 正确答案为B,即操作系统希望作业的平均周转时间短,因为周转时间就是作业从开始等待一直到完成的时间,所以尽可能我们希望这个时间短一些 ​ 概念题,共享变量是指可被多个进程访问的变量 ​ UNIX采用动态优先数的技术。类比来说,在Windows中用户可以通过taskmanger中的设置相关性来更改优先级,不过这个有点马后炮,我还在搜索有关UNIX为什么选用动态优先数策略的资料。 ​ 首先每个进程最多需要3个资源,我们可以为每个进程分配两个资源,而单个进程就还需一个资源即可,这时候再为系统中增加一个可用资源分配给这个进程,当这个进程释放时,就会释

  • easyui时间框只选择年月

    html: <input type="text" id="datetime" >    js: <scripttype="text/javascript">$(function(){$('#date').datebox({onShowPanel:function(){//显示日趋选择对象后再触发弹出月份层的事件,初始化时没有生成月份层span.trigger('click');//触发click事件弹出月份层if(!tds)setTimeout(function(){//延时触发获取月份对象,因为上面的事件触发和对象生成有时间间隔tds=p.find('div.calendar-menu-month-innertd');tds.click(function(e){e.stopPropagation();//禁止冒泡执行easyui给月份绑定的事件varyear=/\d{4}/.exec(span.html())[0]//得到年份,month=parseInt($(this).attr('abbr'),10)+1;

  • MySQL游标

    返回主页 回到顶端 目录 使用游标 一、什么是游标a> 二、使用显式游标   2.1 声明游标   2.2 打开游标   2.3 从游标中取得结果   2.4 关闭游标   2.5 使用BULK COLLECT子句批量绑定数据   2.6 在游标中使用子查询 三、游标属性   3.1 显式游标属性     使用游标 在PL/SQL中可以使用游标处理数据。 通过使用游标可以大大提高PL/SQL程序对数据处理的能力。 在Oracle 9i及其以后的版本中,还增加了使用BULK COLLECT子句批量绑定数据和使用CURSOR表达式实现嵌套游标的功能。 这里将主要介绍如何使用显式游标进行多行数据的查询、游标FOR循环以及游标变量的使用,另外还将介绍游标属性以及嵌套游标的使用等内容。 重点: ❑游标的概念  ❑显式游标

  • 用Fiddler限制手机平板的网络速度

    1.首先在电脑上下载fiddler安装; 2.Fiddler设置①.fiddler>Tools>FiddlerOptions>Connections勾选Allowremotecomputerstoconnect。②.记住这里的端口号:8888,后面会用到。 ③打开Rules->CustomizeRules...    这时会打开一个文件,找到m_SimulateModem设置,可设置请求或响应的延迟时间(一般设置为延迟30毫秒,太久了就完全没有响应了)     ④最后勾上Rules->Performance->SimulateModemSpeeds启动控制的时间                 3.查看电脑IP 打开cmd,输入:ipconfig,记住这个IPv4地址。   4、设置代理 1.手机设置->WLAN设置->选择该wifi,点右边的箭头(有的手机是长按弹出选项框)。2.选择修改网络配置:

  • mysqlslap工具压测mysql

    介绍: mysqlslap是mysql自带的一个性能压测工具,而mysqlslap只需要使用命令就能触发大并发,模拟负载,压测mysql,官方说明https://dev.mysql.com/doc/refman/8.0/en/mysqlslap.html 官方说明:mysqlslap是一个诊断程序,旨在模拟MySQL服务器的客户端负载并报告每个阶段的时间。它就像多个客户端正在访问服务器一样工作。     OptionNameDescriptionIntroducedDeprecated --auto-generate-sql GenerateSQLstatementsautomaticallywhentheyarenotsuppliedinfilesorusingcommandoptions 未在文件中提供或使用命令选项时自动生成SQL语句     --auto-generate-sql-add-autoincrement AddAUTO_INCREMENTcolumntoautomaticallygeneratedtables

  • 第十四周课程总&实验报告

    这是第十三周的,因为上周没来得急写 菜单组件JMenuBar: 用来摆放JMenu组件,JMenuBar的常用方法:   JMenu常用方法:      JMenuItem的常用方法:      JFileChooser类的常用方法:      若在java中实现此菜单,则可使用JMenu组件,不过,如果要使用JMenu则首先要了解JMenuBar组件; JRadioButton与其他组件一样都是要构造和初始化; JRadioButton类的常用方法: 菜单组件JMenuBar: 用来摆放JMenu组件,JMenuBar的常用方法:   JMenu常用方法:      JMenuItem的常用方法:      JFileChooser类的常用方法: 本周总结 本周讲了Java的数据库编程。 1.JDBC 他的意思是java数据库连接,他可以方便的实现多种关系型数据库的统一操作,由一组用java语句编写的

  • Docker 私有registry出现的证书问题

    在上一篇最近搭建的私有registry里,参考的文章指出,在push时可能出现问题: 可能会出现无法push镜像到私有仓库的问题。这是因为我们启动的registry服务不是安全可信赖的。这是我们需要修改docker的配置文件/etc/default/docker,添加下面的内容, DOCKER_OPTS="--insecure-registryxxx.xxx.xxx.xxx:5000" 复制 然后重启docker后台进程, $sudoservicedockerrestart 这是再push即可。 在非Windows的客户端里处理没有问题,但是在Windows版本的客户端里怎么处理? Dockerforwindows(windows10) 点击托盘的Docker小图标,选择设置 在打开的界面里选择Daemon,设置Insecureregistriesm,直接上图: 应用即可,Docker服务重启后就可以正常推送了 WindowsServer2016 在win2016里,因为没有托盘工具,只能手动设置: 打开C:/Users/{Username}/.d

  • android Context提供的一些有关文件的方法

    当Android的程序运行后,可以通过程序取得当下运行的程序路径,这个路径通常会在/data/data底下的packagename。这里的"packagename"即是程序的package名称。 1· publicFilegetDir(Stringname,intmode):name目录名称、mode权限,如果传入的目录不存在,系统会创建此目录,路径为“/data/data/程序PackageName/app_name”,name就是传入的name。 2· publicFilegetFileStreamPath(Stringname):name为文件名称,所取得的文件必须是放在/data/data/程序PackageName/files的文件。 3· publicFilegetFilesDir():取得“/data/data/程序PackageName/files”这个目录的File。 4· publicFileInputStreamopenFileInput(Stringname):读取文件,name为文件名不能包含路径,文件的路径为“/dat

  • Eclipse安装Spring插件springsource-tool-suite

    Eclipse安装Spring插件springsource-tool-suite http://blog.csdn.net/ailo555/article/details/50878866   

  • 如何设置UITextView不可被编辑

    在项目中遇到一些需求需要把文字用UITextView来展示,但是该文字不能被编辑,只要把以下该代理方法实现就可以了 -(BOOL)textViewShouldBeginEditing:(UITextView*)textView {   if([textViewisFirstResponder]){     returnYES;   }   returnNO; } 以后要养成遇到问题就记录下来的好习惯,每次都是翻看之前好多代码,好恶心.

  • 服务器客户端

    publicclassServer1{ privatestaticBufferedReaderbr=null; privatestaticPrintWriterpw=null; privatestaticServerSocketss; privatestaticSockets; staticScannerscanner=newScanner(System.in); /** *@paramargs */ publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub try{ ss=newServerSocket(6333); System.out.println("服务器正常启动。。。。"); s=ss.accept();//阻塞方法 System.out.println("连接成功"+s.getRemoteSocketAddress()); br=newBufferedReader(newInputStreamReader(s.getInputStream())); pw=newPrintWriter(newOut

  • markdown学习(软件typola)

    Markdown学习 标题 标题:使用#+空格 二级标题:使用##+空格以此类推,最高6级标题 字体 字体加粗:文本左右两端加两个星号**+文本+**(hello,world!) 字体斜体:文本左右两端加一个星号*+文本+*(hello,world) 字体斜体加粗:文本左右两端加三个星号(hello,world) 字体划掉:文本左右两端加两个波浪号~~(hello,world) 引用 在文本的前面加>符号就行,效果如下 选择参考Typola文档说明 分割线 三个---或者三个***回车 图片 加个!+[+图片名字+]+()+   超链接 先输入因为的中括号后面加小括号[+超链接名字+]+() 列表 有序列表:输入1加点号+空格 A   无序列表:输入减号+空格 A B 表单 名字+性别生日       代码 通过三个```+java+回车  1.public复制  

  • 分页jdk1.8

      List<PPSIIResp>influenceIndexRespList=dataServiceDetailMapper.listPPSIIWithCountrys(null);复制 List<PPSIIResp>subList=ppsiiRespList.stream().skip((PageNum-1)*PageSize).limit(PageSize).collect(Collectors.toList());复制

  • 上标 下标 如何在单元格中输入化学式

    H2O  选中2右击设置单元格式      

  • CCIE DC Multicast Part 2.

    HiGuys!Inmylastblogpost,wehadaquicklookatmulticastandamoreindepthlookathowPIMworks,sincethisisaCCIEDCfocusedblog,andtheNexus7000usesPIMSparseMode,wespentmostofourtimelookingatSparseModeandthewaysharedtreesandshortestpathtreeswork,includingthesharedtreetoshortestpathtreeswitchover. 在上一篇博客中,我们快速了解了组播和一些PIM工作方式。因为这是关注CCIEDC的博文,Nexus7000使用是sparsemode,我们花费了很多时间在sparsemode上以及共享树和最短路径树的工作方式和切换方式 Incidentally,beforegoinganyfurther,foragreatreviewofthemulticastconceptsheadto: 巧合的是,在继续进展之前,有一个不错的链接可以更好地复习

  • 【Java第一步,走好寻常路】记第一次正儿八经学习JAVA

    去年此时,我也在学习JAVA。用着那本传家宝式教科书,除了画风和毛概整理出奇相似的笔记外,啥也没留下。 今天,师从MOOC浙大翁老师。不啃书!不记笔记!纯看网课!敲代码! 愉悦!舒适!高兴!   第一次作业题: 题目:分数 题目内容: 设计一个表示分数的类Fraction。这个类用两个int类型的变量分别表示分子和分母。 这个类的构造函数是:   Fraction(inta,intb)     构造一个a/b的分数。   这个类要提供以下的功能:   doubletoDouble();     将分数转换为double Fractionplus(Fractionr);     将自己的分数和r的分数相加,产生一个新的Fraction的对象。注意小学四年级学过两个分数如何相加的哈。 Fractionmultiply(Fractionr);     将自己的分数和r的分数相乘,产生一个新

相关推荐

推荐阅读