Redis总结(基础,持久化,集群,分布式)

目录

 

Redis 基础

安装

核心配置

服务端和客户端命令

数据操作

与python交互

Redis事务

Python客户端操作事务

Redis持久化

RDB 快照持久化

RDB恢复数据

RDB优缺点:

AOF 追加文件持久化

AOF数据恢复

AOK优缺点:

Redis高可用高稳定

redis主从搭建(复制集)

Redis主从同步配置

主从机器 (复制集) 集群的管理sentinel 哨兵

哨兵sentinel的作用:

配置文件:

启动服务器:

Python客户端使用哨兵

Reids Cluster集群

Reids Cluster配置

Reids Cluster集群与python的交互

 


Redis 基础

安装

 访问https://redis.io/download  到官网进行下载(稳定的)

通过远程管理工具,将压缩包拷贝到Linux服务器中,执行解压操作

 tar -zxf redis.tar.gz

进入解压文件目录使用make对解压的Redis文件进行编译

     我redis的安装目录在 /usr/locat/  目录下,因此会有如下操作

sudo mv ./redis/usr/local/redis/

编译

sudo make

安装,将redis的命令安装到/usr/local/bin/⽬录

sudo make install

配置文件,移动到/etc/目录下

sudo cp /usr/local/redis/redis.conf /etc/redis/

执行redis-server 启动redis

redis-cli

核心配置

绑定ip:如果需要远程访问

bind 127.0.0.1

端口,默认为6379

port 6379

是否以守护进程运行

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

daemonize yes

服务端和客户端命令

1、查看redis帮助文档

redis-cli --help

2、链接redis

redis-cli --help

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

select 10

 

ps aux | grep redis 查看redis服务器进程
sudo kill -9 pid 杀死redis服务器
sudo redis-server /etc/redis/redis.conf 指定加载的配置文件

数据操作

string

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

keys

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

hash

  • hset
  • hmset
  • hkeys
  • hget
  • hmget
  • hvals
  • hdel

list

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

set

  • sadd
  • smembers
  • srem

zset

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

与python交互

安装:

pip install redis

demo:

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

简写(指定参数host、port与指定的服务器和端⼝连接,host默认为localhost,port默认为6379,db默认为0)
sr=StrictRedis()
# 实例化redis对象,因为redis取出来的数据是二进制,decode_responses让响应转为字符串
redis_store = StrictRedis(host=Config.REDIS_HOST,port=Config.REDIS_PORT,decode_responses=True)
# 把text存入redis数据库中
    try:
        redis_store.setex('ImageCode_' + image_code_id,constants.IMAGE_CODE_REDIS_EXPIRES,text)
    except Exception as e:
        # 把错误信息记录到项目日志中
        current_app.logger.error(e)
        # 直接终止程序运行
        return jsonify(errno=RET.DBERR,errmsg='存储数据失败')

Redis事务

Redis提供了事务支持,但是如果执行中出现错误,事务不能回滚,Redis未提供回滚支持。

  • multi 开启事务
  • exec 执行事务

如果事务中出现了错误,事务并不会终止执行,而是只会记录下这条错误的信息,并继续执行后面的指令。所以事务中出错不会影响后续指令的执行。

Python客户端操作事务

在python程序中redis提供了pipeline()方法来统一收集操作指令execute() 管道会把积累的redis指令一次性发送到redis 服务器一边,在redis服务器执行的时候,会先补充上multi指令,开启一个事务, 再 执行积累的redis指令,最后会补充上exec指令,开始执行这个事务

from redis import StrictRedis
r = StrictRedis.from_url('redis://127.0.0.1:6381/0')
pl = r.pipeline()
pl.set('a', 100)
pl.set('b', 200)
pl.get('a')
pl.get('b')
ret = pl.execute()
print(ret) #  [True, True, b'100', b'200']

Redis Cluster 集群不支持事务

Redis持久化

redis持久化主要有两种方式:RDB 快照持久化、AOF 追加文件持久化

RDB 快照持久化

redis可以将内存中的数据写入本地的二进制文件dump.rdb文件中。在进行持久化时,redis会创建子进程来执行。

redis默认开启了快照持久化机制。

定期触发配置

#   Note: you can disable saving completely by commenting out all "save" lines.
  #
  #   It is also possible to remove all the previously configured save
  #   points by adding a save directive with a single empty string argument
  #   like in the following example:
  #
  #   save ""

  save 900 1
  save 300 10
  save 60 10000

