[log]Redis 学习

http://redisbook.com/

简介

是一个c语言编写的数据缓存工具,以key-value形式进行数据存储

daemonize  yes # redis-server 以守护进程的方式后台运行

进入redis-cli
在这里插入图片描述
查看redis实例信息

  • server 服务器信息
  • clients 客户端连接的状态和指标
  • memory 大致的内存消耗指标
  • persistence 数据持久化相关的状态和指标
  • state 总体统计数据
  • replication 主从复制相关的状态和指标
  • cpu cpu使用情况
  • cluster cluster的状态
  • keyspace 相关的统计数据

详细的参数信息

https://blog.csdn.net/mysqldba23/article/details/68066322

redis 最大程度的利用了单线程、非阻塞的I/O模型来快速的处理请求,提高性能。

redis包含一个简单但功能强大的异步事件库ae,封装了不同操作系统的polling机制,

polling机制
例如餐厅吃饭排号,领完号之后等待通知, 收到通知之后,自己取餐。
polling过程总没有线程或子线程的创建和交互,因此是一个轻量级的上下文切换的IO模型
在这里插入图片描述

客户端等待服务器的通知,收到服务器的通知后,自己取回结果

polling 过程中没有线程或子进程的创建和交互,
是一个轻量级上下文切换的IO模型

可以通过tcp协议与redis进行通讯,
术语协议,代表网络通信中服务器和客户端之间使用的语言,
redis中这种协议叫做RESP redis序列化协议,Redis serialization protocol

keys 命令会使redis服务器阻塞,知道所有的键都返回,

scan 可以在不阻塞服务器的情况下在redis服务器上遍历

数据类型

字符串

set
get
appent
exist
setnx  # 原子性,仅在键不存在时设置键的值

列表

存储一组对象,可以用做栈或者队列,
更像是数据结构中的双向链表

lpush
rpush
linsert # 插入
lindex
lpop # 左端删除
rpop 	

阻塞BLPOP、BRPOP,当列表为空时,客户端会阻塞,可以指定一个超时时间

内部使用了quicklist储存列表对象

位图

使用bit组成的数组,实际底层数据类型是字符串,本质上是二进制大对象
可以使用redis bitmap 用来统计用户活跃数量,可以节省大量的内存空间

https://www.jianshu.com/p/62cf39db5c2f

有序集合

集合中的每个元素拥有一个可用于排序的权重,可以按顺序从集合中获取元素

可以用来实现 排行榜、等排名的功能

https://blog.csdn.net/loophome/article/details/50373202

有序集合的实现

https://www.cnblogs.com/WJ5888/p/4516782.html

使用了跳表的数据结构,是一种随机化的数据结构,

选取一些特定的元素做索引,当元素达到一定数量,继续做二级索引等,
当查找元素时,可以先与索引做比较,缩小查找范围,然后在进行进一步查找
以空间换时间

跳表具有如下性质:

(1) 由很多层结构组成

(2) 每一层都是一个有序的链表

(3) 最底层(Level 1)的链表包含所有元素

(4) 如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。

(5) 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。

跳表的基本原理

https://www.cnblogs.com/a8457013/p/8251967.html

redis管道

就是将多个命令打包一次性发送,来减少往返的延时

hyperloglog

原理,有点复杂

https://www.jianshu.com/p/55defda6dcd2

应用场景

https://blog.csdn.net/maoyuanming0806/article/details/81814610

事务

https://redisbook.readthedocs.io/en/latest/feature/transaction.html

发布订阅

subscribe 会自动创建频道,
该频道没有订阅者,发布到该频道的消息就会丢弃
不支持持久化,

复制机制

  • 部分重新同步
  • 完全重新同步

进行完全同步时,为了将所有的数据复制到从实例中,
主实例需要将数据转存储到一个RDB文件中,然后将文件发送给从实例,
从实例接受到RDB文件后,会先将内存中的所有数据清除,再将RDB文件中的数据导入,
主实例上的复制过程是完全异步的。

部分同步不需要从主实例中传输完整的数据存储文件。
将数据转存储到RDB文件中会创建一个后台进程
在这里插入图片描述

