redis介绍

redis安装
"""
1、官网下载:安装包或是绿色面安装
2、安装并配置环境变量(安装过程中复选框全部选择就默认配置环境了)
"""
redis VS mysql
"""
redis: 内存数据库(读写快)、非关系型(操作数据方便、数据固定)
mysql: 硬盘数据库(数据持久化)、关系型(操作数据间关系、可以不同组合)

大量访问的临时数据,才有redis数据库更优
"""
redis VS memcache
"""
redis: 操作字符串、列表、字典、无序集合、有序集合 | 支持数据持久化(数据丢失可以找回(默认持久化,主动持久化save)、可以将数据同步给mysql) | 高并发支持
memcache: 操作字符串 | 不支持数据持久化 | 并发量小
"""

Redis操作

启动服务
"""
前提:前往一个方便管理redis持久化文件的逻辑再启动服务:dump.rdb(cd 一个路径)
1)前台启动服务
>: redis-server
2)后台启动服务
(在redis文件夹中可以看到redis-server.exe应用,在dos执行的命令就能启动这个应用)
>: redis-server --service-start
3)自定义配置文件启动服务
(在redis文件夹中复制粘贴redis.windows.conf文件重命名为redis.conf文件)
>: redis-server 自定义配置文件的绝对路径(拖拽文件到dos命令框中)
>: redis-server --service-start 配置文件的绝对路径
eg>: redis-server --service-start D:/redis/redis.conf
"""
切换端口号
自定义端口之间切换:
redis-server --port 6380
密码管理
"""
1)提倡在配置文件中配置,采用配置文件启动
requirepass 密码

2)当服务启动后,并且连入数据库,可以再改当前服务的密码(服务重启,密码重置)
config set requirepass 新密码

3)连入数据库,查看当前服务密码密码
config get requirepass
"""
连接数据库
"""
1)默认连接:-h默认127.0.0.1(ip地址),-p默认6379(端口),-n默认0(数据库),-a默认无(密码)
>: redis-cli

2)完整连接:
>: redis-cli -h ip地址 -p 端口号 -n 数据库编号 -a 密码

3)先连接,后输入密码
>: redis-cli -h ip地址 -p 端口号 -n 数据库编号
>: auth 密码
"""
关闭服务
"""
1)在没有连接进数据库时执行
>: redis-cli shutdown

2)连接进数据库后执行
>: shutdown
"""

会在用户(计算机名字)文件下面产生一个dump.rdb
利用了缓存机制,支持数据持久化(数据丢失可以找回、可以将数据同步给mysql)
删除用户下面的那个文件
再次启动服务,在内存中执行命令,还是有set设置的缓存值的(server是服务,redis-cli是内存)
服务如果死掉了,完成序列化默认,一种是手动save保存
切换数据库
"""
1)在连入数据库后执行
>: select 数据库编号
"""
数据持久化
"""
1)配置文件默认配置
save 900 1  # 超过900秒有1个键值对操作,会自动调用save完成数据持久化
save 300 10  # 超过300秒有10个键值对操作,会自动调用save完成数据持久化
save 60 10000  # 超过60秒有10000个键值对操作,会自动调用save完成数据持久化

2)安全机制
# 当redis服务不可控宕机,会默认调用一下save完成数据持久化

3)主动持久化
>: save  # 连入数据库时,主动调用save完成数据持久化

注:数据持久化默认保存文件 dump.rdb,保存路径默认为启动redis服务的当前路径
"""

Redis数据类型

