• redis数据库及操作 相关配置, redis数据类型, python使用redis(django使用redis)


    redis介绍

    """
    1、官网下载:安装包或是绿色面安装
    2、安装并配置环境变量
    """
    redis VS mysql
    """
    redis: 内存数据库(读写快)、非关系型(操作数据方便、数据固定)
    mysql: 硬盘数据库(数据持久化)、关系型(操作数据间关系、可以不同组合)
    
    大量访问的临时数据,才有redis数据库更优
    """
    redis VS memcache
    """
    redis: 操作字符串、列表、字典、无序集合、有序集合 | 支持数据持久化(数据丢失可以找回(默认持久化,主动持久化save)、可以将数据同步给mysql) | 高并发支持
    memcache: 操作字符串 | 不支持数据持久化 | 并发量小
    """

    Redis操作

    启动服务
    """
    前提:前往一个方便管理redis持久化文件的逻辑再启动服务:dump.rdb
    1)前台启动服务
    >: redis-server
    
    2)后台启动服务
    >: redis-server --service-start
    注)Linux系统后台启动(或是修改配置文件,建议采用方式)
    >: redis-server &
    
    3)配置文件启动前台服务
    >: redis-server 配置文件的绝对路径
    
    4)配置文件启动后台服务
    注)windows系统默认按Redis安装包下的redis.windows-service.conf配置文件启动
    >: redis-server --service-start
    注)Linux系统可以完全自定义配置文件(redis.conf)后台启动
    >: redis-server 配置文件的绝对路径 &
    """
    
    
    """
    windows系统
    1)前台启动
        i)打开终端切换到redis安装目录
        >: cd C:AppsRedis
        
        ii)启动服务
        >: redis-server redis.windows.conf
    
    2)后台启动
        i)打开终端切换到redis安装目录
        >: cd C:AppsRedis
        
        ii)启动服务(后面的配置文件可以省略)
        >: redis-server --service-start redis.windows-service.conf
    """
    密码管理
    """
    1)提倡在配置文件中配置,采用配置文件启动
    requirepass 密码
    
    2)当服务启动后,并且连入数据库(redis数据库不能轻易重启),可以再改当前服务的密码(服务重启,密码重置)
    config set requirepass 新密码
    
    3)已连入数据库,可以查看当前数据库服务密码
    config get requirepass
    """
    连接数据库
    """
    1)默认连接:-h默认127.0.0.1,-p默认6379,-n默认0,-a默认无
    >: redis-cli
    
    2)完整连接:
    >: redis-cli -h ip地址 -p 端口号 -n 数据库编号 -a 密码
    
    3)先连接,后输入密码
    >: redis-cli -h ip地址 -p 端口号 -n 数据库编号
    >: auth 密码
    """
    切换数据库
    """
    1)在连入数据库后执行
    >: select 数据库编号
    """
    关闭服务
    """
    1)先连接数据库,再关闭redis服务
    >: redis-cli -h ip地址 -p 端口号 -n 数据库编号 -a 密码
    >: shutdown
    
    2)直接连接数据库并关闭redis服务
    >: redis-cli -h ip地址 -p 端口号 -n 数据库编号 -a 密码 shutdown
    """
    清空redis数据库
    """
    1)连接数据库执行
    >: flushall
    """
    数据持久化
    """
    1)配置文件默认配置
    save 900 1  # 超过900秒有1个键值对操作,会自动调用save完成数据持久化
    save 300 10  # 超过300秒有10个键值对操作,会自动调用save完成数据持久化
    save 60 10000  # 超过60秒有10000个键值对操作,会自动调用save完成数据持久化
    
    2)安全机制
    # 当redis服务不可控宕机,会默认调用一下save完成数据持久化(如果数据量过大,也可能存在部分数据丢失)
    
    3)主动持久化
    >: save  # 连入数据库时,主动调用save完成数据持久化
    
    注:数据持久化默认保存文件 dump.rdb,保存路径默认为启动redis服务的当前路径
    """

    redis的持久化有两种:rdb和aof模式

     
    redis有两种持久化方式,aof和rdb,aof相当于日志记录操作命令,rdb相当于数据的快照。安全性来讲由于aof的记录能够精确到秒级追加甚至逐条追加,而rdb只能是全量复制,aof明显高于rdb。但是从性能来讲rdb就略胜一筹,rdb是redis性能最大化的体现,它不用每秒监控是否有数据写入,当达到触发条件后就自动fork一个子进程进行全量更新,速度也很快。容灾回复方面rdb更是能够快速的恢复数据,而aof需要读取再写入,相对慢了很多。
     
    redis相关配置
    """
    1)绑定的ip地址,多个ip用空格隔开
    bind 127.0.0.1
    
    2)端口,默认6379,一般不做修改
    port 6379
    
    3)是否以守护进程启动,默认为no,一般改为yes代表后台启动(windows系统不支持)
    daemonize no
    
    4)定义日志级别,默认值为notice,有如下4种取值:
        debug(记录大量日志信息,适用于开发、测试阶段)
        verbose(较多日志信息)
        notice(适量日志信息,使用于生产环境)
        warning(仅有部分重要、关键信息才会被记录)
    loglevel notice
    
    5)配置日志文件保持地址,默认打印在命令行终端的窗口上
        如果填写 "./redis.log" 就会在启动redis服务的终端所在目录下,用redis.log记录redis日志
    logfile ""
    
    eg)终端首先切断到log文件夹所在目录(一般就可以采用redis的安装目录,也可以自定义),再启动reids服务
    logfile "./log/redis.log"
    
    6)数据库个数,默认是16个,没特殊情况,不建议修改
    databases 16
    
    7)数据持久化
    save 900 1  # 超过900秒有1个键值对操作,会自动调用save完成数据持久化
    save 300 10  # 超过300秒有10个键值对操作,会自动调用save完成数据持久化
    save 60 10000  # 超过60秒有10000个键值对操作,会自动调用save完成数据持久化
    
    8)数据库持久化到硬盘失败,redis会立即停止接收用户数据,让用户知道redis持久化异常,避免数据灾难发生(重启redis即可),默认为yes,不能做修改
    stop-writes-on-bgsave-error yes
    
    9)消耗cpu来压缩数据进行持久化,数据量小,但会消耗cpu性能,根据实际情况可以做调整
    rdbcompression yes
    
    10)增持cpu 10%性能销毁来完成持久化数据的校验,可以取消掉
    rdbchecksum yes
    
    11)持久化存储的文件名称
    dbfilename dump.rdb
    
    12)持久化存储文件的路径,默认是启动服务的终端所在目录
    dir ./
    
    13)reids数据库密码
    requirepass 密码
    """

    Redis数据类型

    """参考菜鸟教程
    数据操作:字符串、列表、哈希(字典)、无序集合、有序(排序)集合
        有序集合:游戏排行榜
        
    字符串:
        set key value
        get key
        mset k1 v1 k2 v2 ...
        mget k1 k2 ...
        setex key exp value          # 等同于:set key value ex value 例:set b 2 ex 100
        incrby key increment      # incr a   a+1    decr a    a-1
        incrbyfloat a 2.3        # 变为浮点型增加     经测试:可能变为无尽小数
    补充:
        set name abedefxyz
        getrange name 0 -1    # 全部去除,注意首位都包括
        setnx a 999     # 如果a不存在,赋值999, 如果a存在,保持原值
        strlen a        # 获取a的字符串长度
        append a 8        # 在a的字符串末尾加上8字符
        
    列表:
        rpush key value1 value2 ...   # 从右添加值
        lpush key value1 value2 ...      # 从左添加值
        lrange key bindex eindex    # 取出列表bindex到eindex的数据
        lindex key index        # 列表第index个,索引从0开始
        lpop key | rpop key            # 从左/右上删除第一个元素
        linsert key before|after old_value new_value # 在列表老值前面或后面插入新值
    补充:
        llen n2     # 获取n2的长度
    
    哈希:
        hset key field value    # 数据名(redis对应的key)  字段  值  增或者改
    例:conn.hset('chouti',item['id'],s) hget key field hmset key field1 value1 field2 value2 ... hmget key field1 field2 hkeys key # 拿出所有key hvals key # 拿出所有值 hdel key field # 删除对应字段key 集合: sadd key member1 member2 ... # 创建或增加 sdiff key1 key2 ... # 差集,key1有,key2没有 sdiffstore newkey key1 key2 ... # 把key1于key2的差集存入newkey中 sinter key1 key2 ... # 交集 sunion key1 key2 ... # 并集 smembers key # 参看所有成员 spop key count # 删除count个任意成员,并返回被删成员,count不写默认为1 有序集合: zadd key grade1 member1 grade2 member2 ... zincrby key grade member # 对member成员增加grade zrange key start end # 从低到高 zrevrange key start end # 从高到底
    """

    python使用redis

    依赖
    >: pip3 install redis
    直接使用
    import redis
    # decode_responses=True得到的结果会自动解码(不是二进制数据) 
    r = redis.Redis(host='127.0.0.1', port=6379, db=1, password=None, decode_responses=True)
    
    # r.set('a','100')
    # print(r.get('a'))
    # r.setex('test','20','100')
    # print(r.get('test'))
    连接池使用
    import redis    # port,host,db=0默认可以省略
    pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=1, max_connections=100, password=None, decode_responses=True)
    r = redis.Redis(connection_pool=pool)
    
    # r.rpush('arr',1,2,3,4)
    # r.zadd('game',{'Bob':10,'Tom':5,'Jerry':7,'Ben':8})
    # print(r.zrevrange('game',0,2))
    缓存使用:要额外安装 django-redis

    相当于django缓存采用redis数据库存储,将满足jason类型数据装换为字符串存入

    pip install django-redis
    
    # 1.将缓存存储位置配置到redis中:settings.py
    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},
                "DECODE_RESPONSES": True,
                "PASSWORD": "",
            }
        }
    }
    
    # 2.操作cache模块直接操作缓存:views.py     # django的cache也可以缓存到文件或者mysql中。可以缓存对象,本质使用pickle序列化成二进制保存
    from django.core.cache import cache  # 结合配置文件实现插拔式
    # 存放token,可以直接设置过期时间
    cache.set('token', 'header.payload.signature', 300)
    # 取出token
    token = cache.get('token')

    例:

    from django.core.cache import cache
    from user import models,serializers
    from user import models,serializers
    user = models.User.objects.first()
    serializer_data = serializers.LoginSerializer(user).data
    print(serializer_data,type(serializer_data))
    
    # 原生redis不能直接操作drf序列化类序列化后的结果(ReturnDict)
    # from .t_redis import redis
    # redis.set('d1',serializer_data)
    
    # django支持的List、Dict以及特殊的列表字典(ReturnDict), 缓存可以直接操作
    cache.set('usr_data',serializer_data)
    print(cache.get('usr_data'))
  • 相关阅读:
    python学习笔记(十五)-异常处理
    python学习笔记(十四)python实现发邮件
    python学习笔记(十三)-python对Excel进行读写修改操作
    python学习笔记(十二)-网络编程
    python学习笔记(十一)-python程序目录工程化
    python学习笔记(九)-函数2
    python学习笔记(八)-模块
    勿忘初心,勇往前行
    【tp6】解决Driver [Think] not supported.
    【Linux】LNMP1.6 环境报500错误解决方法
  • 原文地址:https://www.cnblogs.com/ludingchao/p/12405158.html
Copyright © 2020-2023  润新知