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有客户端,也有服务端。
redis-cli -h `redis服务器ip` -p `redis服务器port`
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:{
值: 权重值,
值: 权重值,
}
中文官网: http://www.redis.cn/
英文官网:https://redis.io
参考命令:http://doc.redisfans.com/
针对各种数据类型它们的特性,使用场景如下:
字符串string: 用于保存一些项目中的普通数据,只要键值对的都可以保存,例如,保存 session,定时记录状态
哈希hash:用于保存项目中的一些字典数据,但是不能保存多维的字典,例如,商城的购物车
列表list:用于保存项目中的列表数据,但是也不能保存多维的列表,例如,队列,秒杀,医院的挂号
无序集合set:用于保存项目中的一些不能重复的数据,可以用于过滤,例如,投票海选的时候,过滤候选人
有序集合zset:用于保存项目中一些不能重复,但是需要进行排序的数据,分数排行榜.
# -*- 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')
pip install django-redis==4.5 #如果是django1.11版本那么就是使用django-redis4.5版本的,现在最新版的django-redis只支持django2.2版本+
# 上面是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", } }, }
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/