redis
redis安装
1、官网下载:安装包或是绿色面安装
2、安装并配置环境变量
redis VS mysql
redis: 内存数据库(读写快)、非关系型(操作数据方便、数据固定)
mysql: 硬盘数据库(数据持久化)、关系型(操作数据间关系、可以不同组合)
大量访问的临时数据,才有redis数据库更优
redis VS memcache
redis: 操作字符串、列表、字典、无序集合、有序集合 | 支持数据持久化(数据丢失可以找回(默认持久化,主动持久化save)、可以将数据同步给mysql) | 高并发支持
memcache: 操作字符串 | 不支持数据持久化 | 并发量小
Redis操作
启动服务
前提:前往一个方便管理redis持久化文件的逻辑再启动服务:dump.rdb
1)前台启动服务
>: redis-server
2)后台启动服务
>: redis-server --service-start
3)配置文件启动服务
>: redis-server 配置文件的绝对路径
>: redis-server --service-start 配置文件的绝对路径
eg>: redis-server --service-start D:/redis/redis.conf
密码管理
1)提倡在配置文件中配置,采用配置文件启动
requirepass 密码
2)当服务启动后,并且连入数据库,可以再改当前服务的密码(服务重启,密码重置)
config set requirepass 新密码
3)连入数据库,查看当前服务密码密码
config get requirepass
连接数据库
1)默认连接:-h默认127.0.0.1,-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
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数据类型
https://www.runoob.com/redis/redis-tutorial.html
数据操作:字符串、列表、哈希(字典)、无序集合、有序(排序)集合
有序集合:游戏排行榜
字符串:
set key value
get key
mset k1 v1 k2 v2 ...
mget k1 k2 ...
setex key exp value
incrby 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
pip 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)
# 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')
接口缓存
后台接口是提供数据库数据的,IO操作慢,可以将数据存储在缓存中,接口数据从缓存中调
一般将大量访问(数据时效性要求不是很苛刻)的接口建立缓存
接口缓存思想:数据先走缓存,有直接返回,没有走数据库(同步到缓存)
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)