redis
文章平均质量分 64
其实系一个须刨
这个作者很懒,什么都没留下…
展开
-
redis缓存问题
什么是缓存穿透?怎么解决?缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。解决办法:1、缓存空对象:如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。 缓存空对象带来的问题: 1.空值做了缓存,意昧着缓存中存了更多的键,需要更多的内存空间,比较有效...原创 2021-06-29 22:19:37 · 193 阅读 · 0 评论 -
Redis 为什什么这么快
1.完全基于内存,绝大部分请求是纯粹的内存操作,非常快速;2.数据结构简单,对数据操作也简单;3.采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CpU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;4.使用多路I/0复用模型,非阻塞旧。...原创 2021-06-29 22:15:14 · 104 阅读 · 0 评论 -
数据倾斜
数据量倾斜:在某些情况下,实例上的数据分布不均衡,某个实例上的数据特别多。bigkey 导致倾斜某个实例上正好保存了 bigkey。bigkey 的 value 值很大(String 类型),或者是 bigkey 保存了大量集合元素(集合类型),会导致这个实例的数据量增加,内存资源消耗也相应增加。把 bigkey 拆分成很多个小的集合类型数据,分散保存在不同的实例上。Slot 分配不均衡导致倾斜导致某个或某些实例上有大量数据。Hash Tag 导致倾斜Hash Tag 是指加在键原创 2021-05-20 19:39:10 · 109 阅读 · 0 评论 -
Redis的ACID属性
Redis 如何实现事务Redis 提供了 MULTI、EXEC 两个命令实现事务,MULTI开始一个事务,EXEC是实际执行事务,中间是业务逻辑。Redis 的事务机制能保证哪些属性原子性:一个事务中的多个操作必须都完成,或者都不完成。有以下三种情况:1. 在执行 EXEC 命令前,客户端发送的操作命令本身就有错误这种情况,在命令进入队列的时候,就可以判断出来,等到执行EXEC命令的时候,redis会拒绝所有提交的命令操作。2. 事务操作入队时,命令和操作的数据类型不匹配,但原创 2021-05-19 11:38:44 · 178 阅读 · 0 评论 -
影响redis性能的因素
主要影响redis性能的三个要素如下:redis自身操作特性、操作系统、文件系统。redis自身操作特性1. 慢指令查询 比如当Value 类型为 Set 时,SORT、SUNION/SMEMBERS 操作复杂度分别为 O(N+M*log(M)) 和 O(N)。复杂度增加了很多。处理方式:用其他高效命令代替。比如说,如果你需要返回一个 SET 中的所有成员时,不要使用SMEMBERS 命令,而是要使用 SSCAN 多次迭代返回,避免一次返回大量数据,造成线程阻塞。当你需...原创 2021-05-17 21:39:05 · 773 阅读 · 0 评论 -
CPU与redis性能
CPU的架构一个 CPU 处理器中一般有多个物理核,每个物理核都可以运行应用程序。每个物理核都拥有私有的一级缓存,它包括一级指令缓存和一级数据缓存,以及私有的二级缓存。L1和L2是私有的, 所以访问基本在纳秒级。但是L1和L2空间并不大,所以还有一个各个物理核共享的三级缓存L3。另外,每个物理核通常都会运行两个超线程,也叫作逻辑核。同一个物理核的逻辑核会共享使用 L1、L2 缓存。在主流的服务器上,一个 CPU 处理器会有多个物理核。同时,服务器上通常还会有多个 CPU 处理器(也称为多 CPU原创 2021-05-17 00:29:29 · 407 阅读 · 0 评论 -
Redis 实例的阻塞点
客户端阻塞点1. 复杂度高的增删改查操作例如集合元素全量查询操作 HGETALL、SMEMBERS,以及集合的聚合统计操作,例如求交、并和差集2. 删除大量键值对删除操作是要释放键值对占用的内存空间。为了更加高效地管理内存空间,在应用程序释放内存时,操作系统需要把释放掉的内存块插入一个空闲内存块的链表,以便后续进行管理和再分配。这个过程本身需要一定时间,而且会阻塞当前释放内存的应用程序,所以,如果一下子释放了大量内存,空闲内存块链表操作时间就会增加,相应地就会造成 Redis 主线程的阻塞。原创 2021-05-16 16:32:30 · 159 阅读 · 0 评论 -
Redis中的数据类型hash
Redis中的string 把string作为储存的对象,,除了记录实际数据,String 类型还需要额外的内存空间记录数据长度、空间使用等信息,这些信息也叫作元数据。 当你保存 64 位有符号整数时,String 类型会把它保存为一个 8 字节的 Long 类型整数,这种保存方式通常也叫作 int 编码方式。但是当保存的数据中包含字符的时候,,String类型就会用简单动态字符串(Simple Dynamic String,SDS)结构来保存,包括:buf:字节...原创 2021-05-13 16:14:20 · 715 阅读 · 0 评论 -
切片集群
如果要用redis保存非常大的数据,那么有时候可能响应会特别慢,因为在fork的时候会耗时很久,而fork是阻塞主线程的。这个时候,就需要对redis实例进行扩展。纵向扩展:增加内存容量、增加磁盘容量、使用更高配置的 CPU。优点:实施起来简单、直接。缺点:随着数据增长fork的耗时也会增加;受到硬件和成本的限制。横向扩展:横向增加当前 Redis 实例的个数,从一个到使用三个相同配置的实例。启动多个 Redis 实例组成一个集群,然后按照一定的规则,把收到的数据划分成多份,每一份用一个原创 2021-05-12 17:00:11 · 138 阅读 · 0 评论 -
redis哨兵机制
redis哨兵机制在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、选主(选择主库)和通知。监控:主管下线与客观下线 哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况。如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”。1. 从库下线:直接标记一下就好了,不用做其他的操作...原创 2021-05-12 00:37:04 · 132 阅读 · 0 评论 -
Redis主从同步
Redis 有主从同步的机制保证可靠性。主从库之间采用的是读写分离的方式。读操作:主库、从库都可以接收; 写操作:首先到主库执行,然后,主库将写操作同步给从库。主从库间第一次同步主从的第一次同步总共有三个阶段,下面分别介绍第一阶段:建立连接,协商同步从库和主库建立起连接,并告诉主库即将进行同步,主库确认回复后,主从库间就可以开始同步了。从库在这个阶段会发送psync命令,表示要进行数据同步了,命令包含了主库的runID(runID,是每个 Redis 实例启动时都会自动生..原创 2021-05-11 20:16:25 · 110 阅读 · 0 评论 -
Redis持久化之内存快照
给redis当前内存里面的所有数据做要一个快照,当需要回复的时候,只要回复快照就好了。Redis 提供了两个命令来生成 RDB 文件,分别是 save 和 bgsave。save:在主线程中执行,会导致阻塞;bgsave:创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是Redis RDB 文件生成的默认配置。如何在做快照的时候不影响修改数据bgsave 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据。bgsave 子进程运行后,开始读取主线程的内.原创 2021-05-11 17:08:12 · 301 阅读 · 0 评论 -
Redis持久化之AOF日志
AOF (Append Only Fil)日志是写后日志,Redis 是先执行命令,把数据写入内存,然后才记录日志。1. 为了避免额外的检查开销,Redis 在向 AOF 里面记录日志的时候,并不会先去对这些命令进行语法检查。所以,如果先记日志再执行命令的话,日志中就有可能记录了错误的命令2. 在命令执行后才记录日志,所以不会阻塞当前的写操作。AOF 机制给我们提供了三个选择,也就是 AOF 配置项appendfsync 的三个可选值。Always,同步写回:每个写命令...原创 2021-05-11 15:50:34 · 163 阅读 · 0 评论 -
Redis的单线程机制
Redis 是单线程,主要是指 Redis 的网络 IO和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。基于多路复用的高性能 I/O 模型Linux 中的 IO 多路复用机制是指一个线程处理多个 IO 流,就是我们经常听到的select/epoll 机制。在 Redis 只运行单线程的情况下,同时存在多个监听套接字和已连接套接字。内核会一直监听这些套接字上的连接请求.原创 2021-05-09 00:31:51 · 1596 阅读 · 0 评论 -
Redis数据结构
Redis的底层数据结构一共有6种,分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。String 类型的底层实现只有一种数据结构,也就是简单动态字符串。而 List、Hash、Set 和 Sorted Set 这四种数据类型,都有两种底层实现结构。通常情况下,我们会把这四种类型称为集合类型,它们的特点是一个键对应了一个集合的数据。为了实现从键到值的快速访问,Redis 使用了一个哈希表来保存所有键值对。一个哈希表,其实就是一个数组,数组的每个元素称为一个哈希桶。一个哈希..原创 2021-05-08 15:46:14 · 142 阅读 · 0 评论