三十七、python学习之Redis数据库

版权声明:浅弋、璃鱼的原创 https://blog.csdn.net/qq_35709559/article/details/83315927

一、简介

1.Nosql:

1.1.什么是Nosql:

一类新出现的数据库(not only sql),他的特点:

  • (1)不支持 SQL语法。
  • (2)存储结构跟传统的关系型数据库的那种关系表完全不同,nosql中存储的数据都是键值对的形式。
  • (3)Nosql的世界中没有一种通用的语言,每种Nosql数据库都有自己的api和语法,以及擅长的业务场景。
  • (4)Nosql中的产品相当多:
    • Mongodb
    • Redis
    • Hbase hadoop
    • Cassandra hadoop

1.2.Nosql与mysql的比较:

  使用场景不同:sql数据库适用于关系特别复杂的数据场景,nosql反之。
"事务"特性的支持:sql对事务的支持非常完善,而nosql基本不支持事务。
两者在不断的取长补短,呈现融合趋势。

1.3.Redis简介:

  Redis是一个开源的使用ANSI C语言编写的,支持网络,可基于内存亦可持久化的日志型,key-value数据库,并提供多种语言的API。
Redis是Nosql技术阵营中的医院,他通过多种键值数据类型来适应不同场景下的存储需求,借助一些高层的接口使用其可以胜任,如缓存、队列系统的不同角色。

1.4Redis特性:
Redis与其他key-value的产品具有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启时可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还支持list,set,zset,hash等数据结构的存储。
  • Redis支持数据备份,即master-slave(主-从)模式的数据备份。

1.5.Redis优势:

  • 性能极高: Redis能读的速度110000次/秒,写的速度81000次/秒。
    丰富的数据类型: Redis支持二进制案例的string,list,hashes,sets以及ordered sets数据类型的操作。
  • 原子: Redis的所有操作都是原子性的,同时Redis还支持对几个操作完全合并后的原子性执行。
  • 丰富的特性:Redis还支持publish/subscribe,通知,key过期等特性。

1.6.应用场景:

用来做缓存(ehcache/memcache): redis的所有数据是存放在内存中的(内存数据库)
可以在某些特定应用场景下替代传统数据库,如社交应用
在一些大型的系统中,巧妙的实现一些特定的功能:session共享,购物车
只要你有丰富的想象力,redis可以给你无限的惊喜…

1.7.推荐阅读:

redis官方网站
redis中文官网

二、安装

2.1.下载:

当前redis最新版是4.0,是一个测试版本,稳定版是3.2
当前ubuntu虚拟机中已经安装好redis的,以下步骤跳过,最新稳定版下载链接:
http://download.redis.io/releases/redis-3.2.8.tar.gz

  • step1下载:
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
  • step2解压:
tar -zxvf redis-3.2.8.tar.gz
  • step3:复制,放到 usr/local目录下
sudo cp -r ./redis-* /usr/local/redis/
  • step4:进入redis目录
cd /usr/local/redis/
  • step5:生成
sudo make
  • step6:测试(这段运行时间会比较长)
sudo make test
  • step7:安装:将redis的命令安装/usr/local/bin/目录下
sudo make install
  • step8: 安装完成后,我们进入目录/usr/local/bin/中查看
cd /usr/local/bin
ls -all

常用命令:

redis-server: redis服务器
redis-cli: redis命令行客户端
redis-benchmark: redis性能测试工具
redis-check-aof: AOF文件修复工具
redis-check-rdb: RDB文件检索工具

  • step9: 配置文件,移动到/etc/目录下
    配置文件目录为/usr/local/redis/redis.conf
sudo cp /usr/local/redis/redis.conf /etc/redis/

三、配置

3.1 配置信息:

路径/etc/redis/redis.conf
查看:sudo cat /etc/redis/redis.conf

3.2核心配置选项:

绑定ip:如果需要远程访问,可将此行注释,或绑定一个新的ip
bind 127.0.0.1
端口,默认6379
port 6379
是否以守护进程运行:
如果以守护进程运行,则不会在命令行中阻塞,类似于服务’
如果以非守护进程运行,则当前终端被阻塞
设置为yes表示守护进程,设置no表示非守护进程
推荐设置为yes
daemonize yes
数据文件:
dbfilename dump.rdb
数据文件存储路径:
dir /var/lib/redis/
日志文件:
logfile /var/log/redis/redis-server.log
数据库,默认16个
database 16
主从复制.类似双机备份:
slaveof

3.3.参考文档:

redis配置信息:https://blog.csdn.net/ljphilp/article/details/52934933

四、服务器和客户端:

4.1.服务器端:

