1. 通俗易懂的Redis基础

发布时间 2023-07-22 12:33:01作者: LikeF_new

通俗易懂的Redis基础教程(基于CentOS 7)

目录

1 Redis是什么

1.1 NoSQL概念

NoSQL:一类新出现的数据库(not only sql)

  • 泛指非关系型的数据库
  • 不支持SQL语法
  • 存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式
  • NoSQL的世界中没有一种通用的语言,每种nosql数据库都有自己的api和语法,以及擅长的业务场景
  • NoSQL中的产品种类相当多:
    • Redis
    • Mongodb
    • Hbase hadoop
    • Cassandra hadoop

1.2 NoSQL与SQL比较

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

1.3 Redis简介

  • Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
  • Redis是 NoSQL技术阵营中的一员,它通过多种键值数据类型来适应不同场景下的存储需求,借助一些高层级的接口使用其可以胜任,如缓存、队列系统的不同角色

1.4 Redis特性

  • Redis 与其他 key - value 缓存产品有以下三个特点:
  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

1.5 Redis优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

1.6 Redis应用场景

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

2 Redis安装

2.1 Redis官网下载

安装gcc依赖

由于Redis是基于C语言开发的,并且后续要采用gcc进行编译,因此这里提前安装gcc,防止后续出现错误

命令:

yum install -y gcc 

安装过程

image-20230716162758012

本机电脑的yum文件已经存在

下载Redis

可以在Redis的官网找到要下载的版本的地址,之后右键复制下载链接,我这里下载的是一个旧版本

官网地址:https://redis.io/download/

(官网首页被墙了,但是download页面没有被墙)

image-20230716161007897

wget https://download.redis.io/releases/redis-6.2.13.tar.gz

image-20230716163033757

2.2 解压Redis

这里将redis解压在/opt/models下的redis文件夹里

tar -zvxf redis-6.2.5.tar.gz

image-20230716163129526

将redis文件移动到/opt/redis下面

mv ./redis-6.2.13 /opt/redis

image-20230716163302667

2.3 安装Redis

进入到redis目录输入make执行编译命令

make

image-20230716163504483

image-20230716163554379

再输入如下命令进行安装

make PREFIX=/opt/redis install

image-20230716163707042

2.4 Redis启动

前台启动

./redis-server

image-20230716163906491

Ctrl + C 退出前台启动

后台启动

从 redis 的源码目录中复制 redis.conf 到 redis 的安装目录(默认是采用redis下的redis.conf文件启动客户端,这里对文件进行复制,并修改为后台启动后指定配置文件执行redis-server命令)

cp /opt/redis/redis.conf /opt/redis/bin/

image-20230716164249503

修改 redis.conf 文件,把 daemonize no 改为 daemonize yes

vim redis.conf

image-20230716164314601

image-20230716164423919

之后:wq保存退出

指定配置文件启动redis

./redis-server redis.conf

image-20230716164546453

2.5 查看Redis是否启动成功

查看redis是否在后台运行

ps -ef | grep redis

image-20230716164623208

2.6 Redis客户端连接

./redis-cli是连接本地redis服务的一个命令,通过该命令后可以既可控制redis的脚本控制台

./redis-cli

image-20230716164819869

3 Redis基础配置

Redis的配置信息在/etc/redis/redis.conf下。

3.1 查看Redis配置文件

通过vim查看redis配置文件

 vim /opt/redis/redis.conf

image-20230716165129891

3.2 Redis配置文件解释

3.2.1 绑定ip

如果需要远程访问,可将此⾏注释,或绑定⼀个真实ip(第91行)

image-20230716165330742

3.2.2 端⼝

image-20230716165446337

3.2.3 是否以守护进程运⾏

  • 如果以守护进程运⾏,则不会在命令⾏阻塞,类似于服务
  • 如果以⾮守护进程运⾏,则当前终端被阻塞
  • 设置为yes表示守护进程,设置为no表示⾮守护进程
  • 推荐设置为yes

如果不理解守护进程的概念,可以暂时理解为是否以后台程序的方式运行

image-20230716165600203

3.2.4 数据⽂件

image-20230716165812019

3.2.5 数据⽂件存储路径

image-20230716165747407

⽇志⽂件

image-20230716170140420

默认不保存日志文件

数据库

数据库的数量默认为16个

image-20230716165636590

4 Redis命令

4.1 服务器端命令

启动redis服务器

这里不指定配置文件,会默认采用redis安装目录下redis.conf作为配置文件

redis-server

image-20230716171949419

查看帮助文档

redis-server --help

image-20230716172055341

查看redis服务器进程

ps aux | grep redis

image-20230716172258324

杀死redis服务器

kill -9 32392

image-20230716172431395

加载指定的文件

redis-server ./redis.conf #采用指定的配置文件启动redis服务器

image-20230716172230920

4.2 客户端命令

连接服务端

redis-cli

image-20230716172515384

查看帮助文档

redis-cli --help

image-20230716172122589

测试连接

ping

image-20230716172540254

切换数据库

数据库没有名称,默认有16个,通过0-15来标识,连接redis默认选择第一个数据库

select 10 #切换到第10个数据库

image-20230716172559095

5 Redis数据操作

5.0 Redis的数据结构

redis是key-value的数据结构,每条数据都是⼀个键值对,键的类型是字符串,键不能重复

redis中值的类型分为五种:

  • 字符串string
  • 哈希hash
  • 列表list
  • 集合set
  • 有序集合zset

redis中的数据操作行为主要有:保存、修改、获取、删除

5.1 String

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

保存

1 添加键值对

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

set key value

例子

set name zhangsan
set idcard 1456789

image-20230716174339436

2 添加键值对并设置过期时间(以秒为单位)

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

setex key seconds value

例子

setex book 3 power

image-20230716174732911

3 设计多个键值

mset key1 value1 key2 value2 ...

例子

mset name1 zhangsan name2 lisi name3 wangwu name4 zhaoliu

image-20230716174827943

4 增加值

append key value

例子

# 向name1 追加hahaha
append name1 hahaha

image-20230716174838993

获取

1 根据键获取值,如果不存在此键则返回nil

get key

例子:

# 获取name1的值
get name1

image-20230716174852980

2 根据多个键获取多个值

mget key1 key2 ...

例子:

# 获取name1 name2 和 name3的值
mget name1 name2 name3 name4

image-20230716174905633

删除

# 删除键的时候会删除对应的值
del key

例子

# 删除name
del name

image-20230716174932512

5.2 key的相关命令

1 查找键,参数⽀持正则表达式

keys pattern

例子

keys * # 查看全部的键值对
keys n* # 匹配n开头的键

image-20230717213505494

2 判断键是否存在

如果键存在返回1,不存在返回0

exists key1

例子

EXISTS age #查看age键是否存在
EXISTS name #查看name键是否存在
EXISTS name10 #查看age10键是否存在

image-20230717213650058

3 查看键对应的value的类型

type key

例子

type name #查看name键对应的value类型
type name1 #查看name1键对应的value类型

image-20230717213858355

4 删除键及对应的值

del key1 key2 ...

例子

EXISTS name # 查看name键是否存在
del name # 删除name键
EXISTS name # 查看name键是否仍然存在

image-20230717214033667

5 设置键的过期时间,以秒为单位

如果没有指定过期时间则⼀直存在,直到使⽤DEL移除

expire key seconds

例子

expire name1 30 # 设置name1的过期时间为30秒

image-20230717214442671

6 查看键值对的有效时间,以秒为单位

ttl key

例子

ttl name1 # 查看name1的有效时间

image-20230717214551950

5.3 hash命令

5.3.1 增加、修改

1 设置单个属性

hset key field value

例子

hset book name PrideAndPrejudice #设置键book的属性name为`PrideAndPrejudice`

image-20230717220310334

2 设置多个属性

hmset key field1 value1 field2 value2 ...

例子

hmset user name zhangsan age 17 # 设置键user的属性`name`为`zhangsan`、属性`age`为`17`

image-20230717220002944

5.3.2 获取

1 获取指定键所有的属性

hkeys key

例子

hkeys user # 获取键user的所有属性

image-20230717220327318

2 获取⼀个属性的值

hget key field

例子

hget user name #获取键`u2`属性`name`的值

image-20230717220348406

3 获取多个属性的值

hmget key field1 field2 ...

例子

hmget user name age # 获取键user属性name、age的值

image-20230717220438529

4 获取所有属性的值

hvals key

例子

hvals user # 获取键`user`所有属性的值
hvals book

image-20230717220510094

5.3.3 删除

1 删除整个hash键及值,使⽤del命令

删除属性,属性对应的值会被⼀起删除

hdel key field1 field2 ...

例子

hdel user age # 删除键`user`的属性`age`

image-20230717220553649

5.4 list命令

5.4.1 增加

1 在左侧插⼊数据

lpush key value1 value2 ...

例子

lpush a1 a b c # 从键为a1的列表左侧加⼊数据a,b,c

image-20230717221836861

2 在右侧插⼊数据

rpush key value1 value2 ...

例子

rpush a1 0 1 #从键为`a1`的列表右侧加⼊数据`0、1`

image-20230717221924913

3 在指定元素的前或后插⼊新元素

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

例子

linsert a1 before b 3 #在键为`a1`的列表中元素`b`前加⼊`3`

image-20230717221951621

5.4.2 获取

1 返回列表⾥指定范围内的元素

  • startstop为元素的下标索引
  • 索引从左侧开始,第⼀个元素为0
  • 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
lrange key start stop

例子

lrange a1 0 -1 #获取键为a1的列表所有元素

image-20230717222011524

5.4.3 设置指定索引位置的元素值

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

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

lset key index value

例子

lset a1 1 zhangsan #修改键为a1的列表中下标为1的元素值为zhangsan

image-20230717222044622

5.4.4 删除

1 删除指定元素

  • 将列表中前count次出现的值为value的元素移除
  • count > 0: 从头往尾移除
  • count < 0: 从尾往头移除
  • count = 0: 移除所有
lrem key count value

例子

lpush a2 a b a b a b # 向列表`a2`中加⼊元素`a、b、a、b、a、b`
lrange a2 0 -1 #查看列表`a2`的所有元素
lrem a2 -2 b # 从`a2`列表右侧开始删除2个`b`
lrange a2 0 -1 #查看列表`a2`的所有元素

image-20230717222142091

5.5 set命令

  • ⽆序集合
  • 元素为string类型
  • 元素具有唯⼀性,不重复
  • 说明:对于集合没有修改操作

5.5.1 增加

1 添加元素

sadd key member1 member2 ...

例子

sadd a3 zhangsan lisi wangwu zhaoliu #向键`a3`的集合中添加元素`zhangsan`、`lisi`、`wangwu`

image-20230717222934384

5.5.2 获取

1 返回所有的元素

smembers key

例子

smembers a3 # 获取键`a3`的集合中所有元素

image-20230717223009810

5.5.3 删除

1 删除指定元素

srem key

例子

srem a3 wangwu # 删除键`a3`的集合中元素`wangwu`

image-20230717223213144

5.6 zset命令

  • sorted set,有序集合
  • 元素为string类型
  • 元素具有唯⼀性,不重复
  • 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
  • 说明:没有修改操作

5.6.1 增加

1 添加zset

zadd key score1 member1 score2 member2 ...

例子

zadd zddlist 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan
# 向键`a4`的集合中添加元素`lisi`、`wangwu`、`zhaoliu`、`zhangsan`,权重分别为`4、5、6、3`

image-20230722075920274

5.6.2 获取

1 返回指定范围内的元素

start、stop为元素的下标索引;索引从左侧开始,第⼀个元素为0;索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素

zrange key start stop

