Redis实现缓存,你应该懂的哪些思路!

场景一:类似于微博,实现关注和被关注功能。

思路:

对每个用户使用两个集合类型键,用来存储关注别人的用户和被该用户关注的用户。当用户A关注用户B的时候,执行两步操作:

sadd user:A B

sadd user:B A

问题1:

完成一次用户关注操作,需要执行两步代码,第一次实现用户A关注B,成为了B的粉丝。而第二步的时候,因为某种原因没有执行或执行成功,则A并不知道B关注了自己

事务:

事务的原理是,先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令。

一个事务中,要么都执行成功,要么都不执行

multi命令告诉redis准备介绍事务,先暂存起来,不要执行。然后发送需要一起执行的命令,最后exec结束事务,redis依次执行那么命令

如果在执行exec命令之前,因为某种原因,redis断掉了,Redis会清空事务队列.

问题2:

有些时候,我们不仅需要通过事务来处理一些必须一起成功的动作,比如银行转账,从银行卡1转出钱到银行卡2,必须是都一起成功,不能说从银行卡1中扣完钱之后,没有进到银行卡2账上,两者动作比如都要完成。还有些时候,我们既要一起完成,也需要根据其中一步操作的结果来进行下一步操作

WATCH命令

watch,事务中的另一个命令。监控一个或多个键,一旦其中一个键被修改或删除,之后的事务就不会执行,一直到exec结束。

通过watch监控key1,之后修改了key1,所以事务中的set命令并没有执行

场景二:限时活动,缓存,验证码失效

在实际开发中,经常会遇到限时活动,邮箱失效时间,验证码失效时间等场景,这些数据需要在一定的时间内有效,过期删除,如果在关系型数据库中保存这些数据,每次校验都需要查询数据,对比时间,然后将数据置为失效,或者删除。而在Redis中,则可以通过expire设置失效时间,自动删除。

expire设置失效时间,时间单位秒。成功返回1,如果key不存在返回0

当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。

注意:在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1

实现缓存

为了提供网站的负载能力,需要将一个访问频路较高,且经过复杂计算或者IO资源消耗较大的操作的结果缓存起来,并设置一个失效时间。每次用户访问的时候,先检查该键是否存在,如果存在直接获取该元素并返回,如果不存在,则经过一系列计算并将结果缓存,设置失效时间,在返回给用户

问题:

这种缓存的实现,显然会有两个问题,第一个是缓存都是存在内容中的,如果大量的使用缓存会导致Redis沾满内存,另一方面,为了防止Redis沾满内存而设置失效时间的键,如果设置时间太短,就可能导致缓存命中率过低并且大量内容白白浪费。

使用方式:

在开发中,很难合理的设置键的生存时间,所以可以限制Redis使用的最大内存,并让Redis按照一定规则删除一些不需要的键。

具体方式,修改配置文件的maxmemory参数

OS X下通过Homebrew安装的redis的话,配置文件在/usr/local/etc/redis.conf

限制Redis最大内存之后,当超出了这个内存,会根据maxmemory-policy

指定的参数删除不需要的键。当设置此参数为allkeys-lru,一旦Redis内存超过了限制值时,Redis会不断删除数据库中最近最少使用的键,直到满足了当前内存大小限制

原文发布于微信公众号 - 思梦PHP(sm_php)

原文发表时间:2016-12-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏零基础使用Django2.0.1打造在线教育网站

利用Flask搭建微电影视频网站(四):后台页面搭建

努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

4181
来自专栏资深Tester

软件测试人员在工作中如何运用Linux

2594
来自专栏码神联盟

分布式服务集群下实现session共享解决方案

随着互联网的日益壮大,网站的pv和uv成线性或者指数倍的增加.单服务器单数据库早已经不能满足实际需求。目前大多数大型网站的服务器都采用了分布式服务集群...

5088
来自专栏数据和云

浅谈TimesTen内存数据库的结构

作者介绍 ? 朱亮 云和恩墨技术专家,6年专职oracle dba生涯先后服务于保险、金融、电信、百货等客户 Oracle TimesTen In-Memor...

3558
来自专栏北京马哥教育

Linux运维常见故障排查和处理的33个技巧汇总

作为linux运维,多多少少会碰见这样那样的问题或故障,从中总结经验,查找问题,汇总并分析故障的原因,这是一个Linux运维工程师良好的习惯。每一次技术的突破,...

4136
来自专栏java思维导图

架构师详解:Nginx 架构

原文链接:https://my.oschina.net/u/3770281/blog/1802493

1362
来自专栏北京马哥教育

Linux之任务计划

用过windows的同学应该都知道在控制面板中有一个“任务计划”选项,我们可以通过向导设置让计算机在某个时间点或者开机时运行某个脚本或者批处理等等,方便我们的...

2724
来自专栏zaking's

走进webpack(1)--环境拆分及模块化

  初级的文章和demo已经基本完成了,代码也已经上传到了我的github上,如果你对webpack的使用并不是十分了解,那么建议你回头看下走近系列,里面包括了...

2686
来自专栏后端技术探索

nginx 缓存策略实现方案

由于本人工作原因,涉及到网络直播领域,其中视频的回放下载,涉及到了一些视频下载方面的技术。针对于一个完整视频的下载,目前市面上的主流做法是,先将整个视频流切片,...

2501
来自专栏幸山的专栏

精通yum配置以及问题解决

yum基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁...

8980

扫码关注云+社区