1、简介
Redis 是一个 key-value 存储系统,是跨平台的非关系型数据库
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型
2、应用
当需要频繁地读取数据库中的某条记录时,可将其放入 Redis 缓存中,减少数据库的链接读取操作
3、实战
database_operation(project)
models.py
from django.db import models
# Create your models here.
class PersonModel(models.Model):
id = models.CharField(db_column='id', primary_key=True, max_length=255)
name = models.CharField(db_column='name', max_length=255)
description = models.CharField(db_column='description', max_length=1000)
age = models.CharField(db_column='age', max_length=255)
goodtotal = models.IntegerField(db_column='goodtotal', default=0)
moneytotal = models.FloatField(db_column='moneytotal', default=0.0)
goodused = models.IntegerField(db_column='goodused', default=0)
moneyused = models.FloatField(db_column='moneyused', default=0.0)
urls.py
from django.conf.urls import url
from base_operation.views import Tenant
urlpatterns = [
url(r'^person$', Tenant.as_view()),
]
views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from base_operation.models import PersonModel
import redis
# Create your views here.
class Tenant(APIView):
def __init__(self):
self.pool = redis.ConnectionPool(host='127.0.0.1')
self.redis = redis.Redis(connection_pool=self.pool)
def get(self, request_paras, *args, **kwargs):
# person_data = {
# "id": '001',
# "name": 'su',
# "description": 'first person',
# "age": '18',
# "goodtotal": 100,
# "moneytotal": 100.0,
# "goodused": 20,
# "moneyused": 10.0
# }
# PersonModel.objects.create(**person_data)
info_person = PersonModel.objects.filter(id='001').values('name').first()
print(info_person)
# name = self.redis.get('name')
# print('name in redis is %s' % name)
# if name:
# info_person = name
# else:
# info_person = PersonModel.objects.filter(id='001').values('name').first()
# # print(info_tenant, type(info_tenant))
# self.redis.set('name', info_person['name'])
return Response(status=status.HTTP_200_OK, data=info_person)
tests.py
from django.test import TestCase
from django.test import Client
import time
from base_operation.models import PersonModel
# Create your tests here.
class RedisTest(TestCase):
def setUp(self):
self.base_url = '127.0.0.1:8000'
self.client = Client()
self.exist_person0_data = {
"id": '001',
"name": 'su',
"description": 'first person',
"age": '18',
"goodtotal": 100,
"moneytotal": 100.0,
"goodused": 20,
"moneyused": 10.0
}
PersonModel.objects.create(**self.exist_person0_data)
def tearDown(self):
PersonModel.objects.all().delete()
def test_get_10000_from_database(self):
url = '/person'
start_time = time.time()
for index in range(10000):
response = self.client.get(url)
end_time = time.time()
print('共耗时:%s' % (end_time - start_time))
# redis: 共耗时:20.29421329498291
# no redis: 共耗时:19.77984619140625
print(response.status_code, response.data)
调用接口读取数据库中的数据
CallPerson(project)
urls.py
from django.conf.urls import url
from cache.views import PersonCall
urlpatterns = [
url(r'^person$', PersonCall.as_view()),
]
views.py
from rest_framework.views import APIView
import requests
from django.shortcuts import HttpResponse
import time
# Create your views here.
class PersonCall(APIView):
@staticmethod
def get(request_paras, *args, **kwargs):
start_time = time.time()
for index in range(1000):
response = requests.get('http://10.56.131.73:8088/person', verify=False)
status = response.status_code
print(index, status, type(status))
data = response
print(data, type(data))
end_time = time.time()
print("执行用时:%s" % (end_time - start_time))
return HttpResponse("执行用时:%s" % (end_time - start_time))
# redis: 执行用时:6.76716637611389
# no redis: 执行用时:9.44646430015564