RDB+AOF
redis数据数据持久化 为什么要用数据持久化? 数据持久化可以在内存丢失或其他灾难性故障的情况下实现恢复。 数据持久化的两种方式 AOF:以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写入指令从前到后执行一次以完成数据的恢复工作。 RDB(Redis 数据库):RDB 持久性以指定的时间间隔执行数据集的时间点快照。 rdb(redis database)能干嘛? 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot内存快照,它恢复时再将硬盘快照文件直接读回到内存里。Redis的数据都在内存中,保存备份时它执行的是全量快照,也就是说,把内存中的所有数据都记录到磁盘中,一锅端。 Rdb保存的是dump.rdb文件 Redis6.0.16以下 Redis6.2以及Redis-7.0.0 自动触发 redis7版本,按照redis.conf里配置的save<seconds><...
BigKey和缓存双写
Redis为什么是单线程这种问法其实并不严谨,为啥这么说呢? Redis的版本很多3.x、4.x、6.x,版本不同架构也是不同的,不限定版本问是否单线程也不太严谨。 版本3.x ,最早版本,也就是大家口口相传的redis是单线程,阳哥2016年讲解的redis就是3.X的版本。 版本4.x,严格意义来说也不是单线程,而是负责处理客户端请求的线程是单线程,但是开始加了点多线程的东西(异步删除)。—貌似 2020年5月版本的6.0.x后及2022年出的7.0版本后,告别了大家印象中的单线程,用一种全新的多线程来解决问题。—实锤 几个里程碑的redis版本! 5.0版本是直接升级到6.0版本,对于这个激进的升级,Redis之父antirez表现得很有信心和兴奋, 所以第一时间发文来阐述6.0的一些重大功能”Redis 6.0.0 GA is out!” 当然,Redis7.0后版本更加厉害 Redis是单线程 主要是指Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求时包括获取 (socket 读)、解析、执行、内容返回 (socket 写...
HyperLogLog&Geo&Bitmap
统计类型有哪些? 亿级系统中常见的四种统计 聚合统计 统计多个集合元素的聚合结果,就是前面的交集差集等集合统计 排序统计(zset) 在面对需要展示最新列表、排行榜等场景时,如果数据更新频繁或者需要分页显示,建议使用ZSet 因为可以使用分页,正反排序 二值统计(bitmap) 集合元素的取值就只有0和1两种,在钉钉上班签到打开的场景中,我们只用记录有签到(1)和没签到(0) 基数统计(hyperloglog) 指 统计一个集合不重复元素个数 HyperLogLog名词解释 什么是UV? Unique Visitor,独立访客,一般理解为客户端IP 需要去重考虑,例如一个人一天访问了10次网站,一天的UV就是1 什么是PV? Page View,页面浏览量 不用去重,例如一个人一天访问了10次网站,一天的PV就是10 什么是DAU? Daily Active User 日活跃用户量 登录或者使用了某个产品的用户数(去重复登录的用户),避免恶意刷单 常用于反映网站,互联网应用或者网络游戏的运营情况 什么是MAU? Monthly...
pub&sub(发布&订阅)
发布/订阅是一种消息通信模式:发送者(publish)发送消息,订阅者(subscribe)接受消息,可以实现进程间的消息传递 Redis 可以实现消息中间件 MQ 的功能,通过发布订阅实现消息的引导和分流。不推荐使用该功能,专业的事情交给专业的中间件,redis就做好分布式缓存功能 能干嘛? redis 客户端可以订阅任意数量的频道,类似我们微信关注多个公众号 当有新的消息通过 publish 命令发送给频道 channel1 时 总结: 发布/订阅其实是一个轻量的队列,只不过数据不会被持久化,一般用来处理实时性较高的异步消息 常用命令 subscribe channel [channel...] 订阅给定的一个或多个频道的信息 推荐先执行订阅后再发布,订阅成功之前发布的消息是收不到的 订阅的客户端每次可以收到一个3个参数的消息 消息的种类 始发频道的名称 实际的消息内容 publish channel message 发布消息到指定的频道 psubscribe pattern[pattern...] ...
epoll函数和IO多路复用深度解析
epoll 函数和 IO 多路复用深度解析没有 epoll 和 IO 多路复用之前多路复用要解决的问题并发多客户端连接,在多路复用之前最简单和典型的方案:同步阻塞网络IO模型 这种模式的特点就是用一个进程来处理一个网络连接(一个用户请求),比如一段典型的示例代码如下。 直接调用 recv 函数从一个 socket 上读取数据。 int main(){ ... recv(sock, ...) //从用户角度来看非常简单,一个recv一用,要接收的数据就到我们手里了。} 我们来总结一下这种方式: 优点: 就是这种方式非常容易让人理解,写起代码来非常的自然,符合人的直线型思维。 缺点: 就是性能差,每个用户请求到来都得占用一个进程来处理,来一个请求就要分配一个进程跟进处理, 类似一个学生配一个老师,一位患者配一个医生,可能吗?进程是一个很笨重的东西。一台服务器上创建不了多少个进程。 结论进程在 Linux 上是一个开销不小的家伙,先不说创建,光是上下文切换一次就得几个微秒。所以为了高效地对海量用户提供服务,必须要让一个进程能同时处理很多个 tcp 连接才行。现在假...
Redis基础
什么是Redis?Redis 是一个内存数据存储,被数百万开发者用作缓存、向量数据库、文档数据库、流式引擎和消息代理。Redis 具有内置的复制和不同级别的磁盘持久化。它支持复杂的数据类型(例如,字符串、散列、列表、集合、有序集合和 JSON),并为这些数据类型定义了原子操作。 Redis 通常被称为数据结构服务器。这意味着 Redis 通过一组命令提供对可变数据结构的访问,这些命令通过 TCP 套接字和简单协议使用服务器-客户端模型发送。因此,不同的进程可以以共享的方式查询和修改相同的数据结构。 Redis 实现的数据结构具有一些特殊的属性: Redis 会将其存储在磁盘上,即使它们总是被服务器内存中读取和修改。这意味着 Redis 速度快,但同时也非易失性。 数据结构的实现强调内存效率,因此 Redis 内部的数据结构可能比使用高级编程语言建模的相同数据结构模型使用更少的内存。 Redis 提供了一系列数据库中常见的功能,如复制、可调的持久性级别、集群和高度可用性。 下载Redis 命名规则: 版本号第二位如果是奇数,则为非稳定版本,如2.7、2.9、3.1 版本...
Replica(主从复制)
复制(replica)就是主从复制,master以写为主,slave以读为主。当master数据变化的时候,自动将新的数据异步同步到其他slave数据库 优点: 读写分离 容灾恢复 数据备份 水平扩容支撑高并发 如何使用 配从(库)不配主(库) 权限细节,重要 master 如果配置了 requirepass 参数,需要密码登录 那么 slave 就要配置 masterauth 来设置校验密码,否则的话 master 会拒绝 slave的访问请求 基本操作命令 info replication:可以查看复制节点的主从关系和配置信息 replicaof 主库IP 主库端口:一般写入进 redis.conf 配置文件内 slaveof 主库IP 主库端口 每次与 master 断开之后,都需要重新连接,除非你配置进 redis.conf 文件 在运行期间修改 slave 节点的信息,如果该数据库已经是某个主数据库的从数据库,那么会停止和原主数据库的同步关系转而和新的主数据库同步,重新拜主数据库 slaveof no one:使当前数据库停止与其他数据库的同步,转成...
Redis分布式锁
redis分布式锁目的:解决多个服务原子性的问题 在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢? 锁的种类 单机版同一个jvm虚拟机内,synchronized或者Lock接口 分布式多个不同虚拟机,单机的线程锁机制不再起作用,资源类在不同的服务器之间共享了 一个靠谱分布式锁需要具备的条件和刚需 独占性 OnlyOne,任何时刻只能有且仅有一个线程持有 高可用 若redis集群环境下,不能因为某一个节点挂了而出现获取锁和释放锁失败的情况 高并发请求下,依旧性能ok好使 防死锁 杜绝死锁,必须有超时控制机制或者撤销操作,有个兜底终止跳出方案 不乱抢 不能私下unlock(解)别人的锁,只能自己加锁自己释放 重入性 同一个节点的同一个线程如何获得锁之后,它也可以再次获得这个锁。 分布式锁 案例1使用场景:多个服务间保证同一时刻同一时间段内同一用户只能有一个请求(防止关键业务出现并发攻击) 两个服务,分别是redis_distributed_l...
Redis经典五大类型源码及底层实现
Redis经典五大类型源码及底层实现本源码基于redis7.0.5 Redis数据类型和底层数据结构 SDS动态字符串 双向链表 压缩列表ziplist 哈希表hashtable 跳表skiplist 整数集合intset 快速列表quicklist 紧凑列表listpack 源码在哪里? github :https://github.com/redis/redis Redis核心部分src源码包下面该如何看? Redis基本数据结构(骨架) Github官网说明 Redis对象object.c 字符串t_string.c 列表t_list.c 字典t_hash.c 集合及有序集合t_set.c和t_zset.c 数据流t_stream.c:Streams的底层实现结构listpack.c和rax.c 简单动态字符串sds.c 整数集合intset.c 压缩列表ziplist.c 快速链表quicklist.c listpack(紧凑列表) 字典dict.c Redis数据库的实现 数据库的底层实现db.c 持久化rdb.c和aof.c Redis服...
管道&事务
Redis事务可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化而不会被其他命令插入,不许加塞 能干嘛? 一个队列中,一次性、顺序性、排他性的执行一系列命令 redis事务 vs 数据库事务 1 单独的隔离操作 Redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的 2 没有隔离级别的概念 因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题了 3不保证原子性 Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力 4 排它性 Redis会保证一个事务内的命令依次执行,而不会被其它命令插入 常用命令 序号 描述 1 discard:取消事务,放弃执行事务块内的所以命令 2 exec:执行所有事务块内的命令 3 multi:标记一个事务块的开始 4 unwatch...