服务器端的命令为:

redis-server

查看帮助文档:

redis-server --help

推荐是引用服务的方式管理redis

启动:

sudo service redis start

停止:

sudo service redis stop

重启:

sudo service restart

个人习惯:

  • 查看redis服务进程:
ps -ef|grep redis
  • 杀死redis服务器:
sudo kill -9 pid
  • 指定加载的配置文件(如果改变了redis的路径,必须使用这个命令启动加载配置文件):
sudo redis-server /etc/redis/redis.conf

4.2.客户端:

  • 客户端连接命令:
redis-cli
  • 可以使用help帮助文档:
redis-cli --help
  • 连接redis(默认ip和端口):
redis-cli
  • 运行测试命令:
ping

在这里插入图片描述

  • 切换数据库:
    数据库没有名称,默认有16个,默认是第0个:
select n

在这里插入图片描述

五、数据结构:

redis是key-value的数据结构,每一条数据都对应一个键值。
键的类型是字符串,且不能重复
值得类型分为5种:

  • 字符串string
  • 哈希hash:键值对中,一个key, 在value中存储在存储多个键值对
  • 列表list
  • 集合set
  • 有序集合zset

在这里插入图片描述

六、字符数据类型的操作:

中文命令文档
Redis命令参考文档

1.string类型:

字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这就意味着该类型可以接受任何格式的数据,如jpeg图像或json对象的描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

1.1.保存:

如果设置的键不存在则为添加,如果设置的键已经存在则为修改

1.1.1设置键值:

set key value

例如:设置键为name,值为iycast的数据:

set name itcast

在这里插入图片描述

1.1.2设置键值以及过期时间,以秒为单位:

setex key seconds valu

例:设置键aa,值为bb,过期时间为10

setex aa 10 bb

1.1.3设置多个键值

mset key1 value1 key2 vlaue2 …

例如:设置a1值为python,a2值为java,a3值为c
在这里插入图片描述

1.1.4追加值

append key value

例如:往a1的值后面追加一个哈哈
在这里插入图片描述

1.2 获取:

1.2.1 获取:根据键获取值.如果不存在此键返回nil

get key
例如:
在这里插入图片描述

1.2.2 获取多个键的多个值

mget key1 key2 …

例如:
在这里插入图片描述

3 键命令:

3.1 查找建:参数支持正则表达式:

keys pattern
例1:查找所有键:

keys *

在这里插入图片描述
例2:查看名称中包含a的键

keys 'a*'

分别是:以a开头, 以a结尾, 包含a
在这里插入图片描述

232 判断键是否存在,如果存在返回1, 不存在返回0:

exists key

在这里插入图片描述
3.3 查看键对应值得类型:

type key

3.4 删除键及对应的值:

del key1 key2 …

例如:删除a2,a3

del a2 a3

在这里插入图片描述

3.5 设置过期时间,以秒为单位

如果没有指定过期时间则一直存在,直到使用del一出

expire key seconds

例如:设置键a1的过期时间为三秒

expire a1 3

3.6 查看过期剩余时间,以秒为单位,不过期则为-1:

ttl key

在这里插入图片描述

七、redis数据类型_hash:

1…hash类型:

hash用于存储对象,对象的结构为属性、值
值得类型为string

2.增加,修改:

2.1设置单个属性:

hset key field value

例如:设置user的属性name的值为itheima

hset user name itheima

在这里插入图片描述
提示:
  Redis被设置为保存数据库快照,但它目前不能持久化到硬盘.用来修改集合数据的命令不能用。
原因:
  强制关闭Redis快照导致不能持久化的解决方案:
运行config set stop-writes-on9bgsave-error no 命令后,关闭配置项stop-writes-on9bgsave-error解决该问题。
2.2 设置多个属性:

hmset key field1 value1 field2 value2 …

例如:设置键u2的属性name为itcast,属性age为11

hmset u2 name itcast age 11

在这里插入图片描述

3.获取:

3.1 获取指定件的所有属性:

hkeys key

例如:获取u2的所有属性

hkeys u2

在这里插入图片描述

3.2获取一个属性的值:

hget key field

例如:获取u2中的name的值
在这里插入图片描述

3.3 获取多个属性的值:

hmget key field1 field2…

例如:获取u2的name和age

hmget u2 name aged

在这里插入图片描述

3.4获取所有的属性值:

hvals key

获取所有u2所有属性的值

hvals u2

在这里插入图片描述

4.删除:

4.1 删除整个hash键及值,使用del key

4.2 删除属性,属性对应的值会被一起删除:

hdel key field1 field2 …

例如:删除u2的属性age

hdel u2 age