"""
数据操作:字符串、列表、哈希(字典)、无序集合、有序(排序)集合
	有序集合:游戏排行榜
	
字符串:
	set key value(设置指定key值)
	get key(获取指定key值)
	getrange key start end(返回key中字符串的子字符)
	getset key value(将给定key的值设定为value,并返回key的旧值(old value))
	getbit key offset (对key所存储的字符串值,获取指定偏移上的位(bit))
	mget key1 [key2...] (获取所有(一个或多个)给定key值)
	setbit key offset value (对key所存储的字符串值,设置或清除指定偏移量上的位(bit))
	setex key seconds value (将值value关联到key,并将key的过期时间设定为seconds(以秒为单位))
	setnx key value(只有在key不存在时设置key的值)
	setrange key offset value(用value参数覆写给定key所存储的字符串值,从偏移量offset开始)
	strlen key(返回key所存储的字符串值的长度)
	mset key value [key value...](同时设置一个或多个key-value对)
	msetnx key value [key value...](同时设置一个或多个key-value对,当且仅当所有给定 key 都不存在。)
	mset k1 v1 k2 v2 ...
	mget k1 k2 ...
	setex key exp value()
	incrby key increment(将key 所储存的值加上给定的浮点增量值(increment) 。)
	
列表:
	rpush key value1 value2 ...
	lpush key value1 value2 ...
	lrange key bindex eindex
	lindex key index
	lpop key | rpop key
	linsert key before|after old_value new_value
	
哈希:
	hset key field value
	hget key field
	hmset key field1 value1 field2 value2 ...
	hmget key field1 field2
	hkeys key
	hvals key
	hdel key field
	
集合:
	sadd key member1 member2 ...
	sdiff key1 key2 ...
	sdiffstore newkey key1 key2 ...
	sinter key1 key2 ...
	sunion key1 key2 ...
	smembers key
	spop key
	
有序集合:
	zadd key grade1 member1 grade2 member2 ...
	zincrby key grade member
	zrange key start end
	zrevrange key start end
"""

python使用redis

依赖
>: pip3 install redis
直接使用
import redis
r = redis.Redis(host='127.0.0.1', port=6379, db=1, password=None, decode_responses=True)
连接池使用
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=1, max_connections=100, password=None, decode_responses=True)
r = redis.Redis(connection_pool=pool)
Django项目中为什么使用Redis
Django中虽然自带管理缓存的cache模块,但是,cache管理的是Django项目的缓存,当Django项目程序关闭后,该缓存也会自动销毁,所以我们需要用Redis来当做Django的缓存数据库。让cache管理Redis数据库。这样就算是Django项目程序关闭,缓存中的数据依然存在。
Redis数据库只能存储字符串、数字和二进制类型的数据,对于其他的python中的对象,不能直接存储。需要利用Django自带的cache来处理,达到存储复杂对象的目的。
缓存使用:要额外安装 django-redis
# 1.将缓存存储位置配置到redis中:settings.py
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
            "DECODE_RESPONSES": True,
            "PSAAWORD": "",
        }
    }
}

# 2.操作cache模块直接操作缓存:views.py
from django.core.cache import cache  # 结合配置文件实现插拔式
# 存放token,可以直接设置过期时间
cache.set('token', 'header.payload.signature', 300)
# 取出token
token = cache.get('token')

接口缓存

什么是接口缓存
1. 后台接口是提供数据库数据的,IO操作慢,可以将数据存储在缓存中,接口数据从缓存中调
2. 一般将大量访问(数据时效性要求不是很苛刻)的接口建立缓存
3. 接口缓存思想:数据先走缓存,有直接返回,没有走数据库(同步到缓存)
接口缓存实例
# Django项目中网站主页的轮播图展示的后端业务逻辑

from rest_framework.viewsets import GenericViewSet
from rest_framework import mixins
from django.conf import settings
from utils.response import APIResponse
from . import models, serializers
from rest_framework.response import Response
from django.core.cache import cache
class BannerListViewSet(mixins.ListModelMixin, GenericViewSet):
    queryset = models.Banner.objects.filter(is_delete=False, is_show=True).order_by('-orders').all()[:settings.BANNER_COUNT]
    serializer_class = serializers.BannerModelSerializer

    # 自定义响应结果的格式
    # def list(self, request, *args, **kwargs):
    #     response = super().list(request, *args, **kwargs)
    #     return APIResponse(results=response.data)

    # 接口缓存
    def list(self, request, *args, **kwargs):
        data = cache.get('banner_cache')

        if not data:
            print('走了数据库')
            response = super().list(request, *args, **kwargs)
            cache.set('banner_cache', response.data)  # 不设置过期时间,缓存的更新在后台异步更新(celery异步框架)
            return response

        return Response(data)