深入了解Redis的性能

 更新时间:2015年06月28日 11:42:01   投稿:goldensun  
这篇文章主要介绍了Redis的性能,作者通过Visual Studio上的C#程序对其进行了分析,需要的朋友可以参考下

简介

多少次你发现自己在几个月的开发和无数的努力后陷入了毫无性能而言的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可能会给你一些你的客户或者老板没有给你的,关于构建可靠软件的激情的认可。

希望这能帮到一些人!

相关文章

  • redis实现简单分布式锁

    redis实现简单分布式锁

    这篇文章主要介绍了redis实现简单分布式锁,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2013-09-09
  • redis-cli -p 6379 info命令详解

    redis-cli -p 6379 info命令详解

    这篇文章主要介绍了redis-cli -p 6379 info命令详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Redis妙用之存储用户token问题

    Redis妙用之存储用户token问题

    这篇文章主要介绍了Redis妙用之存储用户token问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 基于Redis实现抢红包和发红包功能

    基于Redis实现抢红包和发红包功能

    抢红包是我们生活常用的社交功能, 这个功能最主要的特点就是用户的并发请求高, 在系统设计上, 可以使用非常多的办法来扛住用户的高并发请求, 在本文中简要介绍使用Redis缓存中间件来实现抢红包算法,需要的朋友可以参考下
    2024-04-04
  • Redis Sentinel的使用方法

    Redis Sentinel的使用方法

    这篇文章主要介绍了Redis Sentinel的使用方法,帮助大家更好的理解和学习使用Redis数据库,感兴趣的朋友可以了解下
    2021-03-03
  • redis快照模式_动力节点Java学院整理

    redis快照模式_动力节点Java学院整理

    这篇文章主要为大家详细介绍了redis快照模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Redis分布式非公平锁的使用

    Redis分布式非公平锁的使用

    分布式锁很多人都能接触到,本文主要介绍了Redis分布式非公平锁,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 关于Redis单线程的正确理解

    关于Redis单线程的正确理解

    很多同学对Redis的单线程和I/O多路复用技术并不是很了解,所以我用简单易懂的语言让大家了解下Redis单线程和I/O多路复用技术的原理,对学好和运用好Redis打下基础,感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • 硬核!15张图解Redis为什么这么快(推荐)

    硬核!15张图解Redis为什么这么快(推荐)

    作为一名服务端工程师,工作中你肯定和 Redis 打过交道。Redis为什么快,这点想必你也知道,至少为了面试也做过准备,今天通过本文给大家介绍下,感兴趣的朋友一起看看吧
    2020-10-10
  • Redis源码分析之set 和 sorted set 使用

    Redis源码分析之set 和 sorted set 使用

    本文介绍了Redis 中的 set 和 sorted set 使用源码实现分析,Redis 的 Set 是 String 类型的无序集合,集合成员是唯一的,sorted set有序集合和集合一样也是 string 类型元素的集合,对Redis set 和 sorted set使用相关知识感兴趣的朋友一起看看吧
    2022-03-03

最新评论