目录
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)