通俗易懂的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

安装过程

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

下载Redis

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

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

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

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

2.2 解压Redis

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

tar -zvxf redis-6.2.5.tar.gz

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

mv ./redis-6.2.13 /opt/redis

2.3 安装Redis

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

make

再输入如下命令进行安装

make PREFIX=/opt/redis install

2.4 Redis启动

前台启动

./redis-server

Ctrl + C 退出前台启动

后台启动

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

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

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

vim redis.conf

之后:wq保存退出

指定配置文件启动redis

./redis-server redis.conf

2.5 查看Redis是否启动成功

查看redis是否在后台运行

ps -ef | grep redis

2.6 Redis客户端连接

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

./redis-cli

3 Redis基础配置

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

3.1 查看Redis配置文件

通过vim查看redis配置文件

 vim /opt/redis/redis.conf

3.2 Redis配置文件解释

3.2.1 绑定ip

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

3.2.2 端⼝

3.2.3 是否以守护进程运⾏

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

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

3.2.4 数据⽂件

3.2.5 数据⽂件存储路径

⽇志⽂件

默认不保存日志文件

数据库

数据库的数量默认为16个

4 Redis命令

4.1 服务器端命令

启动redis服务器

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

redis-server

查看帮助文档

redis-server --help

查看redis服务器进程

ps aux | grep redis

杀死redis服务器

kill -9 32392

加载指定的文件

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

4.2 客户端命令

连接服务端

redis-cli

查看帮助文档

redis-cli --help

测试连接

ping

切换数据库

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

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

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

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

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

setex key seconds value

例子

setex book 3 power

3 设计多个键值

mset key1 value1 key2 value2 ...

例子

mset name1 zhangsan name2 lisi name3 wangwu name4 zhaoliu

4 增加值

append key value

例子

# 向name1 追加hahaha
append name1 hahaha

获取

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

get key

例子:

# 获取name1的值
get name1

2 根据多个键获取多个值

mget key1 key2 ...

例子:

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

删除

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

例子

# 删除name
del name

5.2 key的相关命令

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

keys pattern

例子

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

2 判断键是否存在

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

exists key1

例子

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

3 查看键对应的value的类型

type key

例子

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

4 删除键及对应的值

del key1 key2 ...

例子

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

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

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

expire key seconds

例子

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

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

ttl key

例子

ttl name1 # 查看name1的有效时间

5.3 hash命令

5.3.1 增加、修改

1 设置单个属性

hset key field value

例子

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

2 设置多个属性

hmset key field1 value1 field2 value2 ...

例子

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

5.3.2 获取

1 获取指定键所有的属性

hkeys key

例子

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

2 获取⼀个属性的值

hget key field

例子

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

3 获取多个属性的值

hmget key field1 field2 ...

例子

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

4 获取所有属性的值

hvals key

例子

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

5.3.3 删除

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

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

hdel key field1 field2 ...

例子

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

5.4 list命令

5.4.1 增加

1 在左侧插⼊数据

lpush key value1 value2 ...

例子

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

2 在右侧插⼊数据

rpush key value1 value2 ...

例子

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

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

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

例子

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

5.4.2 获取

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

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

例子

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

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

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

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

lset key index value

例子

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

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`的所有元素

5.5 set命令

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

5.5.1 增加

1 添加元素

sadd key member1 member2 ...

例子

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

5.5.2 获取

1 返回所有的元素

smembers key

例子

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

5.5.3 删除

1 删除指定元素

srem key

例子

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

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`

5.6.2 获取

1 返回指定范围内的元素

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

zrange key start stop

例子:

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

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

zrangebyscore key min max

例子

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

3 返回成员memberscore

zscore key member

例子:

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

5.6.3 删除

1 删除指定元素

zrem key member1 member2 ...

例子

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

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

zremrangebyscore key min max

例子:

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

6 Python与Redis交互

6.1 安装pythonRedis模块

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

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

首先采用vim打开配置文件

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

# bind 127.0.0.1
bind 0.0.0.0

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

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

daemonize yes

3 关闭保护模式

protected-mode no

4 设置密码(不必须)

在 #requirepass foobared 去掉 # 号变requirepass foobared ,注:foobared是密码;

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

5 启动redis

./redis-server ./redis.conf

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)

运行结果

由此可见,连接成功

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)

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)

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)

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)

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"))

获取键

  • ⽅法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)

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

7 Redis主从搭建

7.1 主从概念

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

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

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

  • 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

3 启动redis服务

./redis-server ./redis.conf

7.2.2 配置从(replicaof)

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

cp redis.conf ./slave.conf

2 修改redis/slave.conf文件

vim slave.conf

3 编辑内容

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

4 redis服务

redis-server slave.conf

5 查看主从关系

redis-cli -h 10.0.0.15 info Replication

7.3 数据操作

1 连接主服务器

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

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

2 连接从服务器

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

3 在master上写数据

set name zhangsan

4 在slave上读数据

get name

注意

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

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

8 Redis搭建集群(未完成)

8.1 集群的概念

1 为什么要有集群

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

2 集群的概念

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

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

3 redis集群

  • 分类

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

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

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

9.1 优点

  1. 免费且跨平台

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

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

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

9.2 安装

安装完成

9.3 基础使用

1 建立连接

连接成功

2 基础设置

3 命令行

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

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

