当前位置:   article > 正文

内存型数据库redis详细教程,python连接redis相关操作,主从复制、事务操作_python连接主从redis

python连接主从redis

01. redis基本知识点介绍

redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
在这里插入图片描述
国外的官方网站:https://redis.io/ (更新快)

国内的中文网站:http://www.redis.cn/(相对于官方网站,更新慢)

Redis的作者,他叫Salvatore Sanfilippo,来自意大利的西西里岛,现在居住在卡塔尼亚。目前供职于Pivotal公司。

redis的基本用途:Redis能干嘛?

1、内存存储、持久化,内存中是断电即失、所以说持久化很重要(rdb、aof) 2、效率高,可以用于高速缓存 3、发布订阅系统 4、地图信息分析 5、计时器、计数器(浏览量)

基本概念的介绍:

1,redis也有数据库的概念,一个数据库中可以保存一组数据;

2,各个数据库之间是相互隔离的,当然也可以在不同数据库之间复制数据;

3,每一个数据库都有一个id号,默认的数据库id为0;

4,可以使用select命令选择当前使用的数据库:

5,redis初始化的时候会默认创建16个数据库(这个配置可以在redis配置文件中databases 16);

6,特别注意,类似redis的key-value数据库系统,是绝对没有表的概念,可以简单理解为,所有的数据都是乱七八糟的堆在一起的;

编号redis常见实用知识点
1Redis采用单线程机制进行工作
2使用select 数据库编号 可以切换使用的数据库
3dbsize 命令查看当前数据库key的数量
4keys * 命令查看当前数据库所有的key
5flushdb 命令清空当前数据库
6flushall 命令清空所有数据库
7Redis中所有数据库使用同一个密码,默认没有密码,Redis认为安全层面应该由Linux来保证
8Redis中所有索引都是从0开始
9Redis默认端口是6379

02. Linux下载安装redis

从redis.io下载最新版redis-X.Y.Z.tar.gz后解压,然后进入redis-X.Y.Z文件夹后直接make即可,安装非常简单:官方网站

Redis的下载和安装详细步骤:

1、去官网下载redis-6.2.6.tar.gz安装包,并放入Linux中的/opt目录
在这里插入图片描述
2、然后通过FTP上传到/opt目录下,执行解压命令,指令如下所示:

tar -zxvf redis-6.2.6.tar.gz
  • 1

3、解压完成后出现文件夹redis-6.2.6
4.
4、进入文件夹redis-6.2.6,在此目录下执行安装的命令,展示如下:

./configure --prefix=/usr/local/test
  • 1

基本流程:配置(configure)、编译(make)、安装(make install)

Configure是一个可执行脚本,它有很多选项,在待安装的源码路径下使用命令./configure –help输出详细的选项列表。

其中–prefix选项是配置安装的路径,如果不配置该选项,安装后可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr /local/share,比较凌乱。

./configure –prefix=/usr/local/test
  • 1

可以把所有资源文件放在/usr/local/test的路径中,不会杂乱。

make && make install
  • 1

5、进入默认安装目录cd /usr/local/bin,此目录中有如下文件:
在这里插入图片描述
make成功后会在src文件夹下产生一些二进制可执行文件,主要包括redis-server、redis-cli等等,展示如下:

$ find . -type f -executable
./redis-benchmark # 用于进行redis性能测试的工具
./redis-check-dump # 用于修复出问题的dump.rdb文件
./redis-cli # redis的客户端
./redis-server # redis的服务端
./redis-check-aof # 用于修复出问题的AOF文件
./redis-sentinel # 用于集群管理
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

03. 配置conf启动redis服务

启动redis非常简单,直接./redis-server就可以启动服务端了,还可以用下面的方法指定要加载的配置文件:

首先我们要知道redis的配置文件是在安装包那边提供的,并不是解压安装后的目录内,展示如下:
在这里插入图片描述
目录在/opt/redis-6.2.6/redis.conf,我们可以用vim进行打开进行打开,编辑:当然也可以使用宝塔面板,非常方便:
在这里插入图片描述
然后我们启动我们的redis-server服务器端的服务,记住后面要跟conf的路径。

