前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一些关于Redis的坑

一些关于Redis的坑

作者头像
Autooooooo
发布2020-11-09 10:40:24
4880
发布2020-11-09 10:40:24
举报
文章被收录于专栏:CoxhuangCoxhuang

Redis

#1 环境

代码语言:javascript
复制
Python3.7
django2.0.7

#2 遇到的问题

#2.1 redis在django项目中版本问题

报错

代码语言:javascript
复制
Invalid input of type: 'CacheKey'. Convert to a byte, string or number first.

原因

redis的版本过高

当前redis==3.2.1

解决

方法一 : 降低redis版本

代码语言:javascript
复制
pip3 install redis==2.10.6

方法二 : 重写redis

有时项目中必须使用redis==3.0版本,例如在我的项目中,celery4.3必须使用redis3.0以上的版本,所以不可能将redis降级,只能重写redis

  • 首先,django中的settings.py中的CACHES必须去掉
代码语言:javascript
复制
# 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
代码语言:javascript
复制
MY_CACHES_3 = {
    "HOST":"127.0.0.1",
    "PORT":6379,
    "DB":0
}
  • 新建文件(任意命名)
代码语言:javascript
复制
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
  • 使用
代码语言:javascript
复制
from xxx.xxx.xxx import redis3 # 找到文件中的实例化对象,即redis3 = MyDjangoRedis3()中的redis3

设置: redis3.set("key","value") # 和之前的调用一样 cache.set()
获取: redis3.get("key") # 和之前的调用一样 cache.get()

#2.2 未知错误

报错

代码语言:javascript
复制
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory

原因

未知

解决

代码语言:javascript
复制
make MALLOC=libc

#2.3 未知错误

报错

代码语言:javascript
复制
输入make test后
报错You need tcl 8.5 or newer in order to run the Redis test

原因

未知

解决

代码语言:javascript
复制
yum install tcl

#2.4 redis.conf 不生效

问题

配置redis.conf 重启redis后,总是不生效

解决

redis.conf文档的前几行解释

代码语言:javascript
复制
# 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

代码语言:javascript
复制
# 启动redis
./redis-server /path/to/redis.conf # 带上配置后的redis.conf
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Redis
  • #1 环境
  • #2 遇到的问题
    • #2.1 redis在django项目中版本问题
      • #2.2 未知错误
        • #2.3 未知错误
          • #2.4 redis.conf 不生效
          相关产品与服务
          云数据库 Redis
          腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档