百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis深入解析

mhr18 2024-11-18 14:29 29 浏览 0 评论

Redis是使用c语言开的的数据库,redis的数据是存在内存中的,读写速度非常快,被广泛的用于缓存方向,分布式锁,消息队列,支持事务,持久化,lua脚本,多种集群方案。

使用场景:缓存,分布式锁,限流,消息队列,复杂的业务场景(redis提供的数据结构,bitmap统计活跃用户,排行榜等)

数据结构:

String:key-value类型,简单动态字符串(simple dynamic string) SDS,sds不逛可以保存文本数据还可以保存二进制数据,并且获取字符串长度复杂度为O(1)

常用命令:set get,strlen,exists,decr,incr,setex等

使用场景:一般常用在需要计数的场景,比如用户的访问次数,热点文章的点赞转发数量等

List :压缩表,链表(双向链表)即可以支持反向查找和遍历,更方便操作,额外的内存开销

常用命令:rpush,lpop,lpush,rpop,lrange,llen等

使用场景:发布与订阅或者消息队列,慢查询。

Hash类似于hashmap,内部实现也差不多是数组+链表,redis的hash做了更多的优化,hash是一个string类型的field和value的映射表,特别适合于存储对象。

常用命令:hset,hmset,hexists,hget,hgetall,hkeys,hvals等

使用场景:系统中的对象存储。

Set:类似于hashset。无序集合, 基于set可以轻易实现交集,并集,差集,共同关注,共同粉丝,共同喜好等,

常用命令:sadd。spop,smembers,sismember,scard,sinterstore,sunion等

使用场景:交集并集差集。

Sorted set (Zset)跳表,压缩表ziplist:和set相比,sorted set增加一个权重参数score,使得集合中的元素能够按照score进行有序排列。

常用命令:zadd,zcard,zscore,zrange,zrevrange,zrem等

应用场景:需要数据根据某个权重进行排序的场景,直播间在线用户列表,各种礼物排行榜,弹幕消息。

BItmap:存储的是连续的二进制数据0和1,通过bitmap,只需要一个bit位来表示某个元素对应的值或者状态,key就是对应的元素本身,极大结算存储空间。

常用命令:setbit,getbit,bitcount,bitop

应用场景:签到,是否登录,用户行为统计

Redis是基于Reactor模式来设计开发的自己的一套事件处理模型

IO多路复用

redis过期策略:惰性删除,定时删除

  1. volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  4. allkeys-lru(least recently used):当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)
  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  6. no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!

4.0 版本后增加以下两种:

  1. volatile-lfu(least frequently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰
  2. allkeys-lfu(least frequently used):当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key

快照(snapshotting)持久化(RDB)

Redis 可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。Redis 创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis 主从结构,主要用来提高 Redis 性能),还可以将快照留在原地以便重启服务器的时候使用。

快照持久化是 Redis 默认采用的持久化方式,在 Redis.conf 配置文件中默认有此下配置:、

save 900 1           #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发BGSAVE命令创建快照。

save 300 10          #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发BGSAVE命令创建快照。

save 60 10000        #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发BGSAVE命令创建快照。

AOF 持久化

appendonly yes

开启aof持久化后每执行一条会更改redis中的数据命令,redis就会将该命令写入到内存缓存server.aof_buf中,然后再根据appendfsync配置来决定何时将其同步到硬盘中的aof文件。

aof文件的保存位置和rdb文件的位置相同,都是通过dir参数设置的,默认文件名是appendonly.aof

redis的配置文件中存在三种不同的aof持久化方式:

appendfsync always #每次有数据修改发生都会写入aod文件,这样会严重降低redis的速度

appendfsync everysec #每秒钟同步一次,显示地将多个写命令同步到硬盘

annpendfsync no #让操作系统决定何时进行同步

redis4.0开始支持rdb和aof混合使用

缓存穿透:大量请求的key根本不存在在缓存中,导致请求直接到了数据库上。

解决办法:首先做好参数校验,不合法的请求直接抛出异常信息返回客户端,当查询数据库不存在时,默认缓存一个空。

布隆过滤器元素不在,那么这个元素一定不在。(过滤非法请求)

缓存雪崩:缓存在同一时间大面积的失效,后面的请求直接落到了数据库上,造成数据库短时间能承受大量请求;

解决方法:采用reids集群,限流,设置不同的失效时间,比如随机设置缓存失效时间,环境永不失效。

如何保证缓存和数据库数据一致性:

1.更新 DB,然后直接删除 cache(失败重试)

2.加锁db和查询(强一致)

3.写入数据库后更新redis缓存放入消息队列,保证最终一直性(要求不是很高的服务中)。

哨兵机制

  • 主观下线即 Sentinel 节点对 Redis 节点失败的偏见,超出超时时间认为 Master 已经宕机。Sentinel 集群的每一个 Sentinel 节点会定时对 Redis 集群的所有节点发心跳包检测节点是否正常。如果一个节点在 down-after-milliseconds 时间内没有回复 Sentinel 节点的心跳包,则该 Redis 节点被该 Sentinel 节点主观下线。
  • 客观下线所有 Sentinel 节点对 Redis 节点失败要达成共识,即超过 quorum 个统一。当节点被一个 Sentinel 节点记为主观下线时,并不意味着该节点肯定故障了,还需要 Sentinel 集群的其他 Sentinel 节点共同判断为主观下线才行。该 Sentinel 节点会询问其它 Sentinel 节点,如果 Sentinel 集群中超过 quorum 数量的 Sentinel 节点认为该 Redis 节点主观下线,则该 Redis 客观下线。


每 1s 每个 Sentinel 对其他 Sentinel 和 Redis 执行 ping,进行心跳检测。

每 2s 每个 Sentinel 通过 Master 的 Channel 交换信息(pub - sub)。

每 10s 每个 Sentinel 对 Master 和 Slave 执行 info,目的是发现 Slave 节点、确定主从关系。

  • LRU、LFU、FIFO 算法自动清除:一致性最差,维护成本低。

Martin 认为 Redlock 实在不是一个好的选择,对于需求性能的分布式锁应用它太重了且成本高;对于需求正确性的应用来说它不够安全。因为它对高危的时钟或者说其他上述列举的情况进行了不可靠的假设,如果你的应用只需要高性能的分布式锁不要求多高的正确性,那么单节点 Redis 够了;如果你的应用想要保住正确性,那么不建议 Redlock,建议使用一个合适的一致性协调系统,例如 Zookeeper,且保证存在 fencing token。

SDS(Simple Dynamic Strings, 简单动态字符串)是 Redis 的一种基本数据结构,主要是用于存储字符串和整数

redis哈希槽分区:1.哈希取余;2.一致性哈希分区(环 【0,2的32次方-1服务器ip地址hash均匀的放在环中,顺时针】);3.哈希槽分区2的16次方-1 (16383)



ZAB协议
redlock锁 多个加锁 过半成功则成功

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: