一、StrictRedis方法
创建对象,指定host、port、db与指定的服务器端口连接,其中默认host为localhost、port为6379、db为0,不同类型调用的实例方法不同,与redis命令一致,方法需要的参数与命令参数一致
from redis import StrictRedis
sr =StrictRedis(host='localhost', port=6379, db=0)
# 简写:sr = StrictRedis()
二、pycharm使用StrictRedis方法对string类型的数据进行增删改查
方法说明
- set(key,value):存在则修改,不存在则新增,若成功返回True,否则返回false
- get(key):获取,若存在返回key所对应的value,否则返回None
- delete(key):删除key及所对应值,若成功返回受影响的键名,否则返回0
- keys():获取所有键,支持正则表达式
from redis import StrictRedis
if __name__ == '__main__':
try: # 连接获取外部资源要使用try
sr = StrictRedis() # 创建对象,与redis服务器建立连接
add = sr.set('name', 'YY') # 增加name键,值为YY,若添加成功返回true,否则返回false
print('是否增加成功:', add) # 输出结果
get = sr.get('name') # 获取键为name的值,若存在返回值,否则返回None
print('name的值为:', get)
modify = sr.set('name', 'YX') # 修改name键的值为YX
print('修改后name的值为:', sr.get('name'))
print('获取到的键为:', sr.keys()) # 获取所有键,aa为之前命令行添加的
delete = sr.delete('name')
delete2 = sr.delete('nam')
print('删除成功返回%d,删除失败返回%d' % (delete, delete2))
except Exception as e:
print(e)
输出:
若redis服务未启动,将输出如下错误
Error 10061 connecting to localhost:6379. 由于目标计算机积极拒绝,无法连接。
启动后输出:
是否增加成功: True
name的值为: b'YY'
修改后name的值为: b'YX'
获取到的键为: [b'aa', b'name']
删除成功返回1,删除失败返回0
三、搭建主从
主从理解
- 一个master主可以拥有多个slave从,一个slave又可有多个slave,由此形成多级服务器集群架构
- master主用来写数据
- slave从用来读数据
- 通过主从配置可以实现读写分离,网站读写比例为10:1
3.1主配置
1.使用ifconfig命令查看ip
2.切换至/etc/redis目录下,执行命令sudo vi redis.conf进入文件
3.修改bind绑定的ip
4.按esc退出编辑,进入命令行模式,执行命令:wq保存并退出
3.2 配置从
1.复制redis.conf命名为slave.conf
3.执行命令sudo redis-server slave.conf启动redis服务
2.打开slave.conf并修改slave.conf中的以下内容
1.修改端口:port 6378
2.找到指定位置新增:slaveof 192.168.76.128 6379
4.查看主从关系
执行命令:redis-cli -h 192.168.76.128 info replication
3.3 数据操作
1.执行命令进入master主客户端
redis-cli -h 192.168.76.128 -p 6379
2.执行命令进入slave从客户端
redis-cli -h 192.168.76.128 -p 6378
四、搭建集群
主从可以一主多从,但若同时访问量过大则不再适用,如大型企业在全国会有很多服务器(华东、华南、华中……)
集群:是一组相互独立的、通过高速网络互联的计算机,其构成了一个组,并以单一系统模式加以管理,一个客户与集群相互作用时,集群像是一个独立的服务器,集群配置是用于提高可用性和可缩放性,当请求到来时先由负载均衡服务器处理,将请求转发到另外一台服务器上
分类
- 软件层面:只有一台电脑,在该电脑上启动了多个redis服务
- 硬件层面:有多台实体电脑,每台电脑上都启动了一个redis或多个redis服务
4.1 创建conf文件
在Desktop目录下创建cluster文件夹,并创建7000.conf文件
4.2 在conf文件中添加内容
在7000.conf文件中编辑并添加如下内容
# 端口号
port 7000
# 访问的ip
bind 192.168.76.128
# 是否以守护进程(后台)方式运行
daemonize yes
# pid文件
pidfile 7000.pid
# 是否使用集群
cluster-enabled yes
# 集群文件
cluster-config-file 7000_node.conf
# 集群的超时时间
cluster-node-timeout 15000
# 备份相关
appendonly yes
4.3 复制 conf文件
复制文件7000.conf并分别命名为7001.conf、7002.conf、7003.conf、7004.conf和7005.conf
4.3 修改conf文件
进入各个复制的文件,分别修改所选值
如7001.conf文件修改如下
4.4 使用conf配置文件启动redis服务
切换至cluster目录,运行redis-server加载这6个配置文件
查看进程
4.5 创建集群
若redis为5.0以上版本,可直接跳过该步骤,改用redis-cli创建集群
切换至redis安装目录下的src目录下,执行以下指令将redis-trib.rb拷贝到/usr/local/bin/目录下,redis-trib.r用于创建集群,复制后可在任何目录下调用次命令
sudo cp redis-trib.rb /usr/local/bin/
运行命令创建集群
redis-trib.rb create --replicas 1 192.168.76.128:7000 192.168.76.128:7001 192.168.76.128:7002 192.168.76.128:7003 192.168.76.128:7004 192.168.76.128:7005
可能运行失败,报警告warning:redis-trib.rb is not longer available,直接按提示即可
4.6 改用以下命令创建集群
redis-cli --cluster create 192.168.76.128:7000 192.168.76.128:7001 192.168.76.128:7002 192.168.76.128:7003 192.168.76.128:7004 192.168.76.128:7005 --cluster-replicas 1
如下,创建的一主一从,三个节点
至此集群搭建成功
4.6 数据验证
从上图看看出,搭建的master主服务器为7000、7001、7002,slave从服务器为7003、7004、7005
连接7000,-c表示连接到集群
连接命令:redis-cli -h 192.168.76.128 -p 7000 -c
写入数据,自动跳到了7001,写入成功
说明
- redis cluster的设计具有去中心化和去中间件的特性,即集群中的每个节点都是平等的关系,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,且连接保持活跃,由此保证了我们只需要连接集群中的任意⼀个节点,就可以获取到其他节点的数据
- Redis集群没有用传统的⼀致性哈希来分配数据,而是采用⼀种叫做哈希槽 (hash slot)的方式。redis cluster默认分配了16384个slot,当我们 set⼀个key时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法为:CRC16(key) % 16384。所以我们在测试set和get的时候,直接跳转到了7000端口的节点
- Redis集群会把数据存在⼀个master节点,然后在这个master和其对应的salve之间进行数据同步。当读取数据时,也根据⼀致性哈希算法到对应的master节点获取数据。只有当⼀个master挂掉之后,才会启动⼀个对应的salve节点,充当master
- 需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的⼀半时,整个集群就无法提供服务了
五、pycharm使用RedisCluster()方法与集群交互实现增删改查
安装redis-py-cluster命令:pip install redis-py-cluster
from rediscluster import RedisCluster
if __name__ == '__main__':
try:
# 构建所有的节点,redis会用CRC16算法将键和值写到某个节点上
nodes = [
{'host': '192.168.76.128', 'port': '7000'},
{'host': '192.168.76.128', 'port': '7001'},
{'host': '192.168.76.128', 'port': '7002'}
]
src = RedisCluster(startup_nodes=nodes, decode_responses=True) # 构建RedisCluster对象
result = src.set('tel', 99999) # 新增key为tel的值
print(result)
tel = src.get('tel') # 获取key为tel的值
print(tel)
except Exception as e:
print(e)
输出:
True
99999
程序运行前后命令行查看值