[root@iZbp1cptoov44i876qmh8hZ bin]# ./redis-server /opt/redis-6.2.6/redis.conf
3027598:C 22 Feb 2022 17:30:45.591 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3027598:C 22 Feb 2022 17:30:45.591 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=3027598, just started
3027598:C 22 Feb 2022 17:30:45.591 # Configuration loaded
3027598:M 22 Feb 2022 17:30:45.592 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.2.6 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 3027598
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

3027598:M 22 Feb 2022 17:30:45.593 # Server initialized
3027598:M 22 Feb 2022 17:30:45.594 * Loading RDB produced by version 6.2.6
3027598:M 22 Feb 2022 17:30:45.594 * RDB age 14 seconds
3027598:M 22 Feb 2022 17:30:45.594 * RDB memory usage when created 0.77 Mb
3027598:M 22 Feb 2022 17:30:45.594 # Done loading RDB, keys loaded: 0, keys expired: 0.
3027598:M 22 Feb 2022 17:30:45.594 * DB loaded from disk: 0.000 seconds
3027598:M 22 Feb 2022 17:30:45.594 * Ready to accept connections
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

我们也可以借助环境变量 redis-server,redis-cli 来进行执行,redis在make install 时候已经帮我们配置软连接了。

注意:这里直接执行redis-server 启动的Redis服务,是在前台直接运行的(效果如上图),也就是说,执行完该命令后,如果Lunix关闭当前会话,则Redis服务也随即关闭。

正常情况下,启动Redis服务需要从后台启动,并且指定启动配置文件。所以执行下面的配置。

修改/opt/redis-2.6.2/redis.conf配置文件,命令 vim redis.conf,将后台启动打开,即将daemonize选项由no置为yes:
在这里插入图片描述
查看redis进程:ps -ef|grep redis
在这里插入图片描述
默认情况下,redis-server会以非daemon的方式来运行,且默认服务端口为6379,而且这个6379的由来也非常有意思:而Merz全名Alessia Merz,是意大利的一位广告女郎,就是下面这位,在Antirez看来,这个名字是愚蠢的代名词,所以就选了这个6379,不过这位姑娘应该也不会关心IT技术圈的事,反而会被广大程序员知道了。

在这里插入图片描述在这里插入图片描述

redis客户端的使用:

$ ./redis-cli # 这样来启动redis客户端了 或者 redis-cli
127.0.0.1:6379> set name "wristwaking" # 用set指令来设置key、value
OK
127.0.0.1:6379> get name # 来获取name的值
"wristwaking"
127.0.0.1:6379> shutdown # 通过客户端来关闭redis服务端
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

04. 五大基本数据类型介绍

redis数据类型分为:字符串类型、散列类型、列表类型、集合类型、有序集合类型。

redis这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作。

原子操作:最小的操作单位,不能继续拆分。即最小的执行单位,不会被其他命令插入。高并发下不存在竞态条件。

KEY的命名:一个良好的建议是article:520 : title,来存储ID520的文章的标题。

注意:Redis采用键值对存储数据,key永远是String类型,五大数据类型指的是value部分

05. redis常见命令介绍

Redis命令十分丰富,包括的命令组有Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共14个redis命令组两百多个redis命令。

每个命令都代表着一种操作,有点类似mysql的命令。

redis命令大家没必要去记住,常见了解就行,忘记了就去官网查就行:

国内的中文网站:http://www.redis.cn/(相对于官方网站,更新慢)
在这里插入图片描述
怎么来说,程序员用redis肯定是get、set为主,例如:正则查询键值对

127.0.0.1:6379> keys *t  
# 遍历以t结尾的,*表示匹配任意多个字符
127.0.0.1:6379> keys na?e  
# ?只匹配一个字符
127.0.0.1:6379> keys n*e  
# * 匹配多个字符
127.0.0.1:6379> keys [a,b]*  
# 匹配以字母a和b开头的key
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