例子:

zrange zddlist 0 -1 # 获取键`a4`的集合中所有元素

image-20230722080009283

2 返回score值在minmax之间的成员

zrangebyscore key min max

例子

zrangebyscore zddlist 5 6 # 获取键`a4`的集合中权限值在`5和6之间`的成员 

image-20230722080107577

3 返回成员memberscore

zscore key member

例子:

zscore zddlist zhangsan #获取键`a4`的集合中元素`zhangsan`的权重

image-20230722080306922

5.6.3 删除

1 删除指定元素

zrem key member1 member2 ...

例子

zrem zddlist zhangsan # 删除集合`zddlist`中元素`zhangsan`

image-20230722080433333

2 删除权重在指定范围的元素

zremrangebyscore key min max

例子:

zremrangebyscore zddlist 5 6 # 删除集合`a4`中权限在`5、6之间`的元素

image-20230722080508562

6 Python与Redis交互

6.1 安装pythonRedis模块

pip install redis #直接pip install redis安装redis库

image-20230722081338323

由于我这里是采用的Windos主机连接的Linux中的Redis,因此要对Redis的配置文件进行一些修改,使其能够支持远程访问

首先采用vim打开配置文件

image-20230722083304407

1 打开配置文件把下面对应的注释掉

# bind 127.0.0.1 
bind 0.0.0.0

image-20230722083522355

2 修改Redis为守护进程运行方式

Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程,设置为no

daemonize yes

image-20230722084132804

3 关闭保护模式

protected-mode no 

4 设置密码(不必须)
在 #requirepass foobared 去掉 # 号变requirepass foobared ,注:foobared是密码;

# 设置密码为xxxxxx,密码设置默认是被注释掉的
requirepass password

image-20230722083831367

5 启动redis

./redis-server ./redis.conf

image-20230722084427388

6.2 StrictRedis对象方法

概述

  • 通过init创建对象,指定参数host、port与指定的服务器和端⼝连接,host默认为localhost,port默认为6379,db默认为0
sr = StrictRedis(host='localhost', port=6379, db=0)
简写
sr=StrictRedis()
  • 根据不同的类型,拥有不同的实例⽅法可以调⽤,与前⾯学的redis命令对应,⽅法需要的参数与命令的参数⼀致

例子

通过Pycharm运行Python文件处理Redis

from redis import StrictRedis

if __name__=="__main__":
    sr = StrictRedis(host='43.136.178.120', port=6379, db=0,password="xxxxxxx")
    result = sr.set('name', 'itheima')
    print(result)

运行结果

image-20230722084643384

由此可见,连接成功

image-20230722090731078

6.3 使用StrictRedis对象对Redis中的数据进行增删改查

1 准备

from redis import StrictRedis

if __name__=="__main__":
    try:
        # 建立连接
        st = StrictRedis(host="43.136.178.120",port=6379,
                         db=0,password=" 123456")
    except Exception as e:
        print("----------------Redis连接建立失败-------------------")
        print(e)

image-20230722085151127

string-增加

  • ⽅法set,添加键、值,如果添加成功则返回True,如果添加失败则返回False
  • 编写代码如下
from redis import StrictRedis

if __name__=="__main__":
    try:
        # 建立连接
        st = StrictRedis(host="43.136.178.120",port=6379,
                         db=0,password=" 123456")
    except Exception as e:
        print("----------------Redis连接建立失败-------------------")
        print(e)
    # 1.String添加
    result = st.set("name","zhangsan")
    # 输出响应结果,响应成功
    print(result)

image-20230722085339459

string-获取

  • ⽅法get,添加键对应的值,如果键存在则返回对应的值,如果键不存在则返回None
  • 编写代码如下
from redis import StrictRedis

if __name__=="__main__":
    try:
        # 建立连接
        st = StrictRedis(host="43.136.178.120",port=6379,
                         db=0,password=" 123456")
    except Exception as e:
        print("----------------Redis连接建立失败-------------------")
        print(e)

    # 2.String获取
    result = st.get("name")
    # 输出响应结果
    print(result)

