redis 数据库 :
介绍
Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库(非关系型数据库)。
本质:将数据保存在内存中。
用途:缓存、消息队列。
Redis 官网:https://redis.io/
特点:
Redis支持五种数据类型:字符串、列表、哈希散列表、集合、有序集合。和Memcached类似,但它支持存储的values类型相对更多。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启时可以再次加载进行使用。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis支持数据库备份。
注意:
1.Redis不支持事务,逻辑实现事务效果
2.Redis数据的持久化,当程序关闭,就会将缓存数据保存导默认的demp.rdb文件中
3.Redis 周期性更新数据与其他配置在 redis.conf 文件中
功能:
Redis性能极高,读的速度是110000次/s,写的速度是8100次/s。
Redis丰富的数据类型(String、Lists、Hashes、Sets、Ordered Sets)。
Redis的所有操作都是原子性的,要么成功执行、要么完全失败不执行,多个操作逻辑实现事务,即MULTI和EXEC指令包起来。
Redis有丰富的特性,支持publish/subscribe(发布/订阅者模式),通知,key过期等特性。
memcache & redis 的区别:
memcache :(django 默认 并发量小)
相同: 都是NoSQl数据库,数据存到内存,读取速度快
1.减少数据库压力,提升访问速度
2.在数据挂掉的情况下,仍能保证业务正常运行一段时间,提升安全性
不相同:
1.类型:
memcached:类型单一,只能存字符串"key为字符串"="value也为字符串"
redis:支持五大类型:string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)、hash(哈希类型)
2.持久化:
memcached:断电数据丢失
redis:支持持久化,单独开一个进程完成持久化,要保持性能就需要关闭持久化,很多公司并不使用持久化功能
3.高并发:
memcached : 不支持(并发小)
redis : connection_pool= max_number 池 支持高并发
缓存思想: 数据先走缓存, 直接返回、
没有走数据库(同步到缓存)
redis 数据类型:
String字符串:可以包含任何数据,包括图片以及序列化对象,一个键最大能存储512MB。
List列表:简单的字符串列表,按照插入顺序排序,可以从两段进行添加,类似于双向链表,列表还可以进行阻塞。
Hash散列表:一个String类型的key和value的映射表,hash特别适合存储对象,类比python字典。
Set集合:字符串类型的无序且不重复集合。集合是通过哈希表实现,所以添加、删除、查找的时间复杂度都是O(1)。
Zset有序集合:zset和set一样,不同的是每个元素会关联一个double类型的分数,redis正是通过对分数的排序对集合进行有序存储。
数据类型的功能实现:
字符串:
set key value 创建
get key 获取
mset k1 v1 k2 v2 ... 获取多个
mget k1 k2 ...
setex key exp value 设置过期时间
incrby key increment key 增加给定值
列表:
rpush key value1 value2 ... 列表添加
lpush key value1 value2 ... 插入值
lrange key bindex eindex 获取范围内值
lindex key index 索引取值
lpop key | rpop key 移除并获取表1元素
linsert key before|after old_value new_value
在列表的元素前或者后插入元素
哈希:
hset key field value 表 key 中的字段 field 的值设为 value
hget key field 获取存储在哈希表中指定字段的值
hmset key field1 value1 field2 value2 ... 多个 field-value (域-值)对设置到哈希表
hmget key field1 field2 获取所有给定字段的值
hkeys key 获取所有哈希表中的字段
hvals key 获取哈希表中所有值
hdel key field 删除一个或多个哈希表字段
集合:
sadd key member1 member2 ... 向集合添加一个或多个成员
sdiff key1 key2 ... 返回给定所有集合的差集
sdiffstore newkey key1 key2 ... 所有集合的差集存储 destination 中
sinter key1 key2 ... 返回给定所有集合的交集
sunion key1 key2 ... 返回所有给定集合的并集
smembers key 返回集合中的所有成员
spop key 移除并返回集合中的一个随机元素
有序集合:
zadd key grade1 member1 grade2 member2 ... 向有序集合添加成员
zincrby key grade member 对指定成员的分数加上增量 increment
zrange key start end 区间返回有序集合指定区间内的成员
zrevrange key start end 字典区间返回有序集合的成员
python- redis:
pip3 install redis
import redis
r = redis.Redis(host='127.0.0.1', port=6379, db=1, password=None, decode_responses=True)
decode_responses=True 编码(默认为false)
连接池(并发):
import redis
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)
django- redis:
pip install django_redis
#1.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,
"PSAAWORD": "",
}
}
}
#2.操作cache模块直接操作操作缓存: view.py
from django.core.cache import caahe
# 存放token,设置过期时间
caahe.set('token','header.payload.signature',300) # 300s
#取出 token
token = cache.get('token')
注意:
1.redis 不能直接缓存对象
2.持久化:关闭项目--> redis数据库库会存储数据