深入了解Redis的性能

简介

多少次你发现自己在几个月的开发和无数的努力后陷入了毫无性能而言的web应用?多少次你在好奇如果你无法向普通用户传达快与最快的标准,你的客户还应该把你当作专家?多少你听到有关Google和Facebook一些糟糕的对比?让我告诉你,我的客户是怎么看待这些的:

我曾开发一个有着复杂处理和过滤的web应用,因为很多业务规则和UI要求。再加上一些过时技术的第三方提供者,对于他们而言,速度意味着15年的工作丢进垃圾桶,然后重新开始。我的应用不是那么快,有时处理一个请求花费6~8s才会处理完,业务规则的验证、过滤和格式化响应。而客户不接受这样。并说如果Google做就会做好。同样,Facebook也行。我无法向客户解释速度后面的硬件是多么的庞大,服务器的压力怎样。我仅仅回复说可以做更好,我在记住Redis后保证可以做到。

那么,在我们深入Redis之前,我先介绍下NoSql。

大多数开发者习惯用关系型数据库。数据驱动开发或者领域驱动开发(作为一个整体框架编码或者用Fluent API NHibernate),关系型数据库的概念一样。另一方面,NoSql引领了新的数据存储时尚。在.NET社区最流行的是MongoDb,RavenDb和Redis。我已经写了一篇怎么使用MongDb的文章,你可以在这里找到。我使用它记录重要活动、错误和异常等的日志。

在NoSql的世界里,概念和所有流行的数据库基本是一样的。基本上它是存在你机器上某处的JSon文档或者你可以操作的某种.NET客户机或驱动。NoSql的伟大之处在于它解决了关系型数据库与OO语言如C#或Java时的一个主要缺点:错配阻抗。

Redis其实和任何的NoSql数据库一样。但是它是一个内存数据库而表现十分出色。

简单的说,Redis可以给你难以置信的存取你的对象状态的能力从而使你的应用更加快速。有时候,你的应用速度可以优化8到10倍。这并不是开玩笑的而且你不需要背后有Google或Facebook那样的基础设施。如果你想知道更多的关于Redis背后的思想和它的历史的内容,可以上网查找更多。有很多文章是关于这些的。

Redis代表了远程字典服务( Remote Dictionary Service) 。它是一个键值存储就像C#的字典对象。所以让我们看看如何使用:

首先,按照下面的步骤安装并运行Redis:

  • 打开redis.io,下载win64版本的redis(它并不会根据你的系统指定相应的版本)
  • 将下载的内容复制到Redis文件夹(你也可以命名为其他你喜欢的名字)
  • 点击 redis-server.exe 启动服务端
  • 点击 redis-client.exe 运行客户端命令行工具
  • 现在我们试着运行一些基本的命令来检测安装是否正确。在客户端命令行界面:
  • 输入 set azul "hello world" 来添加一条记录,你会收到ok的反馈。这意味着你已经添加了一个键为azul值为"hello world"的条目(顺便说下,azul在卡拜尔语中是问候的意思)
  • 输入 get azul取得相应的值,你会收到反馈 hello world
  • 输入 delete azul会删除这个条目

因为Redis是一个字典,可以以如下方式保存键值:

代码如下:

Set schedule:1 "{'origin':'Montreal','destination':'Toronto'}"

在这个示例中的值是一个json对象。这意味着你可以向Redis中添加复杂的对象。但没必要这么做,因为Redis支持5种数据类型以满足你的需求。

你也可以以如下方式指定key:

代码如下:

Set schedule:id 1

对于执行多个set 和get,可以使用mset 和mget来代替。我将不再对这些命令进行讨论。你可以查看Redis文档并尽情尝试。

幕后

到目前为止我们所做的一切都打破了常规。但在幕后却是Redis客户端通过Redis协议向服务器发送指令。服务器对内存中的数据执行这些指令,并返回响应结果。
做为服务的Redis

你可以在物理机,虚拟机上使用Redis,也可以将Redis做为云服务。很多像Digital Ocean和Widnows Azure这类的供应商都提供该服务。我们将从Digital Ocean开始(主要考虑到价钱,并且我认为Azure的Redis服务有点贵)

我们使用PuTTY的ssh(安全连接模式)来连接到Digital Ocean。下载PuTTY并将IP地址配置为你的DO droplet地址(droplet是你在DO上创建的linux主机)。然后启动PuTTY并用DO提供的root账户和密码登录。运行以下命令以保持你的linux主机的更新:apt-get update (linux用户现在很激动吧).