1. 通俗易懂的Redis基础的更多相关文章

  1. windows下使用redis,Redis入门使用,Redis基础命令

    windows下使用redis,Redis入门使用,Redis基础命令 >>>>>>>>>>>>>>>> ...

  2. [.net 面向对象程序设计深入](14)Redis——基础

    [.net 面向对象程序设计深入](14)Redis——基础 很长一段时间没更新博客了,坚持做一件事,真不是件容易的事,后面我会继续尽可能的花时间更新完这个系列文章. 因这个系列的文章涉及的范围太大了 ...

  3. linux redis基础应用 主从服务器配置

    Redis基础应用 redis是一个开源的可基于内存可持久化的日志型,key-value数据库redis的存储分为内存存储,磁盘存储和log文件三部分配置文件中有三个参数对其进行配置 优势:和memc ...

  4. [.net 面向对象程序设计深入](36)Redis——基础

    [.net 面向对象程序设计深入](36)Redis——基础 很长一段时间没更新博客了,坚持做一件事,真不是件容易的事,后面我会继续尽可能的花时间更新完这个系列文章. 因这个系列的文章涉及的范围太大了 ...

  5. mysql主从复制、redis基础、持久化和主从复制

    一.mysql(mariadb)基础 1.基础命令(centos7操作系统下) 1.启动mysql systemctl start mariadb 2.linux客户端连接自己 mysql -uroo ...

  6. Redis基础用法、高级特性与性能调优以及缓存穿透等分析

     一.Redis介绍 Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库.缓存服务或消息服务使用.Redis支持多种数据结构,包括字符串.哈希表.链表.集合.有序集合.位图.Hype ...

  7. Redis基础知识补充及持久化、备份介绍(二)--技术流ken

    Redis知识补充 在上一篇博客<Redis基础认识及常用命令使用(一)--技术流ken>中已经介绍了redis的一些基础知识,以及常用命令的使用,本篇博客将补充一些基础知识以及redis ...

  8. Spring-Boot之Redis基础

    Spring-Boot之Redis基础 准备 Redis下载地址:github.com/MSOpenTech/redis/releases Redis数据库的默认端口号是 6379 开启Redis服务 ...

  9. mongodb,Mysql,redis基础教程

    数据库基础 1:mongodb基础教程 1:pymongo基础教程  2:Mysql基础教程 3:redis基础教程

  10. Redis基础知识点面试手册

    Redis基础知识点面试手册 基础 概述 数据类型 STRING LIST SET HASH ZSET(SORTEDSET) 数据结构 字典 跳跃表 使用场景 会话缓存 缓存 计数器 查找表 消息队列 ...

随机推荐

  1. 原来Spring能注入集合和Map的computeIfAbsent是这么好用!

    大家好,我是3y,今天继续来聊我的开源项目austin啊,但实际内容更新不多.这文章主是想吹下水,主要聊聊我在更新项目中学到的小技巧. 今天所说的小技巧可能有很多人都会,但肯定也会有跟我一样之前没用过 ...

  2. 一站式统一返回值封装、异常处理、异常错误码解决方案—最强的Sping Boot接口优雅响应处理器

    作者:京东物流 覃玉杰 1. 简介 Graceful Response是一个Spring Boot体系下的优雅响应处理器,提供一站式统一返回值封装.异常处理.异常错误码等功能. 使用Graceful ...

  3. 配置pip源

    1.使用配置文件配置文件[global]trusted-host=pypi.doubanio.comindex-url=https://pypi.doubanio.com/simple配置文件放置位置 ...

  4. React笔记-Hooks(九)(非常全面)

    React笔记-Hooks(九) Hooks 概念 React Hooks 的意思是 组件尽量写成纯函数 如果需要外部功能和副作用 就用钩子把外部代码"钩"进来 函数组件和类组件区 ...

  5. flutter填坑之旅(有状态组件StatefulWidget)

    今天我们来看看flutter的StatefulWidget(有状态组件),最常用就是app 主页的底部导航栏的应用 效果图 首页 关于 我的 statefull-widget-learn .dart ...

  6. docker升级gitlab

    昨天在家部署了gitlab,版本居然是15.10,公司版本却是14.6,升级一波. 官方文档: https://docs.gitlab.com/ee/update/#upgrading-without ...

  7. 代码随想录算法训练营Day46 动态规划

    代码随想录算法训练营 代码随想录算法训练营Day46 动态规划| ●  139.单词拆分 关于多重背包,你该了解这些! 背包问题总结篇! 139.单词拆分 题目链接:139.单词拆分 给定一个非空字符 ...

  8. BFF层聚合查询服务异步改造及治理实践 | 京东云技术团队

    首先感谢王晓老师的[接口优化的常见方案实战总结]一文总结,恰巧最近在对稳健理财BFF层聚合查询服务优化治理,针对文章内的串行改并行章节进行展开,分享下实践经验,主要涉及原同步改异步的过程.全异步化后衍 ...

  9. [Kotlin Tutorials 22] 协程中的异常处理

    协程中的异常处理 Parent-Child关系 如果一个coroutine抛出了异常, 它将会把这个exception向上抛给它的parent, 它的parent会做以下三件事情: 取消其他所有的ch ...

  10. Pytorch-PyG图神经网络依赖环境安装(Anaconda)

    1.默认用户在Anaconda的虚拟环境中已安装Pytorch 2.打开anaconda prompt命令窗, activate "你的虚拟环境名称" 3.在激活后的虚拟环境下输入 ...