scan cursor [MATCH pattern] [COUNT count]

27.0.0.1:6379> scan 0 match n* count 10  //count表示每次查询的key个数
  • 1

scan 相比 keys 具备有以下特点 :在这里插入图片描述
除 scan 字符串外:还有以下,他们的用法和scan 一样,具体参考官网: 官网

SCAN 命令用于迭代当前数据库中的数据库键。
SSCAN 命令用于迭代集合键中的元素。
HSCAN 命令用于迭代哈希键中的键值对。
ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和分值)。
  • 1
  • 2
  • 3
  • 4

06. 远程连接redis相关配置

Redis默认只能localhost登录,所以需要开启远程登录。

关键就是进行修改 redis.conf 配置文件:

1、将 bind 127.0.0.1 ::1 这一行注释掉。
在这里插入图片描述
2、将 bind 127.0.0.1 ::1 修改为 bind 0.0.0.0 (指所有的地址都可以访问)

这里的bind指的是只有指定的网段才能远程访问这个redis。 注释掉后,就没有这个限制了。或者 bind 自己所在的网段。

将 protected-mode 要设置成no (默认是设置成yes的, 防止了远程访问,在redis3.2.3版本后)
在这里插入图片描述
设置远程连接密码:取消注释 requirepass foobared,将 foobared 改成任意密码,用于验证登录。默认是没有密码的就可以访问的,我们这里最好设置一个密码。
在这里插入图片描述
最后进行重启 redis,如果不进行重启,我们的配置文件已经是旧的,所以要重启。

开启密码的权限后:客户端的连接 redis-cli,然后:127.0.0.1:6379> auth password 进行权限登录

eg:修改密码的方法

默认情况下 requirepass 参数是空的,这就意味着无需通过密码验证就可以连接到 redis 服务。可以通过以下命令来修改该参数:

127.0.0.1:6379> CONFIG set requirepass "mio" – mio 为密码
  • 1

记住还要防火墙的开放6379的端口,想必大家都忘记了:
在这里插入图片描述
如果你用的宝塔面板,那么光服务器端那边防火墙开放还不够,宝塔这边也要进行开放6379,这是宝塔面板的保护机制,了解即可:
在这里插入图片描述

07. python建立redis连接

python连接redis数据库,借助的第三方库是redis,进行下载redis:

pip install redis -i 镜像源地址
  • 1

pip的仓库一般都是在国外的服务器上,加了镜像源可以提供下载的速度。

常见pip镜像源(国内源)

清华:https://pypi.tuna.tsinghua.edu.cn/simple

豆瓣:http://pypi.douban.com/simple/

阿里云:http://mirrors.aliyun.com/pypi/simple/

山东理工大学:http://pypi.sdutlinux.org/

华中理工大学:http://pypi.hustunique.com/

中国科技大学: https://pypi.mirrors.ustc.edu.cn/simple/

临时使用pip镜像源可以在使用pip的时候加参数:-i https://pypi.tuna.tsinghua.edu.cn/simple

若不进行pip进行快速安装,或者采用源码进行安装:

git clone https://github.com/andymccurdy/redis-py.git
cd redis-py
python setup.py install 
  • 1
  • 2
  • 3

redis提供两个类Redis和StrictRedis来实现Redis的命令操作。StrictRedis实现了绝大部分官方的命令,参数也互相对应,比如set()方法就对应Redis命令的set方法。

而Redis是StrictRedis的子类,它的主要功能是用于向后兼容旧版本库里的几个方法。为了做兼容,它将方法做了改写,比如lrem()方法就将value和num参数的位置互换,这和Redis命令行的命令参数不一致。

redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用。如果需要另一个Redis实例(or Redis数据库)时,就需要重新创建redis连接实例来获取一个新的连接。同理,python的redis没有实现select命令。

假设现在我们已经在服务器端装了Redis并运行在6379端口。那么,可以用如下示例连接Redis并测试:

Redis方式连接

import redis   
# 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库

