TJB*_*TJB 3 django postgresql time redis
我正在了解 Redis,以及它作为内存数据库的速度有多快。在我的 Django 应用程序中,我有一个包含大约 1500 行的 Postgres 表。该模型只有两个字段“名称”和“发生”。为了测试查询内存不足的对象与从本地数据库(我相信存储在磁盘上)相比,查询速度要快多少,我创建了两个查询
1) 使用 Django 对象管理器通过查询进行简单排序
2) Redis 服务器上的 ZRANGE 命令,从 Redis 排序集中获取相同的项目。
进行两次查询后,我发现从 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)
Run Code Online (Sandbox Code Playgroud)
结果
0.199
48.048
Run Code Online (Sandbox Code Playgroud)
请记住,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),))
Run Code Online (Sandbox Code Playgroud)
这里我们预计 Redis 比 postgres 更快。
相比之下,Redis 在处理较大的数据结构时速度非常慢,因为序列化和反序列化数据所需的时间超过了 I/O 成本:
RAM 和内存带宽的速度对于全局性能似乎不太重要,尤其是对于小对象。对于大对象(>10 KB),它可能会变得明显。通常,购买昂贵的快速内存模块来优化 Redis 并不划算。 Redis 基准测试
| 归档时间: |
|
| 查看次数: |
3695 次 |
| 最近记录: |