image-20230722085517667

string-修改

  • ⽅法set,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
  • 编写代码如下
from redis import StrictRedis

if __name__=="__main__":
    try:
        # 建立连接
        st = StrictRedis(host="43.136.178.120",port=6379,
                         db=0,password=" 123456")
    except Exception as e:
        print("----------------Redis连接建立失败-------------------")
        print(e)

    # 3.String修改
    result = st.set("name","lisi")
    # 输出响应结果
    print(result)

image-20230722085627770

string-删除

  • ⽅法delete,删除键及对应的值,如果删除成功则返回受影响的键数,否则则返 回0
  • 编写代码如下
from redis import StrictRedis

if __name__=="__main__":
    try:
        # 建立连接
        st = StrictRedis(host="43.136.178.120",port=6379,
                         db=0,password=" 123456")
    except Exception as e:
        print("----------------Redis连接建立失败-------------------")
        print(e)
    # 4.String删除
    result = st.delete("name")
    # 输出响应结果
    print(result)
    print(st.get("name"))

image-20230722085728851

获取键

  • ⽅法keys,根据正则表达式获取键
  • 编写代码如下
from redis import StrictRedis

if __name__=="__main__":
    try:
        # 建立连接
        st = StrictRedis(host="43.136.178.120",port=6379,
                         db=0,password=" 123456")
    except Exception as e:
        print("----------------Redis连接建立失败-------------------")
        print(e)

    # 5.String全部键查找
    result = st.keys()
    # 输出响应结果
    print(result)

image-20230722085856935

其他调用函数的方法和命令行命令并没有什么区别,因此不在这里一一展示

7 Redis主从搭建

7.1 主从概念

  • ⼀个master(主服务器)可以拥有多个slave(从服务器),⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构

  • master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1

  • 通过主从配置可以实现读写分离

    image-20230722090236144

  • master和slave都是一个redis实例(redis服务)

7.2 主从配置

7.2.1 配置主(master)

1 查看当前主机的网卡地址

ifconfig #查看的不是主机ip地址,而是网卡地址

2 修改/etc/redis/redis.conf文件

vim redis.conf
bind 10.0.0.15

image-20230722091343630

3 启动redis服务

./redis-server ./redis.conf

image-20230722091405304

7.2.2 配置从(replicaof)

1 复制/opt/redis/bin/redis.conf文件

cp redis.conf ./slave.conf

image-20230722092019205

2 修改redis/slave.conf文件

vim slave.conf

image-20230722093010620

3 编辑内容

bind 10.0.0.15 #绑定网卡地址
replicaof 10.0.0.15 6379 # 设置其对应的主服务器为10.0.0.15 6379 老版本对应的是slaveof
port 6378 # 设置端口为6378
masterauth 123456 #由于之前给主服务器设置了密码,因此这里要指定密码
# 同时将redis从服务器的密码取消掉

image-20230722092758372

image-20230722092738041

image-20230722092923982

image-20230722094005579

4 redis服务

redis-server slave.conf

image-20230722093122189

5 查看主从关系

redis-cli -h 10.0.0.15 info Replication

image-20230722094558034

7.3 数据操作

1 连接主服务器

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

/opt/redis/bin/redis-cli -h 43.136.178.120 -p 6379 -a 123456

image-20230722095822150

2 连接从服务器

/opt/redis/bin/redis-cli -h 10.0.0.15 -p 6378

image-20230722100034386

3 在master上写数据

set name zhangsan

image-20230722095717242

4 在slave上读数据

get name

image-20230722100105543

注意

Redis从服务器通常(默认情况下)被配置为仅与主服务器连接,并且不允许外网连接。这是因为从服务器的主要目的是从主服务器接收数据并复制它们,以提供冗余和恢复能力。为了确保数据安全性,从服务器应该仅与主服务器连接,并且不应该直接暴露于公共网络中。