+++++++++++++++++++++++++++++++++
 900秒内,有1条写入,则产生快照

 300秒内有1000次写入,则产生快照

 60秒内有10000次写入,则产生快照

其他设置

stop-writes-on-bgsave-error yes  // 后台备份进程出错时,主进程停不停止写入?

rdbcompression yes    // 导出的rdb文件是否压缩

Rdbchecksum   yes //  导入rbd恢复时数据时,要不要检验rdb的完整性

dbfilename dump.rdb  //导出来的rdb文件名

dir ./  //rdb的放置路径

RDB恢复数据

appendonly 设置成no,redis启动时会把/var/lib/redis 目录下的dump.rdb 中的数据恢复。dir 和dbfilename 都可以设置。我测试时appendonly 设置成yes 时候不会将dump.rdb文件中的数据恢复

1、 获取redis备份目录
127.0.0.1:6379> CONFIG GET dir 1
"dir" 2
"D:\\software\\Redis" 127.0.0.1:6379>
以上命令 CONFIG GET dir 输出的 redis 备份目录为 /usr/local/redis/bin。

2、 停止redis服务

src/redis-cli -p 6379 shutdown
src是redis安装目录

3、拷贝redis备份文件(dump.rdb)到 /usr/local/redis/bin目录下

4、重新启动redis服务

linux
src/redis-server redis.conf

windows
src/redis-server redis.windows.conf

RDB优缺点:

需要将内存中的所有redis数据全部写入到磁盘,性能有开销 影响,不会太快

相比较AOF 持久化的磁盘文件要小很多

AOF 追加文件持久化

AOF日志的全称是append only file,从名字上我们就能看出来,它是一个追加写入的日志文件.

redis默认未开启AOF机制。

通过配置开启AOF机制

redis可以通过配置如下项开启AOF机制

appendonly yes  # 是否开启AOF
appendfilename "appendonly.aof"  # AOF文件

AOF机制记录操作的时机

# appendfsync always  # 每个操作都写到磁盘中
appendfsync everysec  # 每秒写一次磁盘,默认
# appendfsync no  # 由操作系统决定写入磁盘的时机

AOF机制的缺点是随着时间的流逝,AOF文件会变得很大。但redis可以压缩AOF文件。

redis允许我们同时使用两种机制,通常情况下我们会设置AOF机制为everysec 每秒写入,则最坏仅会丢失一秒内的数据。(现在基本都这样用)

AOF数据恢复

  • 如果只配置 AOF ,重启时加载 AOF 文件恢复数据;
  • 如果同时配置了 RDB 和 AOF ,启动是只加载 AOF 文件恢复数据;
  • 如果只配置 RDB,启动是将加载 dump 文件恢复数据。

AOK优缺点:

优点: 持久化记录的执行效率相比RDB 稍高,

缺点: 持久化产生 的磁盘文件很大(因为记录了所有的操作)

Redis高可用高稳定

如果你只有一台redis机器运行的话,那它宕机了程序就崩了。所以项目中都是多台redis一起运行的。

redis主从搭建(复制集)

一个master可以拥有多个slave,一个slave又可以拥有多个slave,通过主从配置可以实现读写分离,如此下去,形成了强大的多级服务器集群架构,只能一主 多从。通常master写入数据,slave用来读取数据在redis的主从同步 复制集机器中 一般不会在进行读写分离了

Redis主从同步配置

配置主:

1、编辑redis配置文件redis.conf,绑定本机IP地址,不要写127.0.0.1(ipconfig或者ifconfig查看一下)

2、重启redis服务,查看redis服务,出现配置的IP地址以及默认端口号637

配置从:

1、 复制redis.conf文件命名为slave.conf(个人习惯),用作于从服务配置文件,该配置文件名字随便起

2、编辑slave.conf配置文件主要有三个地方,分别是绑定ip端口号以及主从复制(类似于双机备份)如果是同一台电脑,所以ip不用动不是的话改为当前主机的ip,端口号不能与主服务的端口号一致.

3、启动从服务,即redis启动配置文件为slave.conf(因为我改了配置文件的名字)

redis-server slave.conf

Redis Slaveof 命令方式:

Redis Slaveof 命令可以将当前服务器转变为指定服务器的从属服务器(slave server)。

如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。

另外,对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。

利用『 SLAVEOF NO ONE 不会丢弃同步所得数据集』这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行。

语法如下:

redis 127.0.0.1:6379> SLAVEOF host port  

demo:

redis 127.0.0.1:6379> SLAVEOF 127.0.0.1 6379
OK

redis 127.0.0.1:6379> SLAVEOF NO ONE
OK

info Replication命令:

查看机器的主从⻆

主从机器 (复制集) 集群的管理sentinel 哨兵

是redis官方提供的 便于管理主从机器 (复制集) 集群,可以方便的进行 redis服务器监视、自动故障转移等操作。哨兵是一个单独运行的进程 redis-sentinel ,这个程序已经随着 redis服务的安装一起安装好了,只需要运行即可

哨兵sentinel的作用:

  • Monitoring  监视 帮助我们判断哪些redis服务程序已经死掉,哪些还 在存活通过络通讯完成 定期的发送网络包 ,如每1s发送一次 心跳机制, 
  • Notification  通知
  • Automatic failover  自动故障转移(核信),在master死掉的时候,选出一个新master,并且将其他slave都 slaveof这个新master
  • Configuration provider  配置提供

配置文件:

我用了三台redis组成了一主二从三sentinei的架构所以我要配置三个sentinel 配置文件,分别命名为sentinel 26380.conf、sentinel 26381.conf、sentinel 26382.conf

# 哨兵运行的ip
bind 127.0.0.1 
# 端口号   
port 26380
# 是否以后台的守护进程方式运行
daemonize yes
logfile /var/log/redis-sentinel.log
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

说明:

sentinel monitor mymaster 127.0.0.1 6380 2

mymaster: 我们给让哨兵监视的这个redis复制集集群起的名字, 以master为主

2 : 表示是有几台以上的哨兵程序判断 redis服务死掉,才进行故障转移

sentinel down-after-milliseconds mymaster 30000

指定了Sentinel认为Redis实例已经失效所需的毫秒数。当 实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行

sentinel parallel-syncs mymaster 1

指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长

sentinel failover-timeout mymaster 180000

如果在该时间(ms)内未能完成failover操作,则认为该failover失败

启动服务器:

分别启动redis实例:

redis-server.exe redis6380.conf
redis-server.exe redis6381.conf
redis-server.exe redis6382.conf

分别启动sentinel

redis-sentinel sentinel26380.conf
redis-sentinel sentinel26381.conf
redis-sentinel sentinel26382.conf

Python客户端使用哨兵

from redis.sentinel import Sentinel


REDIS_SENTINELS = [
    ('127.0.0.1', '26380'),
    ('127.0.0.1', '26381'),
    ('127.0.0.1', '26382'),
]
REDIS_SENTINEL_SERVICE_NAME = 'mymaster'

_sentinel = Sentinel(REDIS_SENTINELS)
# 通过master_for 来获取当前的主redis对象
redis_master = _sentinel.master_for(REDIS_SENTINEL_SERVICE_NAME)
redis_slave = _sentinel.slave_for(REDIS_SENTINEL_SERVICE_NAME)


# 读数据,master读不到去slave读(一般直接在slave读数据,master写)
try:
    real_code = redis_master.get(key)
except ConnectionError as e:
    real_code = redis_slave.get(key)

# 写数据,只能在master里写
try:
    current_app.redis_master.delete(key)
except ConnectionError as e:
    logger.error(e)

Reids Cluster集群

Reids Cluster集群方案,内部已经集成了sentinel机制来做到高可用,,意思就是不需要单独运行哨兵程序,redis cluster集群自己就能完成故障转移

注意:

  • redis cluster 不支持事务
  • redis cluster 不支持多键操作,如mset

Reids Cluster配置

参考链接:https://redis.io/topics/partitioning

由于redis-cluster采用投票容错的方式来判断该节点是否挂掉,投票容错简单点说就是投票超总数的一半即判定该节点挂掉(和哨兵一样的作用),因此最少需要三个节点,但是由于redis-cluster要保证高可用,因此每个主节点需要一个备份机,也就是说至少需要六个节点(官方也是这样推荐的)。

详情查看链接:

https://blog.csdn.net/hguisu/article/details/82977071

Reids Cluster集群与python的交互

REDIS_CLUSTER = [
    {'host': '127.0.0.1', 'port': '7001'},
    {'host': '127.0.0.1', 'port': '7002'},
    {'host': '127.0.0.1', 'port': '7003'},
]

from rediscluster import StrictRedisCluster
redis_cluster = StrictRedisCluster(startup_nodes=REDIS_CLUSTER)

# 可以将redis_cluster就当作普通的redis客户端使用
redis_master.delete(key)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值