初识redis
Redis介绍
- Redis 是一个高性能的key-value数据格式的内存缓存,NoSQL数据库。
- NOSQL,泛指非关系型数据库。关系型数据库: (mysql, oracle, sql server, sqlite)
# 关系型数据库
1. 数据存放在表中,表之间有关系。
2. 通用的SQL操作语言。
3. 大部分支持事务。
# 非关系型数据库
1. 没有数据表的概念,不同的nosql数据库存放数据位置不同。
2. nosql数据库没有通用的操作语言。
3. 基本不支持事务。 redis支持简单事务
-
redis是一款基于CS架构的数据库,有服务端,有客户端。其中,客户端可以是redis自己的命令行客户端,也可以是使用python等编程语言连接访问数据库的客户端。
-
redis是业界主流的key-value nosql 数据库之一,它支持存储的value类型有五种:string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
-
在此基础上,redis支持各种不同方式的排序。
-
为了保证效率,数据都是缓存在内存中。不过redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis优点
- 异常快速 : Redis是非常快的,每秒可以执行大约110000设置操作,81000个/每秒的读取操作。
- 支持丰富的数据类型 : Redis支持最大多数开发人员已经知道如列表,集合,可排序集合,哈希等数据类型。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- Redis是一个多功能实用工具,可以在很多如,消息传递队列中使用(Redis原生支持发布/订阅)
- 单线程特性,秒杀系统,基于redis是单线程特征,防止出现数据库“爆破”
Redis快的主要原因
- 基于内存;
- 采用IO多路复用;
- 单线程,避免进程\线程间切换的消耗。
redis的典型应用
(一)性能
Redis 中缓存热点数据,能够保护数据库,提高查询效率。如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
(二)并发
还是如上图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。
python连接redis的两种方式
在python中访问并操作redis数据库需要借助 redis
模块,通过pip的方式下载
普通链接:redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。
import redis
r = redis.Redis('127.0.0.1', 6379) # 提供redis服务端所在的ip + port
r.set('name', 'xliu') # 通过键'name' 将值'xliu'存起来
print(r.get('name')) # 通过键'name',将值取出来
连接池。redis-py使用connection pool来管理对一个redis server的所有连接,事先建好一批链接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)
ret = r.get('name')
print(ret)
连接池的单例模式
连接池可以维护着一群链接,这样就避免了每次新链接的建立和释放;
多个位置可以同时使用这个链接池,redis
模块中链接池被封装成了一个类;
因此可以使用链接池的单例模式,一个实例对象,即可满足所有链接请求。
最简单的单例模式就是实例化一个对象,采用模块导入的方式使用该对象
# redis_pool.py
api_pool = redis.ConnectionPool(
host='公网ip',
port=6379,
password='redis密码')
# 使用处
from redis_pool import api_pool
conn = redis.Redis(connection_pool=api_pool)
redis的使用
学习redis的使用,很多时候就是学习如何操作redis的数据类型。
1. string类型:
字符串类型是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,也就是byte类型,最大容量是512M。
数字在存储时也是保存为字符串string
2. hash类型:
hash用于存储对象,对象的结构为属性、值,值的类型为string。
key:{
域:值[这里的值只能是字符串],
域:值,
域:值,
域:值,
...
}
3. list类型:
列表的元素类型为string。
key:[ 值1,值2,值3..... ]
4. set类型:
无序集合,元素为string类型,元素唯一不重复,没有修改操作。
{值1,值4,值3,值5}
5. zset类型:
有序集合,元素为string类型,元素唯一不重复,没有修改操作。