因此/opt/redis/bin/redis-cli -h 43.136.178.120 -p 6378是连接不上redis服务器的。

8 Redis搭建集群(未完成)

8.1 集群的概念

1 为什么要有集群

  • 之前我们已经讲了主从的概念,一主可以多从,如果同时的访问量过大(1000w),主服务肯定就会挂掉,数据服务就挂掉了或者发生自然灾难
  • 大公司都会有很多的服务器(华东地区、华南地区、华中地区、华北地区、西北地区、西南地区、东北地区、台港澳地区机房)

2 集群的概念

  • 集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性

当请求到来首先由负载均衡服务器处理,把请求转发到另外的一台服务器上。

3 redis集群

  • 分类
    • 软件层面
    • 硬件层面
  • 软件层面:只有一台电脑,在这一台电脑上启动了多个redis服务。

image-20230722100732224

  • 硬件层面:存在多台实体的电脑,每台电脑上都启动了一个redis或者多个redis服务。

image-20230722100750855

4 搭建集群

  • 当前拥有两台主机172.16.179.130、172.16.179.131,这⾥的IP在使⽤时要改为实际值

8.2 配置机器1

  • 在演示中,172.16.179.130为当前ubuntu机器的ip

  • 在172.16.179.130上进⼊Desktop⽬录,创建conf⽬录

  • 在conf⽬录下创建⽂件7000.conf,编辑内容如下

    port 7000
    bind 172.16.179.130
    daemonize yes
    pidfile 7000.pid
    cluster-enabled yes
    cluster-config-file 7000_node.conf
    cluster-node-timeout 15000
    appendonly yes
    
  • 在conf⽬录下创建⽂件7001.conf,编辑内容如下

    port 7001
    bind 172.16.179.130
    daemonize yes
    pidfile 7001.pid
    cluster-enabled yes
    cluster-config-file 7001_node.conf
    cluster-node-timeout 15000
    appendonly yes
    
  • 在conf⽬录下创建⽂件7002.conf,编辑内容如下

    port 7002
    bind 172.16.179.130
    daemonize yes
    pidfile 7002.pid
    cluster-enabled yes
    cluster-config-file 7002_node.conf
    cluster-node-timeout 15000
    appendonly yes
    
  • 总结:三个⽂件的配置区别在port、pidfile、cluster-config-file三项

  • 使⽤配置⽂件启动redis服务

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

8.3 配置机器2

  • 在演示中,172.16.179.131为当前ubuntu机器的ip

  • 在172.16.179.131上进⼊Desktop⽬录,创建conf⽬录

  • 在conf⽬录下创建⽂件7003.conf,编辑内容如下

    port 7003
    bind 172.16.179.131
    daemonize yes
    pidfile 7003.pid
    cluster-enabled yes
    cluster-config-file 7003_node.conf
    cluster-node-timeout 15000
    appendonly yes
    
  • 在conf⽬录下创建⽂件7004.conf,编辑内容如下

    port 7004
    bind 172.16.179.131
    daemonize yes
    pidfile 7004.pid
    cluster-enabled yes
    cluster-config-file 7004_node.conf
    cluster-node-timeout 15000
    appendonly yes
    
  • 在conf⽬录下创建⽂件7005.conf,编辑内容如下

    port 7005
    bind 172.16.179.131
    daemonize yes
    pidfile 7005.pid
    cluster-enabled yes
    cluster-config-file 7005_node.conf
    cluster-node-timeout 15000
    appendonly yes
    
  • 总结:三个⽂件的配置区别在port、pidfile、cluster-config-file三项

  • 使⽤配置⽂件启动redis服务

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