主实例接受来自从实例的完全重新同步请求会,创建一个后台进程将数据转存储到磁盘上,将转存储的数据发送给实例。

重启后,会将进行部分重新同步,redis 能够从RDB文件中重新加载master_replid和offset,从而使部分重新同步

从实例被提升为主实例时,新主实例会记录旧主实例的master_replid和offset

repl-backlog-size

redis主实例失去与从实例的网络连接期间,主实例上的一段内存(实际是一个环形缓冲区)会跟踪最近所有写入命令,这个缓冲区实际上是一个固定长度的列表。

这个缓冲区称为replication backlog,
用来决定是完全重新同步还是部分重新同步。

发出SLACEOF命令后,
从实例使用最后一个offset和最后一个主实例的ID(master_replid) 向主实例发送一个部分重新同步请求,
请求建立之后,会检查master_replid是否一致,
主实例检查请求中offset能否中backlog缓冲区中获取,在不在backlog的范围内,

backlog缓冲区的大小是1mb,只能容纳少量的写命令,
当断开连接时生成的数据大于缓冲区,就会执行完全重新同步.
在这里插入图片描述

主实例断开连接后,重新连接从实例,主从复制可以继续复制,断点续传,

当从实例断开后,重新连接之后,会重现连接主实例

主从复制建立之后,主实例首先以RDB文件形式将内存中的数据发送给从实例,
在这期间执行的写命令会会被缓存在一个slave client buffer 的缓冲区,
rdb加载之后,主实例会将这个缓冲区的内容发送给从实例

redis的键过期机制是由主实例驱动的,过期时,会向所有的从实例发送一个del命令,

redis服务器的命令处理引擎是单线程的,阻塞会导致复制超时.
repl-ping-slave-period的值必须小于repl-timeout的值

持久化

RDB:某一时间点上的快照,适合于备份和灾难恢复
AOF:写入操作的日志,在服务器启动时被重放

AOF的数据一致性比RDB更高

AOF功能被启用时,
redis将会在数据目录中创建AOF文件,
默认文件名是appendonly.aof,
当接收到一个会实际修改内存数据的写入命令时,
就会追加到AOF文件中.

操作系统实际上维护了一个缓冲区,redis的命令首先会被写入这个缓冲区中.
缓冲区中的数据必须被刷新到磁盘中才能被永久保存.
这个过程时通过linux系统调用fsync完成的,是一个阻塞调用,
只有磁盘设备报告缓冲区中的数据写入完成后才会返回
通过appendfsync来调整调用fsync的频率

  • always 每个命令都调用fsync
  • everysec 每秒调用一次
  • no 永远不调用

AOF重写 来压缩AOF文件
redis中的某些键可能已经被删除或过期了,
可以在AOF文件中将其清楚

混合持久化模式

redis保证RDB转储和AOF重写不会同时进行。

redis 启动时,RDB和AOF持久化同时启用且AOF、RDB文件都存在,redis总是会先加载aof文件,因为aof文件能够提供可靠的一致性。

当启用了混合持久化,那么redis首先检查aof的前五个字符,如果是redis,那么该aof文件就是混合模式,
redis服务器会加载rdb部分,再加载aof部分。

redis 集群部署

哨兵模式 一主两从

https://www.jianshu.com/p/06ab9daf921d

cluster-enabled yes # 来启用集群功能

三主三从

https://blog.csdn.net/youngflycode/article/details/81274092

分布式原理

https://blog.csdn.net/andy86869/article/details/81668317

– raw # 显示中文

memory usage key # 估算一个键的内存使用情况

常见问题

在这里插入图片描述

slowlog-log-slower-than 指定阀值,超过这个阀值的操作都会被记录下来,
通过 slowlog get 获取所有的慢日志
在这里插入图片描述
通过 redis-cli 的 – latency-history 和 -i 选项来监控redis服务器的ping 延迟实现

在这里插入图片描述

分布式锁

redisson

https://www.jianshu.com/p/6f7d6a1c3bc2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值