redis是一个key-value存储系统,数据缓存在内存中,会周期性的把更新的数据写入磁盘,实现持久化存储。与django默认的缓存相比,重启系统的时候,redis中的数据不会消失。redis的好处还有啥,你去问google吧,反正我是问的百度。下面将介绍一下redis的安装,后台运行,以及django-redis的使用。
安装
windows
redis官方并不支持windows,windows版本的可以去这里现在
https://github.com/MicrosoftArchive/redis/releases 。
安装的时候勾选环境变量。其他的过程就不赘述了。
Ubuntu 16.04
下载最新的redis,解压,安装
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
tar xzf redis-4.0.1.tar.gz
cd redis-4.0.1
make
cd src
sudo make install
make install 会将redis的可执行文件放在 /usr/local/bin 下面
接下来进行redis服务器的配置。
cd ..
cd utils
sudo ./install_server.sh
运行上面的命令后,会弹出一些选项,如下图,分别是运行redis的端口 默认6379,redis的配置文件,redis的log日志,redis存放数据的路径,redis可执行文件的路径,选择默认的话就按回车,如果你想自定义的话,就在选项后写自定义的路径。
完成上面的选项后,按回车就会安装配置,同时会在 /etc/init.d 下添加自启动配置文件 redis_6379
显示Success!后,就会启动redis,打开刚刚设置好的redis日志文件,会有如下信息,代表启动成功
我们会看到信息中还有3个warnning警告,解决方法如下
sudo vim /etc/sysctl.conf
在末尾写入
net.core.somaxconn= 1024
vm.overcommit_memory = 1
保存之后,执行 sudo sysctl -p
然后打开 /etc/rc.local ,在里面写入
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
保存之后重启系统
再次查看redis的日志文件,会发现警告已经消失了,是不是很开心啊。
其他常用命令
# 手动启动redis
/usr/local/bin/redis-server /etc/redis/6379.conf
# 关闭redis
/usr/local/bin/redis-cli shutdown
# redis 交互
/usr/local/bin/redis-cli
完成上述步骤之后,redis就会开始启动,并开启守护进程模式在后台运行(生成的 /etc/redis/6379.conf 中有一句 deamonize yes)。
使用supervisor监控redis进程
supervisor是用Python开发的Linux后台监控利器,目前不支持Python 3。
Ubuntu下安装supervisor
sudo apt-get install supervisor
supervisor的配置文件是放在 /etc/supervisor 目录下的 supervisord.conf ,打开 supervisord.conf ,在其末尾有这样两行代码
[include]
files = /etc/supervisor/conf.d/*.conf
上面两行代码的意思是 include /etc/supervisor/conf.d 路径下的.conf配置文件,因此每个进程的配置文件都可以单独拆分,放在 /etc/supervisor/conf.d 下,比如监控 gunicorn 的配置文件,就创建个 gunicorn.conf ,这里我们要配置监控redis, 在 /etc/supervisor/conf.d 下创建 redis.conf
[program:redis]
# 运行redis
command = /usr/local/bin/redis-server /etc/redis/6379.conf
# 自动启动
autostart = true
# 进程挂掉后自动重启
autorestart = true
# 程序保持运行3秒后,视为成功运行
startsecs = 3
# 无须配置日志log,先前在安装redis时已经配置好了
打开redis的conf文件, /etc/redis/6379.conf ,找到 daemonize yes , 将yes改为no
daemonize no # 关闭守护进程模式
删掉 /etc/init.d 下的文件 redis_6379 , 自动启动supervisor负责即可。
cd /etc/init.d
sudo rm -f redis_6379
更新配置文件,重启系统,使配置生效
sudo supervisorctl update
至此,我们完成了用supervisor监控redis进程。
supervisor其他常用命令
sudo service supervisor status # 查看服务状态
sudo supervisorctl status # 查看进程状态
sudo supervisorctl restart app # 重启某个进程
sudo supervisorctl restart all # 重启所有进程
sudo supervisorctl reload # 重启supervisor
使用 django-redis 作缓存
django支持多种不同的cache backend,默认使用的是localmem,django-redis 是一个使django支持 redis cache的功能组件。
安装
pip install django-redis
在 project/settings.py 设置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
LOCATION的写法是 redis://host:port/db
db是redis的数据库序号,redis默认允许16个数据库,redis默认使用的是0。
测试
通过 python manage.py shell 进入交互命令
>>> from django.core.cache import cache
>>> cache.set('user', 'Aaron', 600) # 缓存有效时间为600秒,即10分钟
True
>>> cache.get('user')
'Aaron'
我们再通过 /usr/local/bin/redis-cli 进入redis的交互命令
127.0.0.1:6379> select 0 # 选择数据库0,默认也是0
OK
127.0.0.1:6379> keys * # 显示所有的key
1) ":1:user" # 刚刚在python shell里设置的key
127.0.0.1:6379> get :1:user # get(key)
"\x80\x04\x95\t\x00\x00\x00\x00\x00\x00\x00\x8c\x05Aaron\x94."
127.0.0.1:6379>
这时你会发现之前在python shell里设置的key跟 redis-cli里显示的key有些不同。具体原因,可以参考这里
用django cache设置的redis key的名字前加的序号有什么意义?
而当我们在redis-cli交互命令窗口里 get key 的时候,返回是bytes类型,这是因为django-redis使用pickle将数据进行了序列化。