在这里插入图片描述

七、redis数据类型_list:

1.list类型:

列表的元素为string
按照插入顺序排序

2.增加:

2.1在左侧插入数据

lpush key value1 value2 …

例如:从键a1的列表左侧加入数据a,b,c:

lpush aa a b c

在这里插入图片描述

2.2 在右侧插入数据:

rpush key value1 value2 …

例如:从键aa的列表右侧插入数据,x,y,z

rpush aa x y z

在这里插入图片描述

2.3在指定元素的前或后插入数据:

linsert key before/after 现有元素 新元素

例:在键aa的列表中元素b前加入一个元素3

linsert aa before b 3

在这里插入图片描述

3. 获取:

3.1返回了表里指定范围内的元素:

start、stop为元素的下标索引
索引从左往右,第一个元素为0
索引可以为负数,表示从尾部开始

lrange key start stop

例4:获取键aa列表内的所有元素:

lrange aa 0 -1

在这里插入图片描述

4.设置指定索引位置的元素值:

4.1索引从左侧开始,第一个元素为0

索引可以为负数,表示尾部开始,如-1表示最后一个元素

lset key index value

例如:修改键aa的列表中下标为2的元素的值为p

iset aa 2 p

在这里插入图片描述
5.删除:
5.1删除指定元素:
将列表中前count次出现的值为value的元素移除

count>0:从头开始删
count<0:从尾开始删
count=0:删除所有

例如:向列表bb中加入元素a,b,b,a,a,b

lpush bb a b b a a b

从列表bb右侧开始删除两个b

lrem bb -2 b

查看列表bb中的所有元素

lrange bb 0 -1

在这里插入图片描述

八、redis数据类型_set类型:

1.set类型:

无需集合
元素为string类型
元素具有唯一性,不重复
说明:对于集合没有修改操作

2.增加:

2.1添加元素:

sadd key member1 member2 …

例如:向cc集合中添加元素’zhangsan’ ‘lisi’ ‘wangwu’

sadd cc 'zhangsan' 'lisi' 'wangwu'

3.获取:

3.1返回所有元素

smembers key

例如:获取cc集合中的所有元素

smembers cc

在这里插入图片描述

4.删除:

4.1删除指定元素:

srem key member1 member2 …

例如:删除cc集合中的’wangwu’

srem cc 'wangwu'

在这里插入图片描述

八、redis数据类型_zset类型:

1.zset类型:

  • sorted set,有序集合
  • 元素为string类型
  • 元素具有唯一性,不重复
  • 每一个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序

说明:没有修改操作

2.增加:

zadd key score1 member1 score2 member2 …

例如:向键dd的集合中添加元素’lisi’ ‘zhaoliu’ ‘zhangsan’ ‘wangwu’,权重分别为4,5,6,3

zadd dd  4 'lisi' 5 'zhaoliu' 6 'zhangsan' 3 'wangwu'

在这里插入图片描述

3.获取:

3.1获取:

  • 返回指定范围内的元素
  • strat,stop为元素的下标索引
  • 索引从左侧开始,第一个索引为0
  • 索引可以是负数,表示从尾部开始计数

zrange key start stop

例如:获取键dd集合中的所有元素

zrange dd 0 -1

在这里插入图片描述

3.2 返回score值在min和max之间的成员

zrangebyscore key min max

例如:获取键dd集合中权值在5和6之间的成员

zrangebyscore dd 5 6

在这里插入图片描述

3.3返回成员mamber的score的值

zscore key member

例如:获取键dd中集合元素’zhangsan’的权重

zscore dd 'zhangsan'

在这里插入图片描述

4.删除:

4.1删除指定元素:

zrem key member1 member2 …

例如:删除集合’dd’集合中元素’zhangsan’

zrem dd 'zhangsan'

4.2删除权重在指定范围内的元素:

zrembyscore key min max

例如:在键dd集合中删除权值在5和6之间的元素

zrembyscore dd 5 6

九、redis_python和redis交互:

1.安装:

安装Redis的3中方式https://github.com/andymccurdy/redis-py
第一种:进入虚拟环境,联网安装redis

pip install redis

第二种: 进入虚拟环境.联网安装redis

easy_install redis

第三种:到中文官网-客户端下载redis包的源码,使用源码安装:

wget https://github.com/andymccurdy/redis-py/archive/master.zip
unzip master.zip
cd redis-py-master
sudo python setup.py install

2.调用模块:

2.1 引入模块

from redis import *

这个模块中提供了StrictRedis对象(Strict严格),用于连接redis服务器,并按照不同类型提供不同的方法,进行交互操作。

