zoukankan      html  css  js  c++  java
  • reids简单使用, python, django操作redis

    Redis 是一个高性能的key-value数据格式的内存缓存,NoSQL数据库。

    NOSQL:not only sql,泛指非关系型数据库。

    1. 没有数据表的概念,不同的nosql数据库存放数据位置不同。
    2. nosql数据库没有通用的操作语言。
    3. 基本不支持事务。   redis支持简单事务

    redis: 内存型(数据存放在内存中)的非关系型(nosql)key-value(键值存储)数据库, 支持数据的持久化(注: 数据持久化时将数据存放到文件中,每次启动redis之后会先将文 件中数据加载到内存),经常用来做缓存(用来缓存一些经常用到的数据,提高读写速度)。

    redis是一款基于CS架构的数据库,所以redis有客户端,也有服务端。

    其中,客户端可以使用python等编程语言,也可以终端命令行工具

    redis客户端连接服务器:

    redis-cli -h `redis服务器ip` -p `redis服务器port`

    设置redis密码,如果想需要提供密码再登录redis,需要在配置文件中设置 requirepass 密码

    redis数据类型

    1. string类型:
    字符串类型是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制存储的,也就是byte类型
    最大容量是512M。
    key: string

    设置键值: set key value   如: set name bob
    
    设置键值及过期时间,以秒为单位: setex key seconds value   如: setex name1 3 jack(3秒后过期)
    关于设置保存数据的有效期:
    ""
    # setex 添加保存数据到redis,同时设置有效期
    格式:
        setex key time value
    # expire 给已有的数据重新设置有效期
    格式:
        expire key time
    ""
    
    设置多个键值: mset key1 value1 key2 value2 ...   如: mset hobby1 walking hobby2 running hobby3 swimming
    
    追加值: append key value  如: append hobby1 reading  ("walkingreading")
    
    获取:根据键获取值,如果不存在此键则返回`nil`: get key   如: get hobby1 
    
    根据多个键获取多个值: mget key1 key2 ...   如: mget hobby1 hobby2
    # 1) "walkingreading"
    # 2) "running"

    键操作

    查找键,参数⽀持正则表达式: keys pattern  
    查看所有键: keys *  
    
    查看名称中以`a`开头的键: keys a* 
    查看名称中包含`a`的键: keys *a*
    
    判断键是否存在,如果存在返回`1`,不存在返回`0`: exists key1   如: exists hobb
    
    查看键对应的`value`的类型: type key  
    
    删除键及对应的值: del key1 key2 ...   如: del hobby1
    
    查看有效时间,以秒为单位: ttl key

    2. hash类型:
    hash用于存储对象,对象的结构为属性、值,值的类型为string。
    key:{
    域:值[这里的值只能是字符串],
    域:值,
    域:值,
    域:值,
    ...
    }

    设置单个属性: hset key field value  如: hset weather today hot(设置键 `weather`的属性`today`为`hot`)
    
    设置多个属性: hmset key field1 value1 field2 value2 ...   如: hmset weather2 today hot tomorrow hot
    
    获取指定键所有的属性: hkeys key   如: hkeys weather2
    
    获取⼀个属性的值: hget key field  如: hget weather2 tomorrow
    
    获取多个属性的值: hmget key field1 field2 ...   如: hmget weather2 today tomorrow
    # 1) "hot"
    # 2) "hot"
    
    获取所有属性的值: hvals u2  如: hvals weather2
    
    删除属性,属性对应的值会被⼀起删除: hdel key field1 field2 ...   如: hdel weather2 today

    3. list类型:
    列表的元素类型为string。
    key:[ 值1,值2,值3..... ]

    在左侧插⼊数据: lpush key value1 value2 ...   如: lpush l1 11 22 33(后来的数据在列表前面显示)
    
    在右侧插⼊数据: rpush key value1 value2 ...  如: rpush l2 11 22 33(后来的数据在列表后面显示)
    
    从键为`...`的列表右侧加⼊数据`...`   如: rpush l2 55 66
    左侧同理(lpush l2 11 66)
    
    在指定元素的前或后插⼊新元素: 如: linsert l2 before 33 777
    
    设置指定索引位置的元素值: 
    索引可以是负数,表示尾部开始计数,如`-1`表示最后⼀个元素  如: lset l2 -1 000
    索引0 代表第一个数字: lset l2 0 8888
    
    删除指定元素: 
    - 将列表中前`count`次出现的值为`value`的元素移除
    - count > 0: 从头往尾移除
    - count < 0: 从尾往头移除
    - count = 0: 移除所有
    
    > lrem key count value
    如: lrem l2 2 11  (从前面开始删除两个11)
    
    查看列表的所有元素:  lrange l2 0 -1

    4. set类型:
    无序集合,元素为string类型,元素唯一不重复,没有修改操作。
    key: {值1,值4,值3,值5,....}

    添加元素: sadd key member1 member2 ...     如: sadd s11 11 22 33 33 55(实际会去重, 只有4个值)
    
    返回所有的元素: smembers key
    
    删除指定元素: srem key value   如: srem s11 55 22

    5. zset类型[sortset]:
    有序集合,元素为string类型,元素唯一不重复,有修改操作。
    key:{
    值: 权重值,
    值: 权重值,
    }

    redis的几个站点地址:

    中文官网: http://www.redis.cn/

    英文官网:https://redis.io

    参考命令:http://doc.redisfans.com/

    指令:http://redis.io/commands

    针对redis中的内容扩展

    flushall 清空数据库中的所有数据

    针对各种数据类型它们的特性,使用场景如下:
    字符串string: 用于保存一些项目中的普通数据,只要键值对的都可以保存,例如,保存 session,定时记录状态
    哈希hash:用于保存项目中的一些字典数据,但是不能保存多维的字典,例如,商城的购物车
    列表list:用于保存项目中的列表数据,但是也不能保存多维的列表,例如,队列,秒杀,医院的挂号
    无序集合set:用于保存项目中的一些不能重复的数据,可以用于过滤,例如,投票海选的时候,过滤候选人
    有序集合zset:用于保存项目中一些不能重复,但是需要进行排序的数据,分数排行榜.

    python连接redis基本操作

    安装: pip3 install redis

    普通连接: 不推荐

    # -*- coding:utf-8 -*-
    import redis
    # 直接连接redis
    conn = redis.Redis(host='10.211.55.28', port=6379, password='foobared', encoding='utf-8', db=1,decode_responses=True)
    #注解  redis 提供两个类 Redis 和 StrictRedis, StrictRedis 用于实现大部分官方的命令,Redis 是 StrictRedis 的子类,用于向后兼用旧版本。
    #redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串
    
    # 设置键值:159="9999" 且超时时间为10秒(值写入到redis时会自动转字符串)
    conn.set('159', 9999, ex=10)
    # 根据键获取值:如果存在获取值(获取到的是字节类型);不存在则返回None
    value = conn.get('159')
    print(value)

    面python操作redis的示例是以直接创建连接的方式实现,每次操作redis如果都重新连接一次效率会比较低,建议使用redis连接池来替换,例如:

    连接池的形式:

    import redis
    # 创建redis连接池(默认连接池最大连接数 2**31=2147483648)
    pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='', encoding='utf-8', max_connections=1000)
    #查看redis最大连接数的方法127.0.0.1:6379> CONFIG GET maxclients
    #设置redis最大连接数的方法127.0.0.1:6379> CONFIG set maxclients 10
    # 去连接池中获取一个连接
    # conn = redis.Redis(connection_pool=pool, decode_responses=True)
    conn = redis.Redis(connection_pool=pool)
    # 设置键值:15131255089="9999" 且超时时间为10秒(值写入到redis时会自动转字符串)
    conn.set('day', "Monday", ex=10)
    # 根据键获取值:如果存在获取值(获取到的是字节类型);不存在则返回None
    value = conn.get('day')
    print(value)

    django连接redis

    import redis
    
    from django.shortcuts import render, HttpResponse
    
    # 创建redis连接池
    pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='', encoding='utf-8', max_connections=1000)
    
    
    def index(request):
        # 去连接池中获取一个连接
        conn = redis.Redis(connection_pool=pool)
        conn.set('day', 'Monday', ex=10)
        value = conn.get('day')
        print(value)
        return HttpResponse('ok')

    上述可以实现在django中操作redis。但是在django中一般不这么干,而是用另一种更加简便的的方式: django-redis

    第一步:安装django-redis模块(内部依赖redis模块)

    pip install django-redis==4.5  #如果是django1.11版本那么就是使用django-redis4.5版本的,现在最新版的django-redis只支持django2.2版本+

    第二步:在django项目的settings.py中添加相关配置

    # 上面是django项目settings中的其他配置....
    
    # 设置redis缓存
    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": 1000,
                #    "encoding": 'utf-8'
                #},
                #"PASSWORD": "" # 如果设置了登录密码,那么这里写密码
            }
        },
        
        # 提供存储短信验证码
        "sms_code":{
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379/2",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        },
    
    }

    第三步:在django的视图中操作redis

    from django.shortcuts import render, HttpResponse
    from django_redis import get_redis_connection
    
    
    def index(request):
        # 去连接池中获取一个连接
        conn = get_redis_connection("default")
        # conn = get_redis_connection("sms_code")  也可以连接sms_code的数据库
        conn.set('dayyy', 'Mondayyy', ex=10)
        value = conn.get('dayyy')
        print(value)
        return HttpResponse('ok')

     

    redis-py模块的操作文档:https://redis-py.readthedocs.io/en/stable/

    Django-redis中文文档:https://django-redis-chs.readthedocs.io/zh_CN/latest/

  • 相关阅读:
    已经有人提出过循环
    中华术数系列之奇门遁甲精简版
    研究下市场上有哪些软件项目/产品,哪些是值得做的?
    中华术数系列之奇门遁甲手机版
    Webbrowser代理支持
    随笔:杂念纷呈
    架构设计实践:基于WCF大型分布式系统(转)
    WCF分布式开发必备知识(3):Enterpise Services(转)
    看完这20部电影 你能变成经济学大师(转)
    WCF服务契约继承与分解设计(转)
  • 原文地址:https://www.cnblogs.com/fdsimin/p/13427870.html
Copyright © 2011-2022 走看看