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/

原文地址:https://www.cnblogs.com/fdsimin/p/13427870.html