设为首页 收藏本站
查看: 882|回复: 0

[经验分享] Redis实现缓存,你应该懂的哪些思路!

[复制链接]

尚未签到

发表于 2017-12-21 06:54:04 | 显示全部楼层 |阅读模式
  场景一:类似于微博,实现关注和被关注功能。
  思路:
  对每个用户使用两个集合类型键,用来存储关注别人的用户和被该用户关注的用户。当用户A关注用户B的时候,执行两步操作:
  sadd user:A B
  sadd user:B A
  问题1:
  完成一次用户关注操作,需要执行两步代码,第一次实现用户A关注B,成为了B的粉丝。而第二步的时候,因为某种原因没有执行或执行成功,则A并不知道B关注了自己
  事务:
  事务的原理是,先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令。
  一个事务中,要么都执行成功,要么都不执行
DSC0000.jpg

  multi命令告诉redis准备介绍事务,先暂存起来,不要执行。然后发送需要一起执行的命令,最后exec结束事务,redis依次执行那么命令
  如果在执行exec命令之前,因为某种原因,redis断掉了,Redis会清空事务队列.
  问题2:
  有些时候,我们不仅需要通过事务来处理一些必须一起成功的动作,比如银行转账,从银行卡1转出钱到银行卡2,必须是都一起成功,不能说从银行卡1中扣完钱之后,没有进到银行卡2账上,两者动作比如都要完成。还有些时候,我们既要一起完成,也需要根据其中一步操作的结果来进行下一步操作
  WATCH命令
  watch,事务中的另一个命令。监控一个或多个键,一旦其中一个键被修改或删除,之后的事务就不会执行,一直到exec结束。
DSC0001.jpg

  通过watch监控key1,之后修改了key1,所以事务中的set命令并没有执行
  场景二:限时活动,缓存,验证码失效
  在实际开发中,经常会遇到限时活动,邮箱失效时间,验证码失效时间等场景,这些数据需要在一定的时间内有效,过期删除,如果在关系型数据库中保存这些数据,每次校验都需要查询数据,对比时间,然后将数据置为失效,或者删除。而在Redis中,则可以通过expire设置失效时间,自动删除。
DSC0002.jpg

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

  当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。
  注意:在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1
  实现缓存
  为了提供网站的负载能力,需要将一个访问频路较高,且经过复杂计算或者IO资源消耗较大的操作的结果缓存起来,并设置一个失效时间。每次用户访问的时候,先检查该键是否存在,如果存在直接获取该元素并返回,如果不存在,则经过一系列计算并将结果缓存,设置失效时间,在返回给用户
  问题:
  这种缓存的实现,显然会有两个问题,第一个是缓存都是存在内容中的,如果大量的使用缓存会导致Redis沾满内存,另一方面,为了防止Redis沾满内存而设置失效时间的键,如果设置时间太短,就可能导致缓存命中率过低并且大量内容白白浪费。
  使用方式:
  在开发中,很难合理的设置键的生存时间,所以可以限制Redis使用的最大内存,并让Redis按照一定规则删除一些不需要的键。
  具体方式,修改配置文件的maxmemory参数
DSC0004.jpg

  OS X下通过Homebrew安装的redis的话,配置文件在/usr/local/etc/redis.conf
  限制Redis最大内存之后,当超出了这个内存,会根据maxmemory-policy
DSC0005.jpg

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426294-1-1.html 上篇帖子: 基于Redis位图实现系统用户登录统计 下篇帖子: redis 优化
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表