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监听发布者发布消息,获取发布者的信息
原文地址:https://www.cnblogs.com/Kingfan1993/p/10154051.html