![](https://img-blog.csdnimg.cn/20210823103945607.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Redis
文章平均质量分 88
Redis
码上得天下
这个作者很懒,什么都没留下…
展开
-
Redis数据结构之listpack
当数据量较小时,Redis 会优先考虑用 ziplist 来存储 hash、list、zset,这么做可以有效的节省内存空间,因为 ziplist 是一块连续的内存空间,它采用一种紧凑的方式来存储元素。但是它也有缺点,比如查找的时间复杂度高、内存分配的开销、连锁更新的风险等。转载 2024-05-31 15:46:10 · 56 阅读 · 0 评论 -
redis的一个Hyperloglog占12kb详细解析
redis中有一种数据格式,hyperloglog,本文就此数据结构的作用、redis的实现及其背后的数学原理作一个整理。当然本文不包含任何数学公式,而是希望用直观的例子帮大家理解。主要内容如下:1.业务场景2.使用效果3.数学原理4.redis的实现原理。转载 2024-05-30 23:43:50 · 65 阅读 · 0 评论 -
为什么要有哨兵?
Redis 在 2.8 版本以后提供的哨兵(Sentinel)机制,它的作用是实现主从节点故障转移。它会监测主节点是否存活,如果发现主节点挂了,它就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端。监控、选主、通知。哨兵节点通过 Redis 的发布者/订阅者机制,哨兵之间可以相互感知,相互连接,然后组成哨兵集群,同时哨兵又通过 INFO 命令,在主节点里获得了所有从节点连接信息,于是就能和从节点建立连接,并进行监控了。1、第一轮投票:判断主节点下线。转载 2024-03-19 11:27:03 · 43 阅读 · 0 评论 -
使用Redis是并发安全的吗?
乐观锁则是一种更为轻量级的锁机制,它假定在并发操作中,数据的冲突很少发生,因此不需要每次都加锁,而是在更新数据时检查数据版本号或者时间戳,如果版本号或时间戳不一致,则说明其他线程已经更新了数据,此时需要回滚操作。在执行事务之前,我们需要使用 jedis.watch() 方法监视需要监视的键,然后使用 jedis.multi() 方法开启事务,将需要执行的命令添加到事务块中,最后使用 tx.exec() 方法提交事务。首先,事务只能保证事务块内的命令是原子性的,事务块之外的命令不受事务的影响。转载 2023-10-20 11:32:42 · 179 阅读 · 0 评论 -
为什么Redis集群的最大槽数是16384个?
Redis主节点的配置信息中,它所负责的哈希槽是通过一张bitmap的形式来保存的,在传输过程中,会对bitmap进行压缩,但是如果bitmap的填充率slots / N很高的话(N表示节点数),bitmap的压缩率就很低。那么,对于节点数在1000以内的redis cluster集群,16384个槽位够用了,没有必要拓展到65536个。Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。而16384÷8÷1024=原创 2023-10-19 17:40:52 · 165 阅读 · 0 评论 -
Redis持久化之AOF原理
它也是Redis持久化的重要手段之一,aof-》Append Only File,只追加文件,也就是每次处理完请求命令后都会将此命令追加到aof文件的末尾。而RDB是压缩成二进制等时机开子进程去干这件事。转载 2023-08-04 18:54:05 · 493 阅读 · 0 评论 -
Redis持久化之RDB原理
仅仅是共享fork()出子进程的那一刻的内存数据,后期主进程修改数据对子进程不可见,同理,子进程修改的数据对主进程也不可见。其实就是更改数据的之前进行copy一份更改数据的数据页出来,比如主进程收到了set k 1请求(之前k的值是2),然后这同时又有子进程在rdb持久化,那么主进程就会把k这个key的数据页拷贝一份,并且主进程中k这个指针指向新拷贝出来的数据页地址上,然后进行更改值为1的操作,这个主进程k元素地址引用的新拷贝出来的地址,而子进程引用的内存数据k还是修改之前的。父子进程的数据是隔离的。转载 2023-08-03 13:52:31 · 1037 阅读 · 0 评论 -
Guava Cache自动加载异步刷新代码实现
public interface ILocalCache<K, V>{ /** * 从缓存中获取数据 * @param key * @return value */ public V get(K key);}/*** @Description: 用于初始化cache的参数及其缺省值*/public abstrac...原创 2020-01-19 21:17:48 · 3481 阅读 · 0 评论 -
Redis的数据同步机制
本文总结了Redis主从库读写分离模式数据同步的总体机制 及 基本流程,了解了全量同步 和 增量同步的过程,涉及了 主从级联模式 和 repl_backlog_buffer缓冲区。转载 2023-06-05 18:59:38 · 902 阅读 · 0 评论 -
redis的底层数据结构
也就是说为什么要提供这么多的数据结构呢?转载 2023-06-05 12:33:38 · 1122 阅读 · 1 评论 -
redis线程模型
Reactor模型都是 利用IO多路复用接收客户端请求。不同点在于接受请求后的处理。转载 2023-06-05 11:28:53 · 3711 阅读 · 4 评论 -
Redis的VM机制
Redis 直接自己构建了 VM 机制 ,不会像一般的系统会调用系统函数处理,会浪费一定的时间去 移动 和 请求,而 Redis 不存在。这也是 Redis 能够那么快的一个原因之一了。转载 2023-06-05 10:22:58 · 105 阅读 · 0 评论 -
Redis数据结构篇-全局Hash表
那么为了实现链式哈希, Redis 在每个 dictEntry 的结构设计中,除了包含指向键和值的指针,还包含了指向下一个哈希项的指针。当然,当字符串大于 44 字节时,SDS 的数据量就开始变多了,Redis 就不再把 SDS 和 RedisObject 布局在一起了,而是会给 SDS 分配独立的空间,并用指针指向 SDS 结构。一方面,当保存的是 Long 类型整数时,RedisObject 中的指针就直接赋值为整数数据了,这样就不用额外的指针再指向整数了,节省了指针的空间开销。转载 2023-03-28 15:25:05 · 940 阅读 · 0 评论 -
redis原理之string底层数据结构SDS
通常,我们说Redis 是用 C 语言写的,但是对于Redis的字符串,却不是 C 语言中的字符串(即以空字符’\0’结尾的字符数组),它是自定义的数据结构SDS(simple dynamic string),并将 SDS 作为 Redis的默认字符串表示。一、SDS 定义struct sdshdr{ //记录buf数组中已使用字节的数量 //等于 SDS 保存字符串的长度 int len; //记录 buf 数组中未使用字节的数量 int fre转载 2022-01-03 21:06:00 · 128 阅读 · 0 评论 -
redis数据同步时的过程
叙述今天我们来探讨一下redis的主从复制的数据同步阶段的全量复制和增量复制.数据同步过程在Redis2.8以前,从节点向主节点发送sync命令请求同步数据,此时的同步方式是全量复制;在Redis2.8及以后,从节点可以发送psync命令请求同步数据,此时根据主从节点当前状态的不同,同步方式可能是全量复制或增量复制。下面介绍以Redis2.8及以后版本为例。全量复制:用于初次复制或其它无法进行增量复制的情况,将主节点中的所有数据都发送给从节点,是一个非常重型的操作。 增量复制:用于网络中转载 2022-01-03 20:49:44 · 1314 阅读 · 0 评论 -
Redis 的常见使用场景有哪些?
目录缓存 数据共享分布式 分布式锁 全局ID 计数器 限流 位统计 购物车 用户消息时间线timeline 消息队列 抽奖 点赞、签到、打卡 商品标签 商品筛选 用户关注、推荐模型 排行榜1、缓存String类型例如:热点数据缓存(例如报表、明星出轨),对象缓存、全页缓存、可以提升热点数据的访问数据。2、数据共享分布式String 类型,因为 Redis 是分布式的独立服务,可以在多个应用之间共享例如:分布式Session<dependen转载 2021-10-25 16:27:41 · 305 阅读 · 0 评论 -
浅析Redis分布式集群倾斜问题
对于分布式系统而言,整个集群处理请求的效率和存储容量,往往取决于集群中响应最慢或存储增长最快的节点。所以在系统设计和容量规划时,我们尽量保障集群中各节点的“数据和请求分布均衡“。但在实际生产系统中,出现数据容量和请求倾斜(类似Data Skew)问题是比较常见的。示例:2019年春节抽奖服务,业务评估峰值qps是2w,转化到redis集群为10w qps和5GB内存存储,部署5个分片每个分片1GB+2W qps的redis集群(包含预留容量)。结果活动开始时,才发现服务存在”热点key",请求严重倾斜,转载 2021-10-22 16:17:03 · 268 阅读 · 0 评论 -
如何优雅地删除Redis大键
关于Redis大键(Key),我们从[空间复杂性]和访问它的[时间复杂度]两个方面来定义大键。前者主要表示Redis键的占用内存大小;后者表示Redis集合数据类型(set/hash/list/sorted set)键,所含有的元素个数。以下两个示例:1个大小200MB的String键(String Object最大512MB);内存空间角度占用较大1个包含100000000(1kw)个字段的Hash键,对应访问模式(如hgetall)时间复杂度高因为内存空间复杂性处理耗时都非常小,测试 d转载 2021-10-22 15:58:43 · 600 阅读 · 0 评论 -
redis分布式锁主节点宕机导致锁丢失怎么解决?
普通实现说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道set key value px milliseconds nx。后一种方式的核心实现命令如下:- 获取锁(unique_value可以是UUID等)SET resource_name unique_value NX PX 30000- 释放锁(lua脚本中,一定要比较value,防止误解锁)if redis.call("get",KEYS[1]) == ARGV[1] then return redis.转载 2021-10-12 16:35:05 · 5432 阅读 · 3 评论 -
内存耗尽后 Redis 会发生什么?
作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当Redis服务器的内存耗尽后,如果继续执行请求命令,Redis会如何处理呢?设置有效期使用Redis服务时,很多情况下某些键值对只会在特定的时间内有效,为了防止这种类型的数据一直占有内存,我们可以给键值对设置有效期。Redis中可以通过4个独立的命令来给一个键设置过期时间:expire key ttl:将key值的过期时间设置为ttl秒。 pexpire key ttl:将key值的过期时间设置为t...转载 2021-09-14 09:48:28 · 199 阅读 · 0 评论 -
Redis 6.0引入多线程
Redis 作为一个基于内存的缓存系统,一直以高性能著称,因没有上下文切换以及无锁操作,即使在单线程处理情况下,读速度仍可达到11万次/s,写速度达到8.1万次/s。但是,单线程的设计也给Redis带来一些问题:只能使用CPU一个核; 如果删除的键过大(比如Set类型中有上百万个对象),会导致服务端阻塞好几秒; QPS难再提高。针对上面问题,Redis在4.0版本以及6.0版本分别引入了Lazy Free以及多线程IO,逐步向多线程过渡,下面将会做详细介绍。单线程原理都说Redis是...转载 2021-05-14 16:32:15 · 192 阅读 · 0 评论 -
Redis原理面试题
面试官:你好,小张。我看了你的简历,熟练掌握Redis,那么我就随便问你几个Redis相关的问题吧。首先我的问题是,Redis是单线程还是多线程呢?小张:Redis不同版本之间采用的线程模型是不一样的,在Redis4.0版本之前使用的是单线程模型,在4.0版本之后增加了多线程的支持。在4.0之前虽然我们说Redis是单线程,也只是说它的网络I/O线程以及Set 和 Get操作是由一个线程完成的。但是Redis的持久化、集群同步还是使用其他线程来完成。4.0之后添加了多线程的支持,主要是体转载 2021-05-11 15:27:38 · 668 阅读 · 0 评论 -
关于 Redlock 的讨论
为了引出本文要讨论的关于 Redlock 的神仙打架的问题,我们就得先通过一个面试连环炮:Redis 做分布式锁的时候有需要注意的问题? 如果是 Redis 是单点部署的,会带来什么问题? 那你准备怎么解决单点问题呢? 集群模式下,比如主从模式,有没有什么问题呢? 你知道 Redis 是怎么解决集群模式也不靠谱的问题的吗? 那你简单的介绍一下 Redlock 吧? 你觉得 Redlock 有什么问题呢?单点的 Redis 做分布式锁不靠谱,导致了基于 Redis 集群模式的分布式锁解决方案转载 2021-05-11 14:45:26 · 1335 阅读 · 0 评论 -
【分布式锁】05-使用Redisson中Semaphore和CountDownLatch原理
前言前面已经写了Redisson大多的内容,我们再看看Redisson官网共有哪些组件:剩下还有Semaphore和CountDownLatch两块,我们就趁热打铁,赶紧看看Redisson是如何实现的吧。我们在JDK中都知道Semaphore和CountDownLatch两兄弟,这里就不多赘述,不了解的可以再回头看看。Semaphore使用示例先看下Semaphore原理图如下:接着我们看下Redisson中使用的案例:RSemaphore semaphore .转载 2021-05-10 14:12:01 · 1565 阅读 · 0 评论 -
【分布式锁】04-使用Redisson实现ReadWriteLock原理
前言关于读写锁,大家应该都了解JDK中的ReadWriteLock, 当然Redisson也有读写锁的实现。所谓读写锁,就是多个客户端同时加读锁,是不会互斥的,多个客户端可以同时加这个读锁,读锁和读锁是不互斥的Redisson中使用RedissonReadWriteLock来实现读写锁,它是RReadWriteLock的子类,具体实现读写锁的类分别是:RedissonReadLock和RedissonWriteLockRedisson读写锁使用例子还是从官方文档中找的使用案例...转载 2021-05-10 13:53:34 · 557 阅读 · 0 评论 -
【分布式锁】03-使用Redisson实现RedLock原理
前言前面已经学习了Redission可重入锁以及公平锁的原理,接着看看Redission是如何来实现RedLock的。RedLock原理RedLock是基于redis实现的分布式锁,它能够保证以下特性:互斥性:在任何时候,只能有一个客户端能够持有锁;避免死锁: 当客户端拿到锁后,即使发生了网络分区或者客户端宕机,也不会发生死锁;(利用key的存活时间) 容错性:只要多数节点的redis实例正常运行,就能够对外提供服务,加锁或者释放锁;RedLock算法思想,意思是不能只在一个redis转载 2021-05-10 11:48:16 · 507 阅读 · 0 评论 -
【分布式锁】02-使用Redisson实现公平锁原理
前言前面分析了Redisson可重入锁的原理,主要是通过lua脚本加锁及设置过期时间来保证锁执行的原子性,然后每个线程获取锁会将获取锁的次数+1,释放锁会将当前锁次数-1,如果为0则表示释放锁成功。可重入原理和JDK中的可重入锁都是一致的。Redisson公平锁原理JDK中也有公平锁和非公平锁,所谓公平锁,就是保证客户端获取锁的顺序,跟他们请求获取锁的顺序,是一样的。公平锁需要排队,谁先申请获取这把锁,谁就可以先获取到这把锁,是按照请求的先后顺序来的。Redisson实现公平锁源码分析转载 2021-05-10 11:37:47 · 1765 阅读 · 2 评论 -
【分布式锁】01-使用Redisson实现可重入分布式锁原理
前言主流的分布式锁一般有三种实现方式:数据库乐观锁 基于Redis的分布式锁 基于ZooKeeper的分布式锁之前我在博客上写过关于mysql和redis实现分布式锁的具体方案:分布式锁的几种实现原理,里面主要是从实现原理出发。这次【分布式锁】系列文章主要是深入redis客户端reddision源码和zk 这两种分布式锁的实现原理。可靠性首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件:互斥性。在任意时刻,只有一个客户端能持有锁。 不会发生死锁。即使有一转载 2021-05-10 11:00:50 · 535 阅读 · 0 评论 -
阿里云数据库 Redis
https://help.aliyun.com/document_detail/148603.html?spm=5176.13840820.0.dexternal.1d056375zaOXTs#task-2378182原创 2021-01-11 11:44:43 · 146 阅读 · 0 评论 -
Redis删除策略和逐出策略
本文知识点过期数据概念数据删除策略逐出算法过期数据先来看三个key值,分别为sex、name、age。这三个值设置的指令为 set name kaka setex age 100 24 setex sex 10 1在redis中我们可以使用ttl来获取某个key的状态,下面我们来使用ttl分别获取一下上边name、age、sex的状态可以看到出来了三个值,分别为 -1 775 -2那么这三个值给出的信息是什么呢!-1 表示永久有效的数据 775 这个值是设置..转载 2020-10-28 19:11:40 · 445 阅读 · 0 评论 -
redis zset底层数据结构
zset底层存储结构 zset底层的存储结构包括ziplist或skiplist,在同时满足以下两个条件的时候使用ziplist,其他时候使用skiplist,两个条件如下:有序集合保存的元素数量小于128个 有序集合保存的所有元素的长度小于64字节 当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值。 当skiplist作为zset的底层存储结构的时候,使用skiplist按序保存元素及分值转载 2020-10-28 18:59:55 · 1170 阅读 · 1 评论 -
redis set底层数据结构
set底层存储 redis的集合对象set的底层存储结构特别神奇,我估计一般人想象不到,底层使用了intset和hashtable两种数据结构存储的,intset我们可以理解为数组,hashtable就是普通的哈希表(key为set的值,value为null)。是不是觉得用hashtable存储set是一件很神奇的事情。 set的底层存储intset和hashtable是存在编码转换的,使用intset存储必须满足下面两个条件,否则使用hashtable,条件如下:结合对象保存的所有元素都是整数转载 2020-10-28 18:54:41 · 5340 阅读 · 0 评论 -
redis hash底层数据结构
hash底层存储结构redis的哈希对象的底层存储可以使用ziplist(压缩列表)和hashtable。当hash对象可以同时满足一下两个条件时,哈希对象使用ziplist编码。哈希对象保存的所有键值对的键和值的字符串长度都小于64字节 哈希对象保存的键值对数量小于512个redis hash数据结构redis的hash架构就是标准的hashtab的结构,通过挂链解决冲突问题。redis ziplist数据结构ziplist的数据结构主要包括两层,ziplist和z..转载 2020-10-28 18:51:26 · 1232 阅读 · 0 评论 -
redis list底层数据结构
redis list数据结构 redis list数据结构底层采用压缩列表ziplist或linkedlist两种数据结构进行存储,首先以ziplist进行存储,在不满足ziplist的存储要求后转换为linkedlist列表。 当列表对象同时满足以下两个条件时,列表对象使用ziplist进行存储,否则用linkedlist存储。列表对象保存的所有字符串元素的长度小于64字节 列表对象保存的元素数量小于512个。redis list元素添加过程 list的数据添加根据传入的变量个数一个个顺转载 2020-10-28 18:46:44 · 3595 阅读 · 1 评论 -
redis string底层数据结构
redis数据存储结构 redis的内部整体的存储结构就是一个大的hashmap,内部实现是数组实现hash,冲突通过挂链去实现,然后每个dictEntry就是一个key/value对象。dictEntry的key指向set key value命令中的key对应的对象,dictEntry的v指向set key value命令中的value对应的对象。dictEntry 内部包含数据存储的key和v变量,同时包含一个dictEntry的next指针连接落入同一个hash桶的对象。dictEntry转载 2020-10-28 18:43:25 · 1659 阅读 · 1 评论 -
一致性哈希算法在分布式缓存中的应用
目的1.介绍一致性hash算法(Consistent Hashing)及其在分布式缓存中的应用,以及对一致性hash算法原理的介绍。2.福利彩蛋应用场景假设我们有一个网站,最近发现随着流量增加,服务器压力越来越大,之前直接读写数据库的方式不太给力了,于是我们想引入Redis作为缓存机制。现在我们一共有三台机器可以作为Redis服务器,如下图所示。要解决的问题一般来说我们在大规模访问,大并发流量下都会使用到分布式缓存,即将廉价机器部署在同一个子网内,形成多机器集群,然后.转载 2020-08-19 20:12:23 · 149 阅读 · 0 评论 -
Redis AOF 持久化详解
Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是一旦进程退出,Redis 的数据就会丢失。为了解决这个问题,Redis 提供了 RDB 和 AOF 两种持久化方案,将内存中的数据保存到磁盘中,避免数据丢失。RDB的介绍在这篇文章中《Redis RDB 持久化详解》,今天我们来看一下 AOF 相关的原理。AOF( append only file )持久化以独立日志的方式记录每次写命令,并在 Redis 重启时在重新执行 AOF 文件中的命令转载 2020-08-19 19:42:56 · 114 阅读 · 0 评论 -
Redis RDB 持久化详解
Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是一旦进程退出,Redis 的数据就会丢失。为了解决这个问题,Redis 提供了 RDB 和 AOF 两种持久化方案,将内存中的数据保存到磁盘中,避免数据丢失。antirez 在《Redis 持久化解密》一文中说,一般来说有三种常见的策略来进行持久化操作,防止数据损坏: 方法1 是数据库不关心发生故障,在数据文件损坏后通过数据备份或者快照来进行恢复。Redis 的 RDB 持久化就是这种方转载 2020-08-19 19:38:18 · 256 阅读 · 1 评论