django - 为什么 Postgres 查询比 Redis 查询快?

标签 django postgresql time redis

我正在学习 Redis,以及它作为内存数据库的速度有多快。在我的 Django 应用程序中,我有一个包含大约 1500 行的 Postgres 表。该模型只有两个字段“名称”和“发生次数”。与我认为存储在磁盘上的本地数据库相比,为了测试查询内存不足的对象要快多少,我创建了两个查询

1) Simple order by query using Django objects manager

2) ZRANGE command on Redis server, getting same items back from a Redis sorted set.

在进行这两个查询之后,我发现从 Redis 排序集中获取相同数量的项目所花费的时间是进行 Postgres 查询所花费时间的 250 倍。这是为什么?

脚本

import json
import redis
import datetime

from django.http import HttpResponse
from django.shortcuts import render

from wikipedia.models import Word

redis_server = redis.Redis("localhost")

def get_word_results(request):
    now = datetime.datetime.now()
    words = Word.objects.all().order_by('-occurrence')
    after = datetime.datetime.now()

    diff = (after - now).total_seconds() * 1000
    print(diff)

    rnow = datetime.datetime.now()
    words_redis = redis_server.zrange(name='myzset', start=0, end=-1, withscores=True)
    rafter = datetime.datetime.now()

    diff2 = (rafter - rnow).total_seconds() * 1000
    print(diff2)

结果

0.199
48.048

最佳答案

请记住,redis 不是通用数据库。在某些查询或使用中,老式的 rdbms 是可行的方法,而在某些情况下,redis 优于 rdbms。 Redis 可让您以闪电般的速度读取和写入键值存储数据。即,“对于给定的单词,我想检索出现的次数”,而不是“我想按出现次数对所有单词进行排序。”

所以,例如:

def prep_redis():
    for word in Word.objects.all():
        redis_server.set(word.name, word.occurrence)

def test_lookup_postgres(name):
    # start = datetime.datetime.now()
    p = Word.objects.get(name=name)
    # end = datetime.datetime.now()
    # diff = end - start
    # print('postgres took %s ms' % (diff * 1000,))
    return p.occurrence

def test_lookup_redis(name):
    # start = datetime.datetime.now()
    value = redis_server.get(name)
    # end = datetime.datetime.now()
    # diff = end - start
    # print('redis took %s ms' % (diff * 1000,))
    return value

def main():
    from timeit import Timer
    prep_redis()
    r_timer = Timer(lambda: test_lookup_redis('sesame'))
    p_timer = Timer(lambda: test_lookup_postgres('sesame'))
    print('For 1000 runs, redis: %s' % (r_timer.timeit(number=1000),))
    print('For 1000 runs, postgres: %s' % (p_timer.timeit(number=1000),))

这里我们期望 redis 比 postgres 更快。

相比之下,redis 对于较大的数据结构来说非常慢,因为序列化和反序列化数据所花费的时间超过了 I/O 成本:

Speed of RAM and memory bandwidth seem less critical for global performance especially for small objects. For large objects (>10 KB), it may become noticeable though. Usually, it is not really cost-effective to buy expensive fast memory modules to optimize Redis. Redis benchmarks

关于django - 为什么 Postgres 查询比 Redis 查询快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49222470/

相关文章:

django - Django 中的并发负载处理

mysql - 执行 SELECT MAX(id) 等查找最后插入的行在概念上是否正确?

Django Postgresql 在迁移时删除列默认值

php - 如何测量两次点击按钮之间的时间?

node.js - Node 中的 npm 就像 Django 中的 virtualenv 一样吗?

Python signxml - 仅使用公钥/私钥对 XML 文档进行签名

mysql - 为什么相同的 MySQL 查询对于不同的 ID 会花费更长的时间?

MYSQL 按时间上午/下午排序

python - 在 Django 测试中匹配查询集

sql - Postgres Array[VarChar] 大写?