redis = redis.Redis(host='localhost', port=6379, decode_responses=True)   
# host是redis主机,需要redis服务端和客户端都启动 redis默认端口是6379
redis.set('name', 'junxi')  
# key是"foo" value是"bar" 将键值对存入redis缓存
print(redis['name'])
print(redis.get('name'))  # 取出键name对应的值
print(type(redis.get('name')))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

StrictRedis方式连接

from redis import StrictRedis

redis = StrictRedis(host='localhost', port=6379, db=0, password='foobared', socket_connect_timeout=1, decode_responses=True)
# decode_responses 开启bytes自动转默认编码的方式
# socket_connect_timeout = 1,设置连接超时
redis.set('name', 'Bob')
print(redis.get('name')) # b'Bob'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这里我们传入了Redis的地址、运行端口、使用的数据库和密码信息。在默认不传的情况下,这4个参数分别为localhost、6379、0和None。首先声明了一个StrictRedis对象,接下来调用set()方法,设置一个键值对,然后将其获取并打印。

08. redis内部编码格式

Redis的五种数据结构的内部编码:type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合),但这些只是Redis对外的数据结构。
在这里插入图片描述
实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码。

可以看到每种数据结构都有两种以上的内部编码实现,例如string数据结构就包含了raw、int和embstr三种内部编码。

们可以通过object encoding命令查询内部编码:

127.0.0.1:6379> set set:1 hello
OK
127.0.0.1:6379> object encoding set:1
"embstr"
127.0.0.1:6379> hset user:1 name kebi
(integer) 1
127.0.0.1:6379> object encoding user:1
"ziplist"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

同时,有些内部编码可以作为多种外部数据结构的内部实现,例如ziplist就是hash、list和zset共有的内部编码。

Redis这样设计有两个好处:

第一,可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发开发出优秀的内部编码,无需改动外部数据结构和命令。

第二,多种内部编码实现可以在不同场景下发挥各自的优势。例如ziplist比较节省内存,但是在列表元素比较多的情况下,性能会有所下降,这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist。

我们在进行redis连接时候:decode_responses = True,目的就是自动进行转码

09. python操作redis数据库

常见的操作介绍:redis 连接池操作:

from redis import StrictRedis
import redis

pool = redis.ConnectionPool(host='118.31.2.156', port=6379, password='wristwaking520', decode_responses=True)
redis = StrictRedis(connection_pool=pool)
  • 1
  • 2
  • 3
  • 4
  • 5

有次在做浏览量排名的时候,传前端排序好的数据,那么就需要对字典进行排序(针对于字典的数值大小进行排序)展示如下:

按照字典值的大小对字典进行排序

利用zip函数将key值和value值位置进行颠倒,再使用sorted进行排序,例如:

from random import  randint
d= {k:randint(0,20) for k in 'abcdefg'}
#{'f': 10, 'g': 16, 'a': 18, 'c': 12, 'e': 16, 'd': 7, 'b': 16}
z = list(zip(d.values(),d.keys()))
# zip函数就是将输入的序列重新组合成每个元素都是元组的列表,其中每个元素由输入序列相同位置的元素组成
#[(10, 'f'), (16, 'g'), (18, 'a'), (12, 'c'), (16, 'e'), (7, 'd'), (16, 'b')]
print(sorted(zip(d.values(),d.keys())))
#[(7, 'd'), (10, 'f'), (12, 'c'), (16, 'b'), (16, 'e'), (16, 'g'), (18, 'a')]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

利用匿名函数进行排序

print(sorted(d.items(),key = lambda k : k[1]))
#[('d', 7), ('f', 10), ('c', 12), ('g', 16), ('e', 16), ('b', 16), ('a', 18)]
  • 1
  • 2

使用operator.itemgetter函数

import operator
print(sorted(d.items(), key=operator.itemgetter(1)))
#[('d', 7), ('f', 10), ('c', 12), ('g', 16), ('e', 16), ('b', 16), ('a', 18)]
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/518307
推荐阅读
相关标签
  

闽ICP备14008679号