Redisに関するいくつかのピット


文書ディレクトリ

  • Redis
  • #1環境
  • #2で発生した問題
  • #2.1 redis djangoプロジェクトにおけるバージョン問題
  • #2.2不明なエラー
  • #2.3不明エラー
  • #2.4 redis.confは有効ではありません
  • Redis


    #1環境

    Python3.7
    django2.0.7
    

    #2で発生した問題


    2.1 redisのdjangoプロジェクトでのバージョンの問題


    誤報
    Invalid input of type: 'CacheKey'. Convert to a byte, string or number first.
    

    の原因となる
    redisのバージョンが高すぎる
    現在のredis==3.2.1
    解決する
    方法1:redisバージョンを下げる
    pip3 install redis==2.10.6
    

    方法2:redisを書き換える
    プロジェクトではredis=3.0バージョンを使用する必要がある場合があります.たとえば、私のプロジェクトではcelery 4.3 redis 3を使用する必要があります.0以上のバージョンなので、redisをダウングレードすることはできません.redisのみを書き換えることができます.
  • まず、djangoのsettings.pyのCACHESは
  • を削除する必要があります
    # 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}  #      
    #         }
    #     }
    # }
    
  • redisを構成する必要がある場合は、settingsで自分で設定することができます.pyで定義され、私の構成は以下のように(任意の名前で)、構成を記入せず、デフォルトは127.0.0.1:6379/0
  • に保存されます.
    MY_CACHES_3 = {
        "HOST":"127.0.0.1",
        "PORT":6379,
        "DB":0
    }
    
  • 新規ファイル(任意の名前)

  • from redis import Redis
    from django.conf import settings
    
    class MyDjangoRedis3(Redis):
    
        def get(self, name):
            """
              get()  ,  Redis   get()         ,     str     
            :param name:  
            :return:  (str)
            """
            value = self.execute_command('GET', name)
    
            if not value:
                return None
    
            return str(value,encoding="utf8")
    
    
    redis3 = MyDjangoRedis3(
        host=settings.MY_CACHES_3["HOST"],
        port=settings.MY_CACHES_3["PORT"],
        db=settings.MY_CACHES_3["DB"],
    )
    
    # host = 'localhost', port = 6379,
    # db = 0, password = None, socket_timeout = None,
    # socket_connect_timeout = None,
    # socket_keepalive = None, socket_keepalive_options = None,
    # connection_pool = None, unix_socket_path = None,
    # encoding = 'utf-8', encoding_errors = 'strict',
    # charset = None, errors = None,
    # decode_responses = False, retry_on_timeout = False,
    # ssl = False, ssl_keyfile = None, ssl_certfile = None,
    # ssl_cert_reqs = 'required', ssl_ca_certs = None,
    # max_connections = None
    
  • を使用
    from xxx.xxx.xxx import redis3 #            , redis3 = MyDjangoRedis3()  redis3
    
      : redis3.set("key","value") #          cache.set()
      : redis3.get("key") #          cache.get()
    
    

    #2.2不明なエラー


    誤報
    zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
    
    

    の原因となる
    不明
    解決する
    make MALLOC=libc
    

    #2.3不明なエラー


    誤報
      make test 
      You need tcl 8.5 or newer in order to run the Redis test
    
    

    の原因となる
    不明
    解決する
    yum install tcl
    

    #2.4 redis.confが有効でない


    に質問
    配置redis.conf redisを再起動すると、いつも有効になりません.
    解決する
    redis.confドキュメントの最初の行の説明
    # Redis configuration file example.
    #
    # Note that in order to read the configuration file, Redis must be
    # started with the file path as first argument:
    #
    # ./redis-server /path/to/redis.conf
    

    開始./redis-serverの場合、redisを持参する必要があります.conf
    #   redis
    ./redis-server /path/to/redis.conf #       redis.conf