R.T
我在比较慢的 CPython 中建立一个一千万的集合用时 1.1s ,做一千万次查找用时 1.4s ,
但使用 redis-benchmark 跑测试却只能达到 12w 每秒的速度。
(测试用机: 2015 高配 Macbook Pro 15 )
所以,对于那些只是单机跑的小应用来说,还有必要使用 Redis 这类的缓存吗?
![]() | 1 messense 2015-09-17 16:33:31 +08:00 ![]() 方便跨进程共享数据。 |
2 maemual 2015-09-17 16:37:38 +08:00 1 、单机跑的小应用本来就是少数 2 、不开持久化的 Redis 又是少数 加上这么些限制条件之后,只能说,嗯,在你的设想下是不需要用 Redis 了。 |
3 wayne712 2015-09-17 16:41:31 +08:00 redis 如果作为缓存使用的话 , 缓存当然还可以设置过期时间了, 而内置数据的话本身并不带这样的功能吧 |
![]() | 4 learnshare 2015-09-17 16:47:34 +08:00 语言无关,可共享 |
![]() | 5 Feiox OP |
![]() | 6 aisk 2015-09-17 16:54:26 +08:00 除了上述需要考虑分布式环境 / 持久化的原因之外,如果直接在内存里保存大量的数据结构,在某些带 GC 的语言里,会导致 GC 速度大大降低。不过也看实现了。 另外如果自己申请大段内存做序列化实现的话,可以避免这个问题,但是实现复杂度会大大增加。 |
![]() | 7 aisk 2015-09-17 16:55:35 +08:00 @Feiox 还要考虑网络开销,这个是大头。另外你用 Python 客户端再往里面添加复杂对象,序列化也是很大的开销。另外 redis 还会帮你压缩内存,这也是开销。 |
8 zts1993 2015-09-17 16:57:59 +08:00 多线程?线程安全么? |
![]() | 9 xiaolee59 2015-09-17 17:00:45 +08:00 高内聚,低耦合,生产环境下服务都是分层的,数据就应该在数据那一层,业务只需要关心逻辑实现,全部用原生数据结构,那么你的服务进程过了,你的数据也就没了?而且百分之百找不回来? |
![]() | 10 ljbha007 2015-09-17 17:14:23 +08:00 大多数情况生产环境都不只一台机器 /一个进程 你内存里的数据结构虽然快 但是没办法横向扩展 没办法分布式同步数据 如果你自己实现的话开发成本会飙升 然而 redis 本来解决了这个问题 为什么不用呢 |
![]() | 12 shiny 2015-09-17 17:42:21 +08:00 这种 benchmark 不能反映生产环境上的真实情况 |
13 assassinpig 2015-09-17 20:47:55 +08:00 万一需要开持久呢? |
![]() | 14 msg7086 2015-09-17 21:06:34 +08:00 只开一个进程一个线程的话,自然不需要开的。 问题是这情况实在太少了。 |
![]() | 15 akira 2015-09-17 21:50:10 +08:00 单机跑的小应用 用内存缓存干嘛,人家本来就不是设计给这个场景用的 |
![]() | 16 adrianzhang 2015-09-17 21:55:12 +08:00 为了分布式。单机小应用用不着。 |
17 llhhss 2015-09-17 23:30:11 +08:00 小应用要不要缓存都得先看看 |
18 chenwen 2015-09-17 23:41:40 +08:00 就算是是单机小应用,用内存缓存,你不用考虑缓存持久化得问题么 |
![]() | 19 zoul 2015-09-17 23:53:14 +08:00 分布式,水平扩展,缓存服务化 |
![]() | 20 gamexg 2015-09-18 07:13:14 +08:00 via Android 即使是 python web 小应用也不会是单进程的啊。 跨进程共享最好上专业缓存。 Redis 对于一些操作可以保证原子。 Python 进程内当然比 Redis 网络通信快。 |
21 nezhazheng 2015-09-18 10:38:16 +08:00 如果你需要缓存的数据非常少,比如小于 50M ,如果你的应用只是单进程,那么肯定是没必要用 Redis 的 |
22 nezhazheng 2015-09-18 10:40:35 +08:00 回答你的另一个问题,速度差异。 进程内的内存读取与网络读取的速度差距比你上面给出的数据要来的大的多。 你可以网上搜一下,有张非常著名的图标注了各种读取的延时。 |