一.基础信息
1.安装
参考官网:https://redis.io/download
2.介绍
参考:https://zhuanlan.zhihu.com/p/81195864
Redis是一种运行在内存中,速度极快的NoSql数据库,支持键到五种数据类型的映射。
3.特点
redis是单线程操作(因为Redis的瓶颈不是cpu的运行速度,而往往是网络带宽和机器的内存大小,使用单线程即可满足并发需求),避免了频繁的上下文切换
采用了多路复用io阻塞机制
数据结构简单,操作节省时间
运行在内存中,速度极快
4.redis值的5种数据类型
参考:https://www.cnblogs.com/logicalsky/p/5946647.html
String 整数,浮点数或者字符串
Hash 散列表,python种的字典
Set 集合
Zset 有序集合
List 列表
5.持久化
参考:https://zhuanlan.zhihu.com/p/55596825
https://zhuanlan.zhihu.com/p/68402040
由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。
redis提供两种持久化方式:
- RDB持久化
在指定时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
redis宕机后,会有部分数据丢失(间隔时间保存),适用绝大部分场景 - AOF持久化
append only file:以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式追加记录,可以打开文件看到详细的操作记录。
6.redis 的雪崩、穿透和击穿
参考:https://zhuanlan.zhihu.com/p/74880843
二.其他
2.管道pipeline
与redis数据库的连接类似TCP连接,为优化数据库性能,可以将多个没有依赖关系的读写一起操作,类似mysql的事务
import redis
# 连接redis,第三个参数默认为False,表示读写数据为bytes类型,True则为字符串类型
r = redis.Redis(host='localhost',port=6379,decode_responses=True)
r.set('apple','123')
# 开启管道
pipe = r.pipeline(transaction=True)
pipe.set('banana','456')
pipe.set('orange','789')
pipe.set('apple','111')
print(r.get('apple')) #123,数值未改变
print(r.get('banaban')) #None
pipe.execute()
print(r.get('apple')) #111
3.连接池pool:节省资源,共用连接池中的连接,减少多次连接的损耗
import redis
# 创建连接池
pool = redis.ConnectionPool(host='localhost',port=6379,decode_responses=True)
# 从连接池中获取连接
r1 = redis.Redis(connection_pool=pool)
r2 = redis.Redis(connection_pool=pool)
r1.set('apple','123')
r2.set('banana','456')
print(r1.get('apple'))
print(r2.get('banana'))
print(r1.client_list()) #两个连接的id相同
print(r2.client_list())
4.django中设置页面缓存,规定时间内返回缓存中的页面,减少服务器压力
应用场景:短时间内出现大量重复的访问,如抢火车票,在线商城秒杀活动
1.安装模块:
sudo pip3 install django-redis
2.修改配置文件:
CACHES = {
'default':{
'BACKEND':'django_redis.cache.RedisCache',
'LOCATION':'127.0.0.1:6379',
"OPTIONS":{
"CLIENT_CLASS":"django_redis.client.DefaultClient",
},
}
}
REDIS_TIME = 7*24*60*60
CUBES_REDIS_TIMEOUT = 60*60
NEVER_REDIS_TIMEOUT = 365*24*60*60
3.实现页面缓存
from django.shortcuts import render
from datetime import datetime
from django.views.decorators.cache import cache_page
# 设置缓存时间10s,10秒内访问此视图则从缓存中读取页面,返回响应码200
@cache_page(10)
def redis_(request):
real_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return render(request, 'redis_test.html', {'real_time':real_time})
5.向redis中存取数据
from django.shortcuts import render,HttpResponse
from django.core.cache import cache
from django.conf import settings
# Create your views here.
def redis_data(request):
return render(request, 'redis_data.html')
def write_to_redis(request):
key = request.GET.get('key')
value = request.GET.get('value')
#存数据:键、值、保存时间
cache.set(key,value,settings.NEVER_REDIS_TIMEOUT)
return render(request,'redis_data.html')
def read_from_redis(request):
key = request.GET.get('key')
#key不存在则返回None
value = cache.get(key)
return HttpResponse(value)
6.连接远程redis数据库
参考:
https://www.cnblogs.com/wangwust/p/9765674.html
https://www.cnblogs.com/chinaifae/articles/10329475.html
- 开启远程访问权限,注释掉redis配置文件中的:bind 127.0.0.1
sudo vi /etc/redis/redis.conf
#注释bind
#bind 127.0.0.1 - 远程连接redis会有个自我保护机制,拒绝访问
临时关闭:启动命令改为:redis-server --protected-mode no
或redis本地客户端中输入命令:CONFIG SET protected-mode no
永久关闭:修改配置文件 - 关闭redis服务
redis-cli (-h 127.0.0.1 -p 6379) shutdown - 重启redis服务
sudo service redis-server restart