2016-02-05 29 views
0

我有一个应用程序,可用于API调用。在每个API调用中,我执行一些任务并收取费用(可以发送邮件或短信或任何此类东西)。Redis可以在单个键值对上每秒执行数百次交易

目前我把我的用户余额/信用卡数据在MYSQL表中以下形式:

|user|balance| 
|a |1200 | 
|b |1200 | 
|c |1300 | 
|d |1400 | 
|e |1212 | 
|f |9000 | 
|g |8000 | 
|h |7000 | 

但是,当一个用户点击每个API我更新数千次minute.And的API,这是产生问题用户平衡,如果没有足够的平衡,我会返回一些错误。
当API命中的数量不多时,不存在问题,但当数量较大时,更新天平将在该行上创建锁定,并且其他API必须等待处理。

我正在考虑将此表移动到缓存或内存数据库中,以便我可以加快此过程。

早些时候我有memcache在脑海中,但它是不稳定的,等搜索我读redis。
但我很困惑,我的问题是否会得到解决呢? 对于不同的密钥,从redis获取数据可能会很快,因为它仅保存在内存/ RAM中,但如果有相同/单个密钥有数千个更新和搜索查询,它将如何工作。



请分享,如果您有任何关于此知识或经验,或者如果有人有更好的解决方案,我的问题比redis,请帮助。

回答

1

简而言之,是的,Redis会完成你想要做的事情。它可以handle very high throughput,can be configured to be persistent,你可以set it up in an HA manner with Sentinel。让它在一分钟内处理数千个API调用的级别应该没有问题。

也就是说,这也不是绝对必要的。如果您在向用户宣布信用状况不佳时向用户声明了几秒的滞后时间,那么我还建议缓存每个框的API调用数量,并且每隔几秒刷新一次db(Redis或MySQL)在此期间每箱使用/添加的积分总量。添加/减去这些数字应该是幂等的,每隔几秒刷新一次就应该解决您的主要问题,即无法在随机时间处理意外大量的MySQL命中。

所以,你在这里有几个很好的选择。选择适合您的用例的最合适的选择。

-4

redis背后的人肯定会声称这种速度。但是,redis也是“易变的”,所以如果这是导致你退出memcache的原因,redis有什么不同?它也没有持久层。

你可以找一个内存数据库MVCC(乐观并发模型),以避免读/写/删除任务阻塞读。您可以通过使用NVDIMM(如果您的服务器足够现代,并且您选择的IMDB支持在NVDIMM中恢复数据库的能力)或复制来缓解波动性问题。

+3

在普通笔记本电脑处理器上,它可以达到每秒200k + ops。它**也有一个持久层。还有一个高可用性模块(称为Sentinel)。 –

+0

我会接受你的话。 RedisLabs的高层联系人告诉我,没有持久性。我没有redis的第一手经验。 –

+1

Redis甚至有**两种持久性机制:(1)快照,和(2)仅附加文件。如果您愿意,两种机制都可以同时使用。 –