现在你正在或已经保持更新了。然后运行apt-get install build-essential为你的linux服务器安装所有缺失的工具。哦了。另外对于这些设置还有很多更详细的博文。我不得不承认,因为我对linux世界不太熟悉,所以在配置的时候着实费了翻手脚。

在 Visual Studio 中使用

在起始页,添加一个MVC项目,并使用Nuget包管理器添加Servicestack.redis。这样你就可以连接到Redis并做一些有意思的事。

你需要按以下步骤做来连接Redis并被取得缓存的对象列表。

using(IRedisClient client = RedisClient)
 {
  var scheduleClient= client.GetTypedClient<Schedule>();
  var schedules = scheduleClient.GetAll();
 }

哪怕你缓存了很多对象这也是一个非常快速的操作。在Redis中缓存即用的对象是很好的想法,这免去了可能的业务处理操作(应用规则或其他过滤和格式化操作).

数据库中重复提取的对象(很多时候是相同的)最好放到Redis中。通常我们要在仓库中缓存的数据(更多细节请浏览缓存仓库模式cached repository pattern)也最好放到Redis中。这样你就可以快速取得操作结果,大幅提升Web应用的整体性能。

注意scheduleClient将会暴露很多有关增加、添加、移除和使用列表、哈希等的函数。尝试下探索更多。。。

你也可以设置你的Redis客户端来看一下(不是用Glimpse-;))在添加monitor command的这种情况下发生了什么(在我们开始时添加azul的同一个地方)。

在完整的反HelloWorld应用风格(我承认我是其中之一!)的勇士兴奋的跳向天空之前,我还应该提醒一件事:从你的控制器连到你的数据库(就是Redis!)不是个好主意,如果这对你来说很奇怪,我认为你需要读一些关于设计和架构方面的东西。我不理解Microsoft的指导书让用户添加一个MVC项目,你就可以开始构建一耳光伟大的商业web应用了。因为不是这样。

然而,下面是一个添加对象的例子,在这个情况下式一个调度器:

//domain object
 public class Schedule
 {
  public int Id {get; set;}
  public string Origin {get; set;}
  public string Destination {get; set;}
 } 

 using(IRedisClient client = RedisClient)
 {
  var scheduleClient= client.GetTypedClient<Schedule>();
  var schedule= new Schedule
  {
    Id= scheduleClient.GetNextSequence(),
    Origin ="Montreal",
    Destination = "Quebec"
 }
  var schedules = scheduleClient.Store(schedule);
 }

因为Redis是一个缓存服务,是可以通过设置一个超时时间让输入过期。你也可以通过移除那个超时来逆向这个过程。

这仅是一个关于Redis的简介,给你提供一个提高web引用性能的方法启示。在某些情况下,Redis可能会给你一些你的客户或者老板没有给你的,关于构建可靠软件的激情的认可。

希望这能帮到一些人!

(0)

