欢迎来到我的博客!

django博客开发:redis的安装以及用django-redis作缓存

Django Aaron 1 年,6 月 3484 26评论

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可执行文件的路径,选择默认的话就按回车,如果你想自定义的话,就在选项后写自定义的路径。

redis服务器配置

完成上面的选项后,按回车就会安装配置,同时会在 /etc/init.d 下添加自启动配置文件 redis_6379

显示Success!后,就会启动redis,打开刚刚设置好的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

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 # 查看服务状态

查看supervisor服务状态

sudo supervisorctl status # 查看进程状态

查看supervisor进程状态

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将数据进行了序列化。

 

评论 4人参与 | 26条评论