【问题标题】:Dictionary Vs Database (Mysql)字典与数据库(Mysql)
【发布时间】:2014-08-26 11:32:35
【问题描述】:

这个问题以前曾被问过,但不是在多线程应用程序的上下文中。

因此,给定一个单线程应用程序,字典将在 O(1) 时间内找到给定键的值。给定一个表(来自数据库),该表在“X”列上有一个主键(簇索引),搜索与“X”列上的键相关联的元组将在 O(log n) 时间内找到该元组。添加字典的内存优势,字典胜出。

给定一个高度并行(例如异步套接字服务器)应用程序,该应用程序依赖于一个通用数据结构(即字典 vs 数据库)来维护应用程序范围的状态信息(例如连接的用户),其中 50% 的访问是读取,大约 50 % 的访问是更新/删除/插入,在我看来字典更好。原因如下:

1) 要使字典对并发访问是线程安全的,必须使用锁定机制。 lock() 将锁定整个字典,并且一次只允许一个线程访问数据结构。即使使用 readerWriterLockSlim 也会在提升到 writeLock 时锁定整个字典。
2) 数据库在更新/删除/插入主键时提供行级锁定的好处。
3) 字典在内存中(更快),而数据库连接使用套接字(更慢)

所以问题是,关系数据库继承的行级锁定特性是否比内存中字典访问的好处更重要?

【问题讨论】:

  • 这个项目有多大?有多少行和表?
  • 在任何给定时间大约有 50 个并发用户都在以大约每秒一次的速率发送状态信息。

标签: c# database sockets dictionary


【解决方案1】:

这是个好问题,保罗。行级锁定功能胜过内存中字典访问的好处。与内存字典对象相比,关系数据库的许多附加功能允许其广泛使用。如果您想创建一个内存表以使用 MySQL 更快地访问数据,您可以使用MEMORY storage engine

例如,从索引的基于日期的列中仅搜索基于日期的信息可以相当容易和快速。除此之外,关系数据库(取决于您使用的数据库)允许通过角色、用户、商业智能等来保证安全性。在字典对象上,您可以构建许多流行数据库中随时可用的所有功能。

一个经过良好调整的数据库可以处理数以千计的并发请求,多线程和不同的应用程序可以从中受益。所以在推出你自己的之前,我建议使用关系数据库引擎。与往常一样,您的里程可能会根据您希望解决的问题的复杂程度而有所不同。

【讨论】:

    猜你喜欢
    • 2014-06-24
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    相关资源
    最近更新 更多