相关推荐

  • Redis性能大幅提升之Batch批量读写详解

    前言 本文主要介绍的是关于Redis性能提升之Batch批量读写的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 提示:本文针对的是StackExchange.Redis 一.问题呈现 前段时间在开发的时候,遇到了redis批量读的问题,由于在StackExchange.Redis里面我确实没有找到PipeLine命令,找到的是Batch命令,因此对其用法进行了探究一下. 下面的代码是我之前写的: public List<StudentEntity> Get(List<int&

  • 关于redis状态监控和性能调优详解

    前言 对于任何应用服务和组件,都需要一套完善可靠谱监控方案. 尤其redis这类敏感的纯内存.高并发和低延时的服务,一套完善的监控告警方案,是精细化运营的前提. 本文主要给大家介绍了关于redis状态监控和性能调优的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 1.redis-benchmark redis基准信息,redis服务器性能检测 例如: 检测redis服务器性能,本机6379端口的实例,100个并发连接,100000个请求 redis-benchmark

  • asp.net性能优化之使用Redis缓存(入门)

    1:使用Redis缓存的优化思路 redis的使用场景很多,仅说下本人所用的一个场景: 1.1对于大量的数据读取,为了缓解数据库的压力将一些不经常变化的而又读取频繁的数据存入redis缓存 大致思路如下:执行一个查询 1.2首先判断缓存中是否存在,如存在直接从Redis缓存中获取. 1.3如果Redis缓存中不存在,实时读取数据库数据,同时写入缓存(并设定缓存失效的时间). 1.4缺点,如果直接修改了数据库的数据而又没有更新缓存,在缓存失效的时间内将导致读取的Redis缓存是错误的数据. 2:R

  • 详解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

    前段时间在做用户画像的时候,遇到了这样的一个问题,记录某一个商品的用户购买群,刚好这种需求就可以用到Redis中的Set,key作为productID,value就是具体的customerid集合,后续的话,我就可以通过productid来查看该customerid是否买了此商品,如果购买了,就可以有相关的关联推荐,当然这只是系统中的一个小业务条件,这时候我就可以用到SADD操作方法,代码如下: static void Main(string[] args) { ConnectionMultip

  • 深入了解Redis的性能

    简介 多少次你发现自己在几个月的开发和无数的努力后陷入了毫无性能而言的web应用?多少次你在好奇如果你无法向普通用户传达快与最快的标准,你的客户还应该把你当作专家?多少你听到有关Google和Facebook一些糟糕的对比?让我告诉你,我的客户是怎么看待这些的: 我曾开发一个有着复杂处理和过滤的web应用,因为很多业务规则和UI要求.再加上一些过时技术的第三方提供者,对于他们而言,速度意味着15年的工作丢进垃圾桶,然后重新开始.我的应用不是那么快,有时处理一个请求花费6-8s才会处理完,业务规则

  • 提升node.js中使用redis的性能遇到的问题及解决方法

    问题初现 某基于node.js开发的业务系统向外提供了一个dubbo服务,提供向第三方缓存查询.设置多项业务数据并聚合操作结果.在QPS达到800时(两台虚拟机,每台机器4Core8G4node进程),在监控平台上出现了非常多的slow rt警告,平均接口响应达到60+ms,请求报警率达到80%+. 为找到造成该服务吞吐量过低的罪魁祸首,业务人员在请求日志中打点了所有查询缓存的操作,结果显示每个请求查询缓存耗时在50-100ms之间跳动.查询了redis-server的监控数据发现,不存在ser

  • 深入解析Redis中常见的应用场景

    前言 Redis是一个key-value存储系统,现在在各种系统中的使用越来越多,大部分情况下是因为其高性能的特性,被当做缓存使用,这里介绍下Redis经常遇到的使用场景.下面话不多说了,来一起看看详细的介绍吧. Redis特性 一个产品的使用场景肯定是需要根据产品的特性,先列举一下Redis的特点: 读写性能优异 持久化 数据类型丰富 单线程 数据自动过期 发布订阅 分布式 这里我们通过几个场景,不同维度说下Redis的应用. 高性能适合当做缓存 缓存是Redis最常见的应用场景,之所有这么使

  • redis数据的两种持久化方式对比

    一.概念介绍 redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Apend Only File). RDB方式 RDB方式是一种快照式的持久化方法,将某一时刻的数据持久化到磁盘中. •redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件.正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的. •对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而

  • 超强、超详细Redis数据库入门教程

    [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使用redis 4.学会安装redis 5.学会启动redis 6.使用redis客户端 7.redis数据结构 – 简介 8.redis数据结构 – strings 9.redis数据结构 – lists 10.redis数据结构 – 集合 11.redis数据结构 – 有序集合 12.redis数据结构 – 哈希 13.聊聊redis持久化 – 两种方式 14.聊聊redis持久化 – RDB 15.聊聊redis持

  • redis常用命令小结

    1.redis-benchmark redis基准信息,redis服务器性能检测 redis-benchmark -h localhost -p 6379 -c 100 -n 100000 100个并发连接,100000个请求,检测host为localhost 端口为6379的redis服务器性能 [root@Architect redis-1.2.6]# redis-benchmark -h localhost -p 6379 -c 100 -n 100000 ====== PING ====

  • 利用ganglia监控redis的最新解决方法

    前言 Ganglia主要用来监控系统性能的软件,通过曲线很容易见到每个节点的工作状态,对合理调整,分配系统资源,提高系统整体性能起到重要作用,支持浏览器方式访问,但不能监控节点硬件技术指标.Ganglia是分布式的监控系统. Redis现在在业务中应用已经很广泛了,但是如何监控redis,实时的观察redis的性能,在搜索引擎搜索"ganglia监控redis",发现都是13年的老文章,都是说要到https://github.com/ganglia/gmond_python_modul

  • laravel使用Redis实现网站缓存读取的方法详解

    redis的简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储. Redis支持数据的备份,即master-slave模式的数据备份. Redis 优势 性能极高 – Red

随机推荐