redis数据库
redis简介
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
redis数据结构
String: 字符串
Hash: 散列
List: 列表
Set: 集合
Sorted Set: 有序集合
在阅读本教程前,你需要了解基本的数据结构。
redis的基本命令
启动redis,
在redis的1安装目录下输入以下指令启动redis,或者将路径添加到环境变量直接输入以下指令1
redis-server.exe
连接本地redis
初始化的链接不需要密码
redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
python连接redis
# 导入redis,需要先用pip下载包
import redis
# 创建连接redis的实例化对象
conn = redis.Redis(host = 'localhost',port = 6379,decode_responses=True)
创建redis实例化对象时host是redis服务器的ip地址,port是运行的端口号,decode_responses参数是为了python在获取数据时会自动解码,否则返回的数据都是字节类型
python下使用redis的常用指令
给redis添加数据
conn.set(key,value)
实例:
conn.set('name','kingfan') // 生成键值对给redis
```set和get指令
set指令是将数以以下形式存储:
{
key :value
}
conn.get(key)
conn.get(name) //根据key拿到kingfanq
![](https://img2018.cnblogs.com/blog/1456462/201812/1456462-20181221102343345-205712213.png)
hset指令:
存储格式
{
key:{key,value}
}
获取指令hget
![](https://img2018.cnblogs.com/blog/1456462/201812/1456462-20181221104319187-806954381.png)
注意{
key:{key:value}
}
value如果还想存python的字典应该要先Json存储
## redis连接池
连接池的作用是保持与数据库的连接,而不是每次想要获取数据就重新连接数据库,而且保持一定数量的连接池可以提高程序的并发性
使用连接池
impot redis
poor = redis.ConnectionPool(host ='localhost',port=6379,max_connections=5,decode_responses=True) //max_connections最大连接数
conn = redis.Redis(connection_pool=poor) //从连接池中获取一个连接
## redis的事务
大家知道redis的所有操作都是原子性操作,所以每个指令都是要么成功要么不成功,在redis的事务中,会将一堆指令先加载到缓存队列,然后去批量执行,包含在事务中的所有操作因为都是原子性操作,所以在事务中的指令,成功的指令就是成功了,失败的指令就是失败了,互不影响,这个mysql的事务是相反的,本质就是因为每个redis的操作都是原子性的
import redis
conn = redis.Redis(host='localhost',port=6379,decode_responses=True)
初始化事务对象
pipe = conn.pipeline() //开启事务
try:
pipe.set('kingfan','hello1')
pipe.set('kingfan2','hello6','她她她')
pipe.set('kingfan3','hello3')
pipe.execute() //执行事务
except Exception as e:
print(e)
print(conn.mget(['kingfan', 'kingfan2', 'kingfan3']))
可以运行上面的程序看到, pipe.set('kingfan2','hello6','她她她')这个操作正常是会报错的,但在是事务执行前都是先加载到缓存中,是没被运行的,只有当 pipe.execute() 被调用时,事务中的操作才会被执行,这时,我们捕获异常,然后再去获取,三条数据,发现只有第二条指令的数据没有插入成功
## redis的发布者和订阅者
发布者
import redis
conn =redis.Redis(host = 'localhost',port=6379,decode_responses=True)
conn.publish('name','kingfan')
订阅者
import redis
conn = redis.Redis(host='localhost',port=6379,decode_responses=True)
pubsub = conn.pubsub()
pubsub.subscribe('name')
while True:
print('监听name')
msg = pubsub.parse_response()
print(msg)
print('name更新')
发布与监听创建发布者与消息的键值对,并不是创建了该数据,订阅者根据发布者的key监听发布者发布消息,获取发布者的信息