Redis
redis是一个key-value存储系统。和Memcached类似,它支持存储的values类型相对更多,包括字符串、列表、哈希散列表、集合,有序集合。
1.1企业缓存数据库解决方案对比
Memcached
优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash多核结构、多线程读写性能高。
缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨房数据同步困难、架构扩容复杂度高
Redis
优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高
缺点:多线程读写较Memcached慢
总结
memcached :更加适合多线程连接,少量读写。多核的处理模式
redis:更加适合于单线程,多次读写,所以说他更加适合时候多实例环境。单核的处理模式。
1.2Redis特性
高速读写,数据类型丰富
支持持久化,多种内存分配及回收策略
支持弱事务,消息队列、消息订阅
支持高可用,支持分布式分片集群
支持的储存数据类型
{
'k1':'hiayna', #第一种字符串格式
'k2':[11,22,33,44], #第二种列表格式
'k3':{11,22,33,44}, #第三种集合格式
'k4':{ #第四种,字典,也可以叫做哈希散列表,
'n1':'xxx',
'n2':'fff'
},
'k5':{(11,1),('xxx':5)} #有序集合
}
2.redis单实例安装
cd /usr/local/
wget http://download.redis.io/releases/redis-3.2.10.tar.gz
tar xzf redis-3.2.10.tar.gz
mv redis-3.2.10/ redis
cd redis/
make
启动测试
src/redis-server &
加入坏境变量
:/application/redis/src
配置文件配置
#cp redis.conf{,.bak}
#grep -Ev '^$|#' redis.conf.bak > redis.conf
vim
daemonize yes #后台运行
port 6379 #端口
logfile /var/log/redis.log
protected-mode no #关闭保护模式
requirepass 123 #密码
启动
/usr/local/redis/src/redis-server /etc/redis.conf
3.redis常用命令
set key velue 插入数据
get key 获取值
keys * 查看所有key
type key 查看key类型
expire key seconds(时间) 过期时间
ttl key 查看key过期剩余时间 -2表示key已经不存在了
persist 取消key的过期时间 -1表示key存在,没有过期时间
exists key 判断key存在 存在返回1 否则0
del keys 删除key 可以删除多个
dbsize 计算key的数量
4.reids字符串操作
set 设置key
get 获取key
append 追加string
mset 设置多个键值对
mget 获取多个键值对
del 删除key
incr 递增+1
decr 递减-1
5.list双向队列用法
lpush 从列表左边插
rpush 从列表右边插
lrange 获取一定长度的元素 lrange key start stop
ltrim 截取一定长度列表
lpop 删除最左边一个元素
rpop 删除最右边一个元素
lpushx/rpushx key存在则添加值,不存在不处理
6.set集合类型,天然去重
sadd/srem 添加/删除 元素
sismember 判断是否为set的一个元素
smembers 返回集合所有的成员
sdiff 返回一个集合和其他集合的差异
sinter 返回几个集合的交集
sunion 返回几个集合的并集
7.有序集合
都是以z开头的命令
zset的每一个成员都有一个分数与之对应,并且分数是可以重复的。有序集合的增删改由于有啦排序,执行效率就是非常快速的,即便是访问集合中间的数据也是非常高效的。
用来保存需要排序的数据,例如排行榜,成绩,工资等。
实例
利用有序集合的排序,排序学生的成绩
127.0.0.1:6379> ZADD mid_test 70 "a"
(integer) 1
127.0.0.1:6379> ZADD mid_test 80 "w"
(integer) 1
127.0.0.1:6379> ZADD mid_test 99 "y"
排行榜,zreverange 倒叙 zrange正序
ZREVRANGE mid_test 0 -1
ZRANGE mid_test 0 -1
8.哈希类型
12.redis哈希类型(字典类型)
hset 设置散列值
hget 获取散列值
hmset 设置多对散列值
hmget 获取多对散列值
hsetnx 如果散列已经存在,则不设置(防止覆盖key)
hkeys 返回所有keys
hvals 返回所有values
hlen 返回散列包含域(field)的数量
hdel 删除散列指定的域(field)
hexists 判断是否存在
key -field1 -value1
-field 2 - value2
-field 3 - value3
9.发布订阅
PUBLISH channel msg
将信息 message 发送到指定的频道 channel
SUBSCRIBE channel [channel ...]
订阅频道,可以同时订阅多个频道
UNSUBSCRIBE [channel ...]
取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道
PSUBSCRIBE pattern [pattern ...]
订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所 有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有 以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类
PUNSUBSCRIBE [pattern [pattern ...]]
退订指定的规则, 如果没有参数则会退订所有规则
PUBSUB subcommand [argument [argument ...]]
查看订阅与发布系统状态
注意:使用发布订阅模式实现的消息队列,当有客户端订阅channel后只能收到后续发布到该频道的消息,之前发送的不会缓存,必须Provider和Consumer同时在线。
正则发布-----匹配多个
窗口1,启动两个redis-cli窗口,均订阅 wang*频道(channel)
127.0.0.1:6379> PSUBSCRIBE wang*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "wang*"
3) (integer) 1
1) "pmessage"
2) "wang*"
3) "wangbaoqiang"
4) "jintian zhennanshou "
窗口2,启动redis-cli窗口,均订阅wang*频道
127.0.0.1:6379> PSUBSCRIBE wang*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "wang*"
3) (integer) 1
1) "pmessage"
2) "wang*"
3) "wangbaoqiang"
4) "jintian zhennanshou "
窗口3,发布者消息
[root@web02 ~]# redis-cli
127.0.0.1:6379> PUBLISH wangbaoqiang "jintian zhennanshou "
(integer) 2
10.RDB持久化
可以在指定的时间间隔内生成数据集的时间点快照,生成二进制文件。
优点:速度快,适合于用做备份。
缺点:会有数据丢失
修改配置文件
save 900 1
save 300 10
save 60 10000
配置分别表示:
900秒(15分钟)内有1个更改 300秒(5分钟)内有10个更改 60秒内有10000个更改 当达到以上定义的配置时间时,就将内存数据持久化到磁盘
恢复时可以sava触发
RDB持久化高级配置
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./redis/data/6379
以上配置分别表示:
• 后台备份进程出错时,主进程停不停止写入? 主进程不停止容易造成数据不一致
• 导出的rdb文件是否压缩 如果rdb的大小很大的话建议这么做
• 导入rbd恢复时数据时,要不要检验rdb的完整性 验证版本是不是一致
• 导出来的rdb文件名
• rdb的放置路径
配置文件简单配置
daemonize yes #后台运行
port 6379 #指定端口
logfile /data/6379/redis.log #指定日志路径
dir /data/6379 #redis的数据文件,会存放在这里
dbfilename dbmp.rdb # 开启rdb持久化,且指定持久化文件的名字
bind 0.0.0.0
save 900 1 #定义触发rdb持久化的时间机制
save 300 10
save 60 10000
11.AOF持久化
记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。
优点:可以最大程度保证数据不丢
缺点:日志记录量级比较大
appendonly yes
appendfsync always
appendfsync everysec
appendfsync no
配置分别表示:
• 是否打开aof日志功能
• 每1个命令,都立即同步到aof
• 每秒写1次
• 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.
配置文件中加入即可
appendonly yes
appendfsync everysec
AOF持久化高级配置
no-appendfsync-on-rewrite yes/no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
配置分别表示:
• 正在导出rdb快照的过程中,要不要停止同步aof
• aof文件大小比起上次重写时的大小,增长率100%时重写,缺点:业务开始的时候,会重复重写多次。
• aof文件,至少超过64M时,重写
简单配置
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
appendonly yes #开启aof的俩参数
appendfsync everysec #aof的持久化机制
12.如何使用哪种持久化方式
一般来说, 如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。
如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。
有很多用户都只使用 AOF 持久化, 但我们并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快, 除此之外, 使用 RDB 还可以避免之前提到的 AOF 程序的 bug
13.不重启切换RDB为AOF
1.准备一个rdb的redis数据库-切换之前必须备份数据防止丢失 2.通过命令,直接切换aof
127.0.0.1:6379> CONFIG set appendonly yes #开启AOF功能
OK
127.0.0.1:6379> CONFIG SET save "" #关闭RDB功能
OK
3.正确情况下,会生成aof日志文件了,此时命令操作都是在aof里面了
4.还得修改配置文件,以上命令只是临时生效,改完以后,下次指定配置文件启动,就一直是aof了
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dbmp.rdb
save 900 1
save 300 10
save 60 10000
daemonize yes
appendonly yes
appendfsync everysec
14.AOF文件损坏了怎么办?
服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。当发生这种情况时, 可以用以下方法来修复出错的 AOF 文件:
为现有的 AOF 文件创建一个备份。
使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复: $ redis-check-aof –fix
使用 diff -u 对比修复后的 AOF 文件和原始 AOF 文件的备份,查看两个文件之间的不同之处。(可选)
重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复
15.备份
写一个crob 任务 将RDB文件定时备份到其他文件中
16.redis慢日志查询
Slow log 是 Redis 用来记录查询执行时间的日志系统。
slow log 保存在内存里面,读写速度非常快
可以通过改写 redis.conf 文件或者用 CONFIG GET 和 CONFIG SET 命令对它们动态地进行修改
slowlog-log-slower-than 10000 超过多少微秒
CONFIG SET slowlog-log-slower-than 100
CONFIG SET slowlog-max-len 1000 保存多少条慢日志
CONFIG GET slow*
SLOWLOG GET
SLOWLOG RESET
17.redis主从复制
#redis的主从复制,可以基于redis的多实例完成,基于不同的端口,就能运行各个独立的redis数据库
#redis的主从复制,做一个一主三从的实验
mredis.conf #主库的配置文件 port 6380 daemonize yes pidfile /data/6380/redis.pid loglevel notice logfile "/data/6380/redis.log" dbfilename dump.rdb dir /data/6380 protected-mode no
准备一个从库s1redis.conf port 6381 daemonize yes pidfile /data/6381/redis.pid loglevel notice logfile "/data/6381/redis.log" dbfilename dump.rdb dir /data/6381 protected-mode no slaveof 127.0.0.1 6380 #也可以在配置文件中,直接定义,直接启动,默认就是主从复制了
准备第二个从库s2redis.conf port 6382 daemonize yes pidfile /data/6382/redis.pid loglevel notice logfile "/data/6382/redis.log" dbfilename dump.rdb dir /data/6382 protected-mode no slaveof 127.0.0.1 6380 #也可以在配置文件中,直接定义,直接启动,默认就是主从复制了
#创建三个数据库的数据文件夹 mkdir -p /data/{6380,6381,6382}
#分别启动三个数据库实例 [root@s24_linux myredis]# redis-server mredis.conf [root@s24_linux myredis]# redis-server s1redis.conf [root@s24_linux myredis]# redis-server s2redis.conf [root@s24_linux myredis]# ps -ef|grep redis root 78545 1 0 10:54 ? 00:00:00 redis-server *:6380 root 78550 1 0 10:54 ? 00:00:00 redis-server *:6381 root 78555 1 0 10:54 ? 00:00:00 redis-server *:6382
#分别查看三个redis数据库的库信息 [root@s24_linux myredis]# redis-cli -p 6380 info replication [root@s24_linux myredis]# redis-cli -p 6381 info replication [root@s24_linux myredis]# redis-cli -p 6382 info replication
#通过命令,临时给三个数据库添加主从复制信息 redis-cli -p 6381 slaveof 127.0.0.1 6380 #给6381指定为6380的从库 redis-cli -p 6381 info replication #查看6381的复制信息 redis-cli -p 6380 info replication #查看6380的复制信息 redis-cli -p 6382 slaveof 127.0.0.1 6380 #给6382设置为6380的从库 redis-cli -p 6380 info replication
#进行主从复制读写演示 6380可读可写 6381 6382只读,不给写
#杀死从库,无所谓,再把从库重新启动,或者再创建一个新的就行
#杀死主库,必须得手动解决故障,吧从库切换为新的主库,继续主从复制
只需要剔除当前自己的从的身份即可,剔除6381的从的身份 127.0.0.1:6381> slaveof no one OK
#再次启动一个新的从库,以6381为主库即可
#redis的哨兵配置,能够自动的解决主从切换故障
1.准备三个redis数据库实例,配置好,主从关系
[root@s24_linux myredis]# cat mredis.conf
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no
[root@s24_linux myredis]# cat s1redis.conf
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
protected-mode no
slaveof 127.0.0.1 6380
[root@s24_linux myredis]# cat s2redis.conf
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
protected-mode no
slaveof 127.0.0.1 6380
分别启动三个redis数据库节点
2.准备三个哨兵sentinel(哨兵)的配置文件,三个哨兵配置文件,仅仅是端口的不同,默认是26379,26380,26381 s24shaobing.conf port 26379 dir /var/redis/data/ logfile "26379.log"
// 当前Sentinel节点监控 192.168.119.10:6379 这个主节点
// 2代表判断主节点失败至少需要2个Sentinel节点节点同意
// mymaster是主节点的别名
sentinel monitor s24ms 127.0.0.1 6380 2
//每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
sentinel down-after-milliseconds s24ms 30000
//当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,
原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
sentinel parallel-syncs s24ms 1
//故障转移超时时间为180000毫秒
sentinel failover-timeout s24ms 180000
//后台运行哨兵
daemonize yes
s24shaobing1.conf s24shaobing2.conf #快速生成2个配置文件 [root@s24_linux myredis]# sed 's/26379/26380/g' s24shaobing.conf > s24shaobing1.conf [root@s24_linux myredis]# sed 's/26379/26381/g' s24shaobing.conf > s24shaobing2.conf #创建数据文件夹 mkdir -p /var/redis/data/
3.分别启动三个哨兵进程 [root@s24_linux myredis]# ps -ef|grep redis root 78952 1 0 11:42 ? 00:00:00 redis-server *:6380 root 78957 1 0 11:42 ? 00:00:00 redis-server *:6381 root 78963 1 0 11:42 ? 00:00:00 redis-server *:6382 root 79051 1 0 11:51 ? 00:00:00 redis-sentinel *:26379 [sentinel] root 79056 1 0 11:51 ? 00:00:00 redis-sentinel *:26380 [sentinel] root 79061 1 0 11:51 ? 00:00:00 redis-sentinel *:26381 [sentinel]
4.干掉master主库,哨兵会自动的选举一个从库为新的主库
5.将挂掉的主库,重新启动,查看复制信息
#redis-cluster集群的搭建
1.准备6个数据库节点,搭建三主三从的数据库主从机群,6个节点,仅仅是端口的不同 指定7000~7005 6个节点 touch redis-7000.conf
port 7000 daemonize yes dir "/opt/redis/data" logfile "7000.log" dbfilename "dump-7000.rdb" cluster-enabled yes #开启集群模式 cluster-config-file nodes-7000.conf #集群内部的配置文件
touch redis-7001.conf touch redis-7002.conf touch redis-7003.conf touch redis-7004.conf touch redis-7005.conf
sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf sed 's/7000/7003/g' redis-7000.conf > redis-7003.conf sed 's/7000/7005/g' redis-7000.conf > redis-7005.conf
分别启动6个redis节点
2.配置ruby环境,一键创建redis机群slot槽位分配 yum直接安装ruby解释器 yum install ruby -y 下载ruby操作redis的模块 wget http://rubygems.org/downloads/redis-3.3.0.gem gem install -l redis-3.3.0.gem 一键开启redis集群槽位分配,先找一下这个ruby工具在哪 find / -name redis-trib.rb
/s24fuxi/redis-4.0.10/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
3.开启redis集群功能,向集群中写入数据,查看数据重定向
以集群模式登陆redis-cluster ,写入数据
转载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?