8.4 搭建集群

  • redis的安装包中包含了redis-trib.rb,⽤于创建集群

  • 接下来的操作在172.16.179.130机器上进⾏

  • 将命令复制,这样可以在任何⽬录下调⽤此命令

    sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/
    
  • 安装ruby环境,因为redis-trib.rb是⽤ruby开发的

    sudo apt-get install ruby

  • 在提示信息处输⼊y,然后回⻋继续安装

  • 运⾏如下命令创建集群

    redis-trib.rb create --replicas 1 172.16.179.130:7000 172.16.179.130:7001 172.16.179.130:7002 172.16.179.131:7003 172.16.179.131:7004 172.16.179.131:7005
    
  • 执⾏上⾯这个指令在某些机器上可能会报错,主要原因是由于安装的 ruby 不是最 新版本!

  • 天朝的防⽕墙导致⽆法下载最新版本,所以需要设置 gem 的源

  • 解决办法如下

    -- 先查看⾃⼰的 gem 源是什么地址
    gem source -l -- 如果是https://rubygems.org/ 就需要更换
    
    -- 更换指令为
    gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
    
    -- 通过 gem 安装 redis 的相关依赖
    sudo gem install redis
    
    -- 然后重新执⾏指令
    
    redis-trib.rb create --replicas 1 172.16.179.130:7000 172.16.179.130:7001 172.16.179.130:7002 172.16.179.131:7003 172.16.179.131:7004 172.16.179.131:7005
    
  • 提示如下主从信息,输⼊yes后回⻋

  • 提示完成,集群搭建成功

数据验证

  • 根据上图可以看出,当前搭建的主服务器为7000、7001、7003,对应的从服务器是7004、7005、7002

  • 在172.16.179.131机器上连接7002,加参数-c表示连接到集群

    redis-cli -h 172.16.179.131 -c -p 7002

  • 写⼊数据

    set name itheima

  • ⾃动跳到了7003服务器,并写⼊数据成功

  • 在7003可以获取数据,如果写入数据又重定向到7000(负载均衡)

在哪个服务器上写数据:CRC16

  • 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个或以上的主节点,否则在创建集群时会失败,并且当存 活的主节点数⼩于总节点数的⼀半时,整个集群就⽆法提供服务了

8.5 python与集群交互

  • 安装包如下

    pip install redis-py-cluster

  • redis-py-cluster源码地址https://github.com/Grokzen/redis-py-cluster

  • 创建⽂件redis_cluster.py,示例码如下

from rediscluster import *
if __name__ == '__main__':
  try:
    # 构建所有的节点,Redis会使⽤CRC16算法,将键和值写到某个节点上
    startup_nodes = [
        {'host': '192.168.26.128', 'port': '7000'},
        {'host': '192.168.26.130', 'port': '7003'},
        {'host': '192.168.26.128', 'port': '7001'},
    ]
    # 构建StrictRedisCluster对象
    src=StrictRedisCluster(startup_nodes=startup_nodes,decode_responses=True)
    # 设置键为name、值为itheima的数据
    result=src.set('name','itheima')
    print(result)
    # 获取键为name
    name = src.get('name')
    print(name)
  except Exception as e:
    print(e)

9 Redis可视化面板使用

Redis的可视化面板有很多,这里使用的是AnotherRedisDeskTopManager,虽然 Redis Desktop Manager真的很火,但是它收费啊,而这个是免费的

其他可视化工具的介绍,请翻看下列网站:2021 强烈推荐几款常用Redis可视化工具 - 知乎 (zhihu.com)

AnotherRedisDesktopManager 发行版 - Gitee.com

image-20230722103301011

9.1 优点

  1. 免费且跨平台

  2. 界面美观,支持深色模式

  3. 功能完善且占用内存小

    首先,它是开源的,可以直接在Github上下载安装,对于国内用户可以在码云上安装,并且自带简体中文

9.2 安装

image-20230722103533876

image-20230722103645351

image-20230722103705382

image-20230722103715078

安装完成

9.3 基础使用

1 建立连接

image-20230722105548368

image-20230722105640269

连接成功

2 基础设置

image-20230722110215773

3 命令行

image-20230722105944433

其他都是一些增删改查的基础操作,这里不再进行演示

总的来说,这是一个非常中规中矩的免费的Redis可视化工具