当你的mysql数据库挂掉了或者你手动关闭了connect,你的网站绝大多数网页页面仍然能刷出来。mysql
查询的时候,发现缓存没有了(失效了),那么此次就从mysql中查询,再写入redis缓存.下次来的时候,就走缓存,不走数据库。程序员
哈希值目前存在,但有效期只剩下1分钟了(生命周期共10分钟),此时,又有一次访问时,再把时间刷新一下,又变成10分钟。redis
1.redis可能存在失败的地方就是redis服务器挂了或物理满了、调用虚拟内存的时候.sql
2.redis通常都会作相应的管理,如清空缓存、重建全部缓存、清除某一个模块的缓存.数据库
3.redis作缓存就是为了避免走数据库,提升响应速度.是两个独立的系统,关了redis,网站同样能跑,关了mysql,网站同样正常访问.编程
4.list占用内存比较少,能够不用设置过时时间.但hash占用内存大,必须设置过时时间.缓存
Redis中可使用expire命令设置一个键的生存时间,到时间后redis会自动删除它。服务器
expire 设置生存时间(单位/秒)网站
expire key seconds(秒)
persist 取消生存时间spa
persist key
限时的优惠活动信息 网站数据缓存(对于一些须要定时更新的数据,例如:积分排行榜) 手机验证码 限制网站访客访问频率(例如:1分钟最多访问10次)
先将属于一个事务的命令发送给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 的值,那么当前客户端的事务就会失败。程序须要作的,就是不断重试这个操做,直到没有发生碰撞为止。这种形式的锁被称做乐观锁,它是一种很是强大的锁机制。而且由于大多数状况下,不一样的客户端会访问不一样的键,碰撞的状况通常都不多,因此一般并不须要进行重试。