十、StrictRedis对象方法:

1.创建连接:

通过init创建对象,指定参数host,port与指定的服务器和端口连接,host默认为localhost,port默认为6379,db默认为0:

sr = StrictRedis(host = 'localhost', port = 6379, db = 0)

简写为:

sr = StrictRedis()

根据不同的类型,拥有不同的实例方法,与前面学习redis方法对应,方法需要的参数与命令的参数一致。

2.String:

  • set
  • setex
  • mset
  • append
  • get
  • mget
  • key

3. keys:

  • exists
  • type
  • delete
  • expire
  • getrange
  • ttl

4. hash

  • hset
  • hmset
  • hkey
  • hget
  • hmget
  • hvals
  • hdel

5. list:

  • lpush
  • rpush
  • linsert
  • lrange
  • lset
  • lrem

6. set:

  • sadd
  • smembers
  • srem

7.zset:

  • zadd
  • zrange
  • zrangebyscore
  • zscore
  • zrem
  • zremrangebyscore

8. redis.py参考文档:

http://python.jobbole.com/87305

9.python实现redis交互:

#-*-coding:utf-8-*-
from redis import StrictRedis

def main():
    # 创建一个StrictRedis对象,链接redis数据库
    try:
        sr = StrictRedis() 
        
        # 添加一个key为name,value为itcast
        res = sr.set('name', 'itcast')
        print(res)

        #获取name
        gg = sr.get('name')
        print(gg)

        # 修改name的值为itheima
        res = sr.set("itheima")
        print(res)

        # 删除name及对应的值,可以删除多个键值
        res = sr.delete('name') # 返回的是被操作的个数
        print(res)

        # 使用键命令获取所有的键值
        res = sr.keys()
        print(res)  # 返回的是一个列表

    except Exception as e:
        print(e)

if __name__ == '__main__':
    main()

10.Flask使用Redis存储session:

# 导包
from flask import Flask, session
from redis import StrictRedis
# 使用flask_session的扩展包
from flask_session import Session

app = Flask(__name__)

# 设置配置属性
app.config['SECRET_KEY'] = "FDKHJFDBVJLDKJBFGGFSVLFKVB"
# 使用session累的配置信息
app.config['SESSION_TYPE'] = "redis"
app.config['SESSION_REDIS'] = StrictRedis(host="127.0.0.1", port=6379)
app.config['SESSION_USE_SIGNER'] = True
# 设置Flask默认的config配置对象中的session有效期(单位:秒)
app.config['PERMANENT_SESSION_LIFETIME'] = 3600

#   使用Session类和程序实例进行关联
Session(app)

@app.route("/")
def index():
    session["itcast"] = "20181024"
    return "hello worls"

if __name__ == '__main__':
    app.run(debug=True)

十一、Redis主从概念:

1.主从概念:

  一个master可以拥有多个slave, 一个slave又可以拥有多个slave, 如此下去, 形成一个强大的多级服务器集群架构。
  master用来写数据, slave用来读数据,经统计, 网站的读写比率是10:1。
  通过主从配置可以实现读写分离。
在这里插入图片描述
master和slave都是一个redis实例(redis服务)

2.主从配置:

### 2.1 配置主:
查看当前主机的ip地址:

ifconfig

在这里插入图片描述
修改redis’的配置文件:

sudo vi /etc/redis/redis.conf
bind 192.168.63.130

保存 -->退出
重启redis服务

sudo service redis stop
redis-server /etc/redis/redis.conf

2.2 配置从(本机):

复制/etc/redis/redis.conf文件

sudo cp redis.conf ./slave.conf

修改redis/slave.conf文件

sudo vi slave.conf

编辑内容:

bind 192.168.63.130	# 绑定本机的ip地址
slaveof 162.168.63.130 6379	# 主服务的ip和port
port 6378	# 启动一个与主服务不同的端口

启动服务:

sudo redis-server /etc/redis/slave.conf

查看主从关系:

redis-cli -h 192.168.63.130 info Replication

在这里插入图片描述

3.数据操作:

在master和slave分别执行info命令,查看输出信息,进入主客户端:

redis-cli -h 192.168.63.130 -p 6379

进入从客户端:

redis-cli -h 192.168.63.130 -p 6378

在master上写数据

set name itcast

在这里插入图片描述
在slave上读数据:

get name

在这里插入图片描述

但是不能再slave上写数据,slave是只读的

十二、redis_集群概念:

1.为什么要有集群:

数据访问量过大时的服务器负担,提高性能

2.集群的概念:

集运是一组相互独立的,通过高速网络互连的计算机,他们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性的。
当请求到来首先由负载均衡服务器处理,把请求转发到另外的一台服务器上。

