资讯专栏INFORMATION COLUMN

【进阶】深入redis,然后正确使用它

superPershing / 1793人阅读

摘要:命令取消事务,放弃执行事务块内的所有命令。如果有命令在入队时失败,那么大部分客户端都会停止并取消这个事务。程序需要做的,就是不断重试这个操作,直到没有发生碰撞为止。这种形式的锁被称作乐观锁,它是一种非常强大的锁机制。

redis缓存类型 1. 缓存覆盖

当你的mysql数据库挂掉了或者你手动关闭了connect,你的网站绝大多数网页页面仍然能刷出来。

2. 激活缓存

查询的时候,发现缓存没有了(失效了),那么这次就从mysql中查询,再写入redis缓存.下次来的时候,就走缓存,不走数据库。

3. 热点缓存

哈希值目前存在,但有效期只剩下1分钟了(生命周期共10分钟),此时,又有一次访问时,再把时间刷新一下,又变成10分钟。

相关常识

1.redis可能存在失败的地方就是redis服务器挂了或物理满了、调用虚拟内存的时候.

2.redis一般都会做相应的管理,如清空缓存、重建所有缓存、清除某一个模块的缓存.

3.redis做缓存就是为了不走数据库,提高响应速度.是两个独立的系统,关了redis,网站一样能跑,关了mysql,网站一样正常访问.

4.list占用内存比较少,可以不用设置过期时间.但hash占用内存大,必须设置过期时间.

缓存逻辑

生命周期

Redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它。

expire 设置生存时间(单位/秒)

expire key seconds(秒) 

persist 取消生存时间

persist key  
应用场景
限时的优惠活动信息
网站数据缓存(对于一些需要定时更新的数据,例如:积分排行榜)
手机验证码
限制网站访客访问频率(例如:1分钟最多访问10次)
事务(transaction) 原理
先将属于一个事务的命令发送给redis进行缓存,最后再让redis依次执行这些命令。
命令
DISCARD

取消事务,放弃执行事务块内的所有命令。

EXEC

执行所有事务块内的命令。

MULTI

标记一个事务块的开始。

UNWATCH

取消 WATCH 命令对所有 key 的监视。

WATCH key [key ...]

监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

实践 使用事务时可能会遇上以下两种错误

1.事务在执行EXEC 之前,入队的命令可能会出错。比如说,命令可能会产生语法错误(参数数量错误,参数名错误,等等),或者其他更严重的错误,比如内存不足

(如果服务器使用 maxmemory 设置了最大内存限制的话)。

2.命令可能在EXEC 调用之后失败。举个例子,事务中的命令可能处理了错误类型的键,比如将列表命令用在了字符串键上面,诸如此类。

第一种错误的情况

服务器端
在 Redis 2.6.5 以前,Redis 只执行事务中那些入队成功的命令,而忽略那些入队失败的命令。

不过,从 Redis 2.6.5 开始,服务器会对命令入队失败的情况进行记录,并在客户端调用EXEC 命令时,拒绝执行并自动放弃这个事务。

客户端

客户端以前的做法是检查命令入队所得的返回值:如果命令入队时返回 QUEUED ,那么入队成功;否则,就是入队失败。如果有命令在入队时失败,
那么大部分客户端都会停止并取消这个事务。

第二种错误的情况

至于那些在EXEC 命令执行之后所产生的错误,并没有对它们进行特别处理:即使事务中有某个/某些命令在执行时产生了错误,事务中的其他命令仍然会继续执行。

这种做法可能会让你觉得有点奇怪,以下是这种做法的优点:
1.Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,

失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。

2.因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
鉴于没有任何机制能避免程序员自己造成的错误,并且这类错误通常不会在生产环境中出现,所以 Redis 选择了更简单、更快速的无回滚方式来处理事务。

3.DISCARD 命令时,事务会被放弃,事务队列会被清空,并且客户端会从事务状态中退出。

4.WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为
被WATCH 的键会被监视,并会发觉这些键是否被改动过了。如果有至少一个被监视的键在EXEC 执行之前被修改了,那么整个事务都会被取消。

如果在WATCH 执行之后,EXEC 执行之前,有其他客户端修改了 mykey 的值,那么当前客户端的事务就会失败。程序需要做的,就是不断重试这个操作,直到没有发生碰撞为止。
这种形式的锁被称作乐观锁,它是一种非常强大的锁机制。并且因为大多数情况下,不同的客户端会访问不同的键,碰撞的情况一般都很少,所以通常并不需要进行重试。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/36374.html

相关文章

  • 全栈工程师的思考 | 步步进阶经验之谈

    摘要:全栈工程师专家人的大脑如同一间空空的阁楼,要有选择地把一些家具装进去。如果他们都是一本书,那么全栈工程师的书是一个索引。如下图所示,左边的关系数据模型即为全栈工程师,右边则为专家。好奇与专家不同的是,全栈工程师更容易被新的技术吸引。 什么是全栈工程师 在现在这一个时代来说,不会有人掌握所有的编程语言、技能,以后应该会有,但是掌握这些全部技术的不是人类了。所以,其实我们需要的是懂得多种...

    SegmentFault 评论0 收藏0
  • Java入门基础知识点总结(详细篇)

    摘要:深入理解数据库管理系统通用知识及数据库的使用与管理。为后台开发打下坚实基础。项目文档,项目规范,需求分析,数据库设计,工程构建,需求评审,配置管理,修复,项目管理等。 很多新手在学习java的时候都比较迷茫,不知道从哪里开始学起,这里就给大家整理了一份java开发学习路线,比较系统全面,可参...

    shinezejian 评论0 收藏0
  • Java进阶之路

    摘要:探索专为而设计的将探讨进行了何种改进,以及这些改进背后的原因。关于最友好的文章进阶前言之前就写过一篇关于最友好的文章反响很不错,由于那篇文章的定位就是简单友好,因此尽可能的摒弃复杂的概念,只抓住关键的东西来讲,以保证大家都能看懂。 周月切换日历 一个可以进行周月切换的日历,左右滑动的切换月份,上下滑动可以进行周,月不同的视图切换,可以进行事件的标记,以及节假日的显示,功能丰富 Andr...

    sushi 评论0 收藏0
  • 进阶1-5期】JavaScript深入之4类常见内存泄漏及如何避免

    摘要:本期推荐文章类内存泄漏及如何避免,由于微信不能访问外链,点击阅读原文就可以啦。四种常见的内存泄漏划重点这是个考点意外的全局变量未定义的变量会在全局对象创建一个新变量,如下。因为老版本的是无法检测节点与代码之间的循环引用,会导致内存泄漏。 (关注福利,关注本公众号回复[资料]领取优质前端视频,包括Vue、React、Node源码和实战、面试指导) 本周正式开始前端进阶的第一期,本周的主题...

    red_bricks 评论0 收藏0
  • 进阶1-4期】JavaScript深入之带你走进内存机制

    摘要:引擎对堆内存中的对象进行分代管理新生代存活周期较短的对象,如临时变量字符串等。内存泄漏对于持续运行的服务进程,必须及时释放不再用到的内存。 (关注福利,关注本公众号回复[资料]领取优质前端视频,包括Vue、React、Node源码和实战、面试指导) 本周正式开始前端进阶的第一期,本周的主题是调用堆栈,今天是第4天。 本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划...

    不知名网友 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<