zoukankan      html  css  js  c++  java
  • djanog整合redis

    转处:https://blog.csdn.net/weixin_33949359/article/details/93180705

    Redis安装

    1、下载,解压,安装

    1.  
      [root@incisor ~]# yum install -y gcc gcc-c++ make cmake
    2.  
      [root@incisor ~]# wget http://download.redis.io/releases/redis-5.0.3.tar.gz
    3.  
      [root@incisor ~]# tar -zxvf redis-5.0.3.tar.gz
    4.  
      [root@incisor ~]# cd redis-5.0.3
    5.  
      [root@incisor redis-5.0.3]# make PREFIX=/usr/local/redis install
    6.  
      复制代码

    2、配置Redis启动脚本
    1)将源码包的utils/redis_init_script拷贝到/etc/init.d/下,重命名为redis

    1.  
      [root@incisor redis-5.0.3]# cp -p utils/redis_init_script /etc/init.d/redis
    2.  
      [root@incisor redis-5.0.3]# vi /etc/init.d/redis
    3.  
      复制代码

    修改内容:

    1.  
      REDISPORT=6379 #定义了redis的监听端口
    2.  
      EXEC=/usr/local/redis/bin/redis-server # redis默认的server执行路径
    3.  
      CLIEXEC=/usr/local/redis/bin/redis-cli # redis-cli启动路径
    4.  
      PIDFILE=/var/run/redis_${REDISPORT}.pid
    5.  
       
    6.  
      #redis的配置文件, 所以我们需要在/etc目录下创建redis目录用来保存redis的配置文件,并将配置文件拷贝到该目录下
    7.  
      CONF="/etc/redis/redis.conf" # redis的配置文件
    8.  
      复制代码

    2)将源码包下的redis.conf拷贝到/etc/redis/下

    1.  
      [root@incisor redis-5.0.3]# mkdir /etc/redis
    2.  
      [root@incisor redis-5.0.3]# cp -p redis.conf /etc/redis/
    3.  
      [root@incisor redis-5.0.3]# vi /etc/redis/redis.conf
    4.  
      复制代码

    修改内容:

    1.  
      bind 127.0.0.1 # 如果是远程访问,修改为公网IP
    2.  
      daemonize yes # 修改为yes,以守护进程的方式运行
    3.  
      复制代码

    基本设置只有这两样,但是我现在只想把Redis做为缓存,不需要持久化功能,所以我还修改一些别的配置,以下的设置按需设置:

    1.  
      loglevel notice # 日志等级
    2.  
      logfile "/usr/local/redis/log/redis.log" # 日志保存路径
    3.  
       
    4.  
      maxmemory 67108864 # 设置最大占用内存64M,按需设置
    5.  
       
    6.  
      databases 1 # 设置最大数据库数
    7.  
       
    8.  
      requirepass 12345678 # 设置密码
    9.  
       
    10.  
      #save 900 1
    11.  
      #save 300 10
    12.  
      #save 60 10000
    13.  
      save "" # 关闭RDB持久化
    14.  
       
    15.  
      appendonly no # 关闭AOF持久化
    16.  
      复制代码

    创建日志目录/usr/local/redis/log。

    3、加入系统服务

    1.  
      [root@incisor redis]# cd /etc/init.d/
    2.  
      [root@incisor init.d]# chkconfig --add redis
    3.  
      [root@incisor init.d]# chkconfig --level 235 redis on
    4.  
      [root@incisor init.d]# chkconfig --list redis #
    5.  
      redis 0:关闭 1:关闭 2:启用 3:启用 4:关闭 5:启用 6:关闭
    6.  
      复制代码

    chkconfig删除服务是:chkconfig --del [name],例如chkconfig --del redis。

    4、启动,停止Redis

    1.  
      [root@incisor init.d]# service redis start
    2.  
      [root@incisor init.d]# service redis stop
    3.  
      复制代码

    如果/etc/redis/redis.conf中的bind设置的是公网IP,使用service redis stop是关闭不了的,这个时候我都是查出进程号,直接kill掉。

    因为stop命令执行的是/etc/init.d/redis中的stop函数。

    其中

    1.  
      $CLIEXEC -p $REDISPORT shutdown
    2.  
      复制代码

    是停止Redis任务,而$CLIEXEC即redis-cli命令,忽略-h参数的话,默认是连接127.0.0.1,所以如果/etc/redis/redis.conf中的bind不是127.0.0.1,那么就需要修改/etc/init.d/redis文件了。 修改如下:

    1.  
      IP=127.0.0.1 # /etc/redis/redis.conf中的bind参数值
    2.  
      REDISPORT=6379
    3.  
      EXEC=/usr/local/redis/bin/redis-server
    4.  
      CLIEXEC=/usr/local/redis/bin/redis-cli
    5.  
       
    6.  
      ......省略
    7.  
       
    8.  
      $CLIEXEC -h $IP -p $REDISPORT shutdown # 加上-h $IP即可
    9.  
      复制代码

    但是我一般自己测试用的话,都懒得改,直接kill掉。

    5、通过命令行客户端访问

    1.  
      [root@incisor ~]# /usr/local/redis/bin/redis-cli -h host -p port -a password
    2.  
      复制代码

    Python连接Redis

    1、安装redis库:pip3 install redis

    redis提供两个类Redis和StrictRedis用于实现Redis服务器的命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。所以常用Redis类。

    redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量。

    2、连接Redis服务器

    1.  
      import redis
    2.  
       
    3.  
      r = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True)
    4.  
      r.set('skey', 'svalue')
    5.  
      print(r['skey'])
    6.  
      print(r.get('skey'))
    7.  
      print(type(r.get('skey')))
    8.  
      复制代码

    需要加上decode_responses=True, 这样写入的value是str类型,为False的话写入的是字节类型。

    3、连接池

    1.  
      import redis
    2.  
       
    3.  
      pool = redis.ConnectionPool(max_connections=10, host='127.0.0.1', port=6379, decode_responses=True)
    4.  
      r = redis.Redis(connection_pool=pool)
    5.  
      r.set('skey', 'svalue')
    6.  
      print(r['skey'])
    7.  
      print(id(r))
    8.  
      复制代码

    参数max_connections:设置最大连接数
    这里有一篇文档,是分析redis.ConnectionPool()连接池源码的,感兴趣的话,可以看看:www.u3v3.com/ar/1346。

    4、将连接池设置成单例模式
    pool.py文件

    1.  
      import redis
    2.  
       
    3.  
      pool = redis.ConnectionPool(max_connections=10, host='127.0.0.1', port=6379, decode_responses=True)
    4.  
      复制代码

    然后,其他文件,导入pool变量,这样就可以实现一个单例的连接池了。
    test.py文件

    1.  
      import redis
    2.  
      from pool import pool
    3.  
       
    4.  
      r = redis.Redis(connection_pool=pool)
    5.  
      r.set('skey', 'svalue')
    6.  
      print(r['skey'])
    7.  
      复制代码

    具体的Redis的数据类型,以及相应的方法,自行查看。

    Django中使用Redis,做为关系型数据库的缓存

    1、安装django-redis: pip3 install django-redis

    2、设置settings.py文件 添加

    1.  
      CACHES = {
    2.  
      "default": {
    3.  
      "BACKEND": "django_redis.cache.RedisCache",
    4.  
      "LOCATION": "redis://127.0.0.1:6379/0",
    5.  
      "OPTIONS": {
    6.  
      "CLIENT_CLASS": "django_redis.client.DefaultClient",
    7.  
      "CONNECTION_POOL_KWARGS": {"max_connections": 10, "decode_responses": True},
    8.  
      # "PASSWORD": ""
    9.  
      }
    10.  
      }
    11.  
      }
    12.  
      复制代码

    其中,"LOCATION"表示连接字符串,有三种方式设置:
    redis://[:password]@localhost:6379/0
    rediss://[:password]@localhost:6379/0
    unix://[:password]@/path/to/spcket.sock?db=0
    但也有文档说,某些环境下连接密码放在url是不安全的,这时你可以选择忽略密码或者使用"OPTIONS"设置,所以按需选择吧。

    "CONNECTION_POOL_KWARGS": 连接池设置
    "max_connections": 最大连接数
    "decode_responses": 以字符串的形式写入Redis,为False的话写入字节类型。

    django-redis使用redis-py的连接池接口,redis-py默认不会关闭连接,尽可能重用连接, redis-py实际就是redis库的Redis中的连接池,上一节中提及,说明连接池原理是一样的。

    3、Redis存取
    有两种方式:

    1)使用django.core.cache.cache类,这个类有巨坑!

    1.  
      from django.core.cache import cache
    2.  
      from django.http import HttpResponse
    3.  
       
    4.  
       
    5.  
      def hello(request):
    6.  
      key = 'skey'
    7.  
      value = 'svalue'
    8.  
      cache.set(key, value)
    9.  
      if key in cache:
    10.  
      return HttpResponse('<h1>{0}: {1}</h1>'.format(key, cache.get(key)))
    11.  
      else:
    12.  
      return HttpResponse('<h1>没有找到</h1>')
    13.  
      复制代码

    这段代码运行前,需要将settings.py文件中CACHES中的decode_responses参数设置为False,具体原因我没深究。

    运行这段代码没任何问题,能写入能读取。但是!!!如果这个key-value值是别的客户端写入的呢?假如我通过redis-cli命令行工具添加了key-value,那通过cache.get(key)是取不到的,当然这段代码添加的skey-svalue在客户端执行get skey也是取不到的。

    来,我们通过命令行工具,查看这段代码添加的key-value,如下:

    1.  
      [root@incisor ~]# /usr/local/redis/bin/redis-cli -h 127.0.0.1 # 127.0.0.1的话,可忽略-h参数
    2.  
      127.0.0.1:6379> keys * # 查看全部的键
    3.  
      1) ":1:skey"
    4.  
      复制代码

    ...原来通过cache.set(key, value),会在key的前面拼接一个字符串":1:",也不知道为啥。所以我说这个cache是隐形巨坑。

    2)通过get_redis_connection()

    1.  
      from django_redis import get_redis_connection
    2.  
      from django.http import HttpResponse
    3.  
       
    4.  
       
    5.  
      def hello(request):
    6.  
      key = 'skey'
    7.  
      value = 'svalue'
    8.  
      conn = get_redis_connection('default')
    9.  
      conn.set(key, value)
    10.  
      if conn.get(key):
    11.  
      return HttpResponse('<h1>{0}: {1}</h1>'.format(key, conn.get(key)))
    12.  
      else:
    13.  
      return HttpResponse('<h1>没有找到</h1>')
    14.  
      复制代码

    执行后,利用redis-cli查看一下key值:

    1.  
      127.0.0.1:6379> keys *
    2.  
      1) "skey"
    3.  
      复制代码

    现在key值不会被拼接字符串了,所以我常用这个函数。

    使用get_redis_connection()最好把settings.py文件中CACHES中的decode_responses参数设置为True, 同时conn = get_redis_connection('default')中 的'default'是settings.py文件中CACHES设置的'default'。

  • 相关阅读:
    linux --- mysql --- max_allowed_packet
    idea 快捷键
    TypedArray和obtainStyledAttributes使用
    ubuntu中怎样添加或删除一个PPA源
    Ubuntu 14.04 用户安装 Cinnamon 2.2.0
    android-pulltorefresh源码解析(1)--PullToRefreshListView的使用
    Android菜单详解(四)——使用上下文菜单ContextMenu
    Android菜单详解(五)——使用XML生成菜单
    Android菜单详解(二)——创建并响应选项菜单
    Android菜单详解(三)——SubMenu和IconMenu
  • 原文地址:https://www.cnblogs.com/linwenbin/p/11485594.html
Copyright © 2011-2022 走看看