3.redis集群:

3.1 分类:

软件层面:
只有一台电脑,在这台电脑上启动多个redis服务。
硬件层面:
存在多台实体机,每台电脑上启动一个redis服务或者多个redis服务。

十三、搭建集群:

1.参考阅读:

redis集群搭建: http://www.cnblogs.com/wuxl360/p/5920330.html
[python]搭建redis集群 http://blog.5ibc.net/p/51020.html

2.步骤:(例如在192.168.63.130)

2.1在conf目录下创建7000.conf,编辑内容如下:

port 7000
bind 172.168.62.130
daemonize yes        # 作为守护进程,在后台运行
pidfile 7000.pid        # 进程的id写到7000.pid文件中
cluster-enable yes    # 这个可以作为集群的节点
cluster-config-file 7000_node.conf        # 集群的节点的配置文件
cluster-node-timeout 15000        # 集群节点的超时时间
appendonly yes        # 微端添加

在config目录下创建7001.config,编辑内容如下:

port 7001
bind 172.168.62.130
daemonize yes
pidfile 7001.pid
cluster-enable yes
cluster-config-file 7001_node.conf
cluster-node-timeout 15000
appendonly yes

在config目录下创建7002.config,编辑内容如下:

port 7002
bind 172.168.62.130
daemonize yes
pidfile 7002.pid
cluster-enable yes
cluster-config-file 7002_node.conf
cluster-node-timeout 15000
appendonly yes

这三个文件区别在于port、pidfile、cluster-config-file这三个文件

2.2 使用配置文件启动redis服务器

redis-server 7000.conf
redis-server 7001.conf
redis-server 7002.conf

2.3 在另一台电脑(172.168.179.142)上的conf目录下创建7003.conf,编辑内容如下:

port 7003
bind 172.168.179.142
daemonize yes        # 作为守护进程,在后台运行
pidfile 7003.pid        # 进程的id写到7003.pid文件中
cluster-enable yes    # 这个可以作为集群的节点
cluster-config-file 7003_node.conf        # 集群的节点的配置文件
cluster-node-timeout 15000        # 集群节点的超时时间
appendonly yes        # 微端添加

在config目录下创建7001.config,编辑内容如下:

port 7004
bind 172.168.179.142
daemonize yes
pidfile 7004.pid
cluster-enable yes
cluster-config-file 7004_node.conf
cluster-node-timeout 15000
appendonly yes

在config目录下创建7002.config,编辑内容如下:

port 7005
bind 172.168.179.142
daemonize yes
pidfile 7005.pid
cluster-enable yes
cluster-config-file 7005_node.conf
cluster-node-timeout 15000
appendonly yes

这三个文件区别在于port、pidfile、cluster-config-file这三个文件.

2.4 使用配置文件启动redis服务器

redis-server 7003.conf
redis-server 7004.conf
redis-server 7005.conf

3.创建集群:

### 3.1 redis的安装包中包含了redis-trib.rb, 用于创建集群

3.2 接下来在第一台机器(192.168.63.130)上操作:

将命令复制,这样可以在任何目录下执行:

sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /ur/local/bin

因为redis的这个命令使用ruby开发的,所以安装ruby环境

sudo apt-get install ruby

显示提示信息输入y,按回车继续安装:
在这里插入图片描述

3.3 运行如下命令创建集群:

redis-trib.rb create --replicas 1 172.168.62.130:7000 172.168.62.130:7001 172.168.62.130:7002 172.168.179.142:7003 172.168.179.142:7004 172.168.179.142:7005

(这个命令是:每个节点配置一个从属服务,将以上地址配置成一个集群,这样一个主服务配备一个从服务,一共随机形成3个节点)
执行上面命令在某些情况下会报错,主要原因是由于安装的ruby不是最新版本
天朝的防火墙导致无法下载最新版本,所以需要设置一下gem的源
解决办法如下:

  • 先查看自己的gem源是什么地址
gem source -l	# 如果是https://rubygems.org/需要换源
  • 更新命令
gem source --add https://gems.ruby-china.org/ --remove https://rubygems.org/
  • 通过gem安装redis的相关依赖
sudo gem install redis
  • 然后重新执行命令"创建集群"

4.数据验证:

4.1 根据例子可以看出.

当前搭建的主服务器为7001,7000,7003,对应的从服务器7004,7005,7002
在172.168.62.130机器上连接7002,加参数-c表示连接到集群

redis-cli -h 172.168.62.130 -c -p 7002

写入数据:

set name itcast

自动跳转到7003服务器,并写入数据
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35709559/article/details/83315927