深入了解Redis的性能_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可能会给你一些你的客户或者老板没有给你的,关于构建可靠软件的激情的认可。

希望这能帮到一些人!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索redis
深入了解redis、redis深入浅出、redis 深入、深入理解redis、深入redis缓存,以便于您获取更多的相关知识。

时间: 2024-11-13 06:51:00

深入了解Redis的性能_Redis的相关文章

Redis 的性能幻想与残酷现实(转)

2011 年,当初选择 Redis 作为主要的内存数据存储,主要吸引我的是它提供多样的基础数据结构可以很方便的实现业务需求.另一方面又比较担心它的性能是否足以支撑,毕竟当时 Redis 还属于比较新的开源产品.但 Redis 官网宣称其是提供多数据结构的高性能存储,我们对其还是抱有幻想的. 幻想 要了解 Redis 的性能,我们先看看官方的基准性能测试数据,心里有个底. 测试前提 Redis version 2.4.2 Using the TCP loopback Payload size =

分割超大Redis数据库例子_Redis

薄荷 App 上的伙伴功能大量使用了内存数据库 Redis,随着数据量的快速增长,Redis 膨胀得很快,已经接近 12 GB规模,这些数据全部放在单个 Redis 实例中.单个巨大 Redis 实例有如下几个坏处: 1.首先,需要一台内存很大的机器.Redis 是内存数据库,它需要把所有需求全部放在内存中,需要为之装下 12 GB的 Redis 实例,至少需要 12 GB 内存大小的机器,考虑的预留增长空间,一般需要 12 * 1.5 约 18 GB 内存. 另外还有一个考虑的因素是,Redi

Redis总结笔记(二):C#连接Redis简单例子_Redis

注:C#在调用Redis是不要使用ServiceStack.Redis驱动的4.0版本,因为这个版本已经商业化了,会出现每小时6000条数据的限制 1.引用驱动 复制代码 代码如下:     using ServiceStack.Redis; 2.数据库连接 复制代码 代码如下:     RedisClient client;             //连接服务器   6379是redis的默认端口             client = new RedisClient("127.0.0.1

Redis性能问题排查解决手册(七)

阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_commands_processed 延迟时间 内存碎片率 回收key 总结 性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输出的数据可分为10个类别,分别是: server clients memory persistence stats replication

超强、超详细Redis数据库入门教程_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持

NoSQL数据库MongoDB、Redis、Tokyo Tyrant的性能比较

准备对MongoDB, Redis以及Tokyo Tyrant的读写做一个简单的测试,为了进行相对公平的测试,需要了解他们背后的实现机制,下面是一些比较: 存储实现的比较: * 内存文件映像(Memory-File Mapping) Redis, MongoDB * 文件 + Cache Tokyo Tyrant * 内存: Redis, Tokyo Tyrant Key/Value索引形式: * B+ Tree : MongoDB, Tokyo Tyrant * Hash Table: Red

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的最新解决方法_Redis

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

Redis-benchmark测试Redis性能

Redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能. 使用说明如下: Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>] -h <hostname> Server hostname (default 127.0.0.1) -p <port>