为写入性能优化:Redis

http://book.51cto.com/art/201505/475427.htm

从表面上看,众多的分布式数据库似乎涵盖了许多相同的用例。因此,当试图选择一个非关系数据库解决方案时,新手们往往困惑不已。事实上,这些流行的非关系数据库往往偏执于某一方面。有些为了能便于分布到多台机器上而以牺牲数据一致性为代价。其他一些则专注于提高数据读写速度。当你在多个非关系数据库中做选择时,你也必须坚持自己的主见。选择数据库最重要的目标是了解你具体的使用情况。

作为例子,让我们试图明确我们应用的首要目标,并选择能实现该目标的合适的数据库解决方案。在这个过程中,我们将逐步了解扩展自己所选的数据库时所面临的挑战。一个越来越普遍的使用案例是那些需要快速执行大量数据库插入操作的应用。小型开发团队可能希望构建一个Web 应用程序,它能处理来自数千个甚至数百万用户的消息。又或许用例是一个在某个电视节目播出时能滚动显示提到该节目的推文的应用。类似地,某个应用也许要汇集来自世界各地成千上万个气象传感器的数据。这种设计模式在网络游戏界也很常见。许多社会化多玩家游戏提供游戏重放的功能,并且将游戏环境的统计数据公开地广播。在这种情况下,随时都可能有来自数千甚至数百万玩家的数据流持续不断地汇入应用的后端中。

在以上的例子中,查询的灵活性相比于非常迅速地收集数据的能力显得不那么重要。对于此类型的应用,键- 值存储是很好的选择,因为该模型的简单性使得数据库的写入操作尽可能地快。这种键- 值的设计也非常适用于分布式应用,此时选择数据库的哪一部分进行分片不是特别的重要。满足这些条件的一个数据库是开源的键- 值存储Redis。网站DB-Engines.com4 声称Redis 是目前最流行的键- 值数据存储,该网站使用搜索引擎的结果数量和诸如StackOverflow.com 等论坛上技术问题的数量等指标对最流行的数据库软件进行排名。

对于那些有快速读写性能需求的应用来说,Redis 很多有趣的特性使其成为一个不错的选择。Redis 基本上是一种“内存”数据库,这意味着它使用服务器的可用内存来存储整个数据库。这看上去似乎是一个很大的限制,因为你需要为你的应用提供足够的硬件(无论是物理的,还是虚拟的),而且一旦断电,你的数据很可能会丢失。别这么着急下结论! Redis 还可以提供ACID 中“D”的特性:持久性。Redis 提供了可配置的选项,将内存中的数据持久化写入磁盘。换句话说,Redis 提供了基于内存的易失的,但高性能的读写数据的功能;同时也提供了基于磁盘的数据缓存的持久性。

正如数据世界中的所有事物一样,巨大的优势需要以牺牲其他方面为代价。在此处,这个其他方面就是一致性。例如,如果该内存数据库设置为每隔10 秒就将数据持久化到磁盘上,而在这段时间内(比如由于电源故障)内存失效了,数据就将会丢失。记录数以千计的在线游戏玩家分数的高流量的Web 应用将会产生大量的数据。也可以让Redis 将每个写操作都持久化到磁盘上,从而提供非常好的持久性。但不幸的是,这将大大降低Redis 的性能,抵消了使用内存数据库带来的好处。在这些功能之上,Redis 也提供易于配置的复制功能,允许主实例异步地将更新流式传输到备用服务器上。

通过数据的键,Redis 在快速设置和获取数据方面表现优秀。但由于它是一个键- 值存储,Redis 不允许查询直接访问由键所指的值。如果你的应用需要不同类型的功能,例如需要基于数据本身的内容快速检索,那么其他类型的非关系数据库(例如文档存储)可能会更合适。

清单3.4 展示了如何通过Redis 命令行界面执行基本的命令来插入和检索单个值、列表和哈希结构。

清单3.4 使用Redis 处理单个值、列表和哈希结构

 
 
  1. # Setting values by key  
  2. > SET user:1:name 'Michael'  
  3. > SET user:2:name 'Ben'  
  4. # Retrieve a list of keys matching a pattern  
  5. > KEYS user*  
  6. 1) "user:2:name"  
  7. 2) "user:1:name"  
  8. # Retrieving a value using the respective key  
  9. > GET user:2:name  
  10. "Ben"  
  11. # Using lists - LPUSH adds values to the head of a list  
  12. > LPUSH names 'Jared'  
  13. > LPUSH names 'Melinda'  
  14. # Retrieve a range of values from a list  
  15. > LRANGE names 0 1  
  16. 1) "Melinda"  
  17. 2) "Jared"  
  18. # RPUSH adds values to the tail of the list  
  19. > RPUSH names 'Debra'  
  20. > LRANGE names 0 2  
  21. 1) "Melinda"  
  22. 2) "Jared"  
  23. 3) "Debra"  
  24. # Using hashes - HMSET sets fields to their respective values for a  
  25. # hash stored at a key  
  26. > HMSET employees:1 name 'Michael' city 'San Francisco' role 'Author'  
  27. # Retrieve the "name" attribute of the hash "employees:1"  
  28. > HGET employees:1 name  
  29. "Michael"  
  30. Manoochehri_Book.indb 37 11/20/13 1:59 PM  
  31. 38 Chapter 3 Building a NoSQL-Based Web App to Collect Crowd-Sourced Data  
  32. # Retrieve all keys and values of the hash "employees:1"  
  33. > HGETALL employees:1  
  34. 1) "name"  
  35. 2) "Michael"  
  36. 3) "city"  
  37. 4) "San Francisco"  
  38. 5) "role"  
  39. 6) "Author" 

当电源关掉时,计算机内存中的内容就会丢失。存储持久性数据是磁盘的职责。Redis 是一个“内存”数据存储,所以当有人被电源线绊倒致使你的服务器关闭时会有何后果?整个数据库都会被删除吗?当然不完全如此:Redis 通过提供将数据持久化到磁盘上的选项完善了内存系统的功能。当数据量非常巨大时,我们必须考虑多方面的权衡。例如,我们是否需要在任何时候都保持完全的数据一致性?如果遇到突然断电的情况,我们的应用是否能接受丢失最后一分钟的数据?有许多应用完全不需要持久化,因此对于这类应用,完全可以将Redis 的持久化关闭。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值