当前位置:首页 > 问答 > 正文

红色宝石和redis那些核心东西,原理加实战一起聊聊吧

红色宝石Ruby on Rails的精髓

Ruby on Rails(简称Rails)的核心思想就两个字:省事,它的创始人是个丹麦小伙,他觉得写Web应用重复性的工作太多了,很烦,于是他定下几条规矩,成了Rails的灵魂:

  1. 约定大于配置:这是什么意思呢?就是Rails给你定好了一套“家规”,你模型(Model)叫User,那对应的数据库表默认就叫users,控制器(Controller)就叫UsersController,你只要按这个规矩来,就不用写一大堆配置文件告诉框架东西都放哪儿了,这就像你回家,鞋子永远在门口鞋柜的第二层,闭着眼都能找到,不用每次都问“妈我鞋放哪儿了?”,效率极高。(来源:Rails设计哲学)

  2. DRY原则:意思是“别重复你自己”,同样的代码不要写第二遍,Rails提供了很多工具来实现这个,比如强大的“代码生成器”,你敲一行命令,它就能给你把模型、控制器、视图的基础文件都创建好,这种“魔法”般的感觉,让开发者能非常快速地搭建起一个应用的骨架。

  3. MVC架构:这个算是Web框架的通用设计,但Rails把它贯彻得很彻底,简单说,就是把活分清楚:

    红色宝石和redis那些核心东西,原理加实战一起聊聊吧

    • 模型(Model):管数据和业务逻辑,比如一个用户有没有权限,一篇博客文章该怎么校验标题不能为空,这都是Model的事,它直接跟数据库打交道。
    • 视图(View):就是用户看到的网页长啥样,是模板文件,它只负责展示,不管数据是怎么来的。
    • 控制器(Controller):像个协调员,接收用户从浏览器发来的请求(比如点击链接),然后去找Model要数据,拿到数据后,再扔给对应的View去渲染成网页,最后返回给用户。

Rails就是靠着这套清晰又“偷懒”的哲学,在十几年前横空出世,极大地提高了开发效率,尤其适合初创公司快速做出产品原型。

第二部分:Redis,不是数据库那么简单

现在说说Redis,很多人说它是一个数据库,没错,但它跟MySQL这种我们常说的“数据库”有本质区别,MySQL是关系型数据库,数据像存在Excel表格里,规规矩矩的,而Redis是内存数据库,它的核心特点就一个字:

为啥快?因为它把数据主要放在服务器的内存(RAM) 里,CPU从内存读数据比从硬盘读快成千上万倍,你可以把MySQL想象成一个很大的仓库,东西很多,但找起来慢;Redis就是你办公桌上的一个笔筒,最常用的笔和橡皮就放里面,伸手就拿,极其方便。

红色宝石和redis那些核心东西,原理加实战一起聊聊吧

所以Redis一般不当作存储核心数据(比如用户信息、订单记录)的主数据库,而是作为缓存特种兵来用,它的数据结构也特别灵活,不只是“键-值”那么简单:

  • String(字符串):最基础的,存个验证码、用户登录状态(Session)啥的。
  • Hash(哈希):像一个小型对象,适合存一个用户的多种信息,比如user:1这个键下面,可以存name: "张三", age: 20
  • List(列表):一个有序的列表,可以做消息队列,比如用户下单后,把订单ID推进去,后台慢慢处理。
  • Set(集合):自动去重的集合,可以用来存文章的标签,或者两个人的共同好友。
  • Sorted Set(有序集合):带分数的集合,这个就厉害了,排行榜功能就是它的经典应用,给每个成员(比如用户ID)赋一个分数(比如积分),Redis自动按分数排序。

第三部分:Rails和Redis的实战搭档

那Rails和Redis怎么配合干活呢?实战中主要有以下几个经典场景:

  1. 页面缓存:这是最常用的,比如你网站首页内容10分钟才变一次,但每次访问都要去数据库查一遍,数据库压力大,页面打开也慢,解决办法就是用Redis做缓存,当第一个用户访问首页时,Rails先去Redis查有没有缓存,没有,就去数据库辛苦地把页面数据拼好,然后在返回给用户的同时,把这个页面结果存到Redis里,并设置10分钟过期,接下来10分钟内,所有用户再来访问,Rails直接从Redis里拿现成的结果,飞快地返回,数据库彻底休息了,这性能提升是立竿见影的。(来源:常见的缓存实践)

    红色宝石和redis那些核心东西,原理加实战一起聊聊吧

  2. Session存储:默认情况下,Rails会把用户登录后的会话信息(Session)存在Cookie里或者服务器的文件中,但如果你有多台服务器做负载均衡,用户这次访问A服务器,下次访问B服务器,Session就可能丢了,把Session存到Redis里,因为所有服务器都连接同一个Redis,就等于把用户状态“中央化”了,用户在哪台机器登录体验都一样。

  3. 排行榜和计数器:就像前面说的,用Redis的Sorted Set做排行榜太合适了,比如做一个游戏积分榜,玩家每得一分,就执行ZINCRBY ranking 1 user_id命令,给这个用户的分数加1,查询TOP 10玩家就是一句命令的事,速度快到飞起,完全不用去数据库做复杂的计算,微博的点赞数、文章的阅读量这种高频更新的计数,也适合用Redis先顶着,然后再定期同步到数据库,避免频繁写库的压力。

  4. 消息队列:虽然不是Redis的强项(现在更常用专业的RabbitMQ或Kafka),但在简单的场景下,用Redis的List也能实现,比如用户上传图片后需要后台处理(压缩、加水印),这个处理比较耗时,不能让他干等着,Rails就可以把“处理图片任务”的信息包装成一个消息,RPUSH进一个叫image_process的List,后台开一个独立的worker进程,不停地用LPOP从这个List里取任务出来执行,这样就把“立即要完成的工作”变成了“异步慢慢处理的工作”,用户体验非常好。

总结一下

Ruby on Rails的核心是让你用最省事的方式,规规矩矩地快速开发Web应用,而Redis的核心是提供一个快到极致的“内存工作台”,专门处理那些高并发、高频率、或需要临时快速存取的“特种任务”,他俩搭档,Rails负责稳扎稳打的主体业务,Redis则像闪电侠一样处理那些性能瓶颈和特殊需求,一个主外一个主内,共同打造既稳定又迅捷的现代Web应用。