redis
文章平均质量分 90
jeff-y
所有文章用于个人记录,仅供参考,有错误的地方还请指出错误。
展开
-
redis集群-----切片集群(cluster)
背景上篇文章聊到了redis的哨兵机制,哨兵的作用是保证主从节点宕机或者故障的时候可以可以进行自愈,选举合适的master并且告知client。这个机制也就保证了redis集群的可用性。但是这次我们又遇到了新问题,那就是主从复制架构的情况下redis 的内存不够用了该怎么办。有人说那就不断的阔各个机器的内存,按照常理我们都知道一个人的力量是有限的。当一个节点的内存过大,那么我们在进行同步的时候会通过RDB文件进行同步,而生成rdb文件是通过fork一个子进程进行的(下篇文章我们仔细聊下这个过程),在进行原创 2022-03-21 00:20:57 · 1686 阅读 · 0 评论 -
redis集群——哨兵机制(sentinel)
redis集群——哨兵机制(sentinel)redis集群——哨兵机制(sentinel)上一篇文章有讲到redis的主从复制《https://blog.csdn.net/weixin_40413961/article/details/123463661?spm=1001.2014.3001.5501》,读写分离的集群架构方式. 我们也聊到了一些缺点,主节点挂了怎么办呢?接下来我们就详细聊一下什么是哨兵机制?既然解决的问题是主节点挂掉了该怎么办,服务该给那个节点写呢?不写就数据不一致了,服务就原创 2022-03-17 22:00:21 · 1225 阅读 · 0 评论 -
浅入浅出Caffeine cache
背景公司项目中有用到caffeine cache 所以来了解一下。本地缓存也就是我们适用内存缓存一些热点数据,使应用程序的程序处理的更加的快。以及保护我们的一些有IO操作的函数/方法,以达到提高我们应用程序吞吐的目的。对于java技术栈来讲我们通常使用到的本地缓存都有 一些原有的容器HashMap,google的guava cache等等。今天了解一下caffine缓存。简介Caffeine 是基于Java 8 开发的、提供了近乎最佳命中率的高性能本地缓存组件,Spring5 开始不再支持 Gua原创 2021-07-24 22:01:30 · 1296 阅读 · 3 评论 -
redis数据结构脑图
原创 2020-09-24 20:24:15 · 240 阅读 · 1 评论 -
Redis的线程I/O模型
背景redis 是单线程的,为什么redis要采用单线程,而不采用多线程呢?redis 是基于内存进行存储数据的,所以CPU不是redis的瓶颈。我们一般为什么要使用多线程呢?并发处理,提高处理的效率。且我们的系统一般搜需要去进行IO读取存储在磁盘的数据(数据库,本地本文件等)才进行处理的,所以单线程的话极其容易阻塞,会导致服务吞吐量很低。但是redis并不会,redis是基于内存的,所有的运算都是内存级别的运算。那既然说到这里了,那这开个多线程那岂不是更快???? 多线程的存在也有他的问题,只原创 2020-09-07 21:51:33 · 217 阅读 · 0 评论 -
细品redis的Scan和Keys命令
背景我们有一个类似用户中心,其中有百万级别用户以user_id + id号为key存放在redis中。有一个需求是将user_为前缀进行匹配查询进行key的匹配,就在进行这个的操作命令的时候出现服务卡顿和redis 有部分链接超时。最后排查出来的问题所在就是keys的时候查出来的key太多导致的问题。具体原因那就从他这个命令的原理看起最后的解决方案是:使用scan命令Keys简介通过简单的正则就可以进行模糊匹配,没有分页,没有游标。就是暴力查找遍历。好处就是方便,坏处应有仅有,redis是原创 2020-09-01 22:29:27 · 4204 阅读 · 0 评论 -
细品服务并发限流+Redis-cell的使用
背景今天热搜“海底捞的排号系统挂掉了”,也许是今天情人节,各位情侣去海底捞约会,进入排号系统的流量猛增,导致服务支撑不住,直接挂掉,在这里只是猜测(大胆猜测,小心求证)。那我们应该如何防止因为流量突然猛增而导致服务挂掉的问题呢?那就是限流了。那我们通过redis 来设计限流策略。服务限流简介通过压测我们可以压出我们服务接口可以承受最大的QPS或者TPS,但是我们压测的话只是单压并不知道在生产环境所能承受的最大流量。如果说其他业务接口也在跑,那这就很难把控这个接口在生产环境可以定多大的QPS或TP原创 2020-08-30 18:59:24 · 2312 阅读 · 1 评论 -
布隆过滤器与缓存击穿
背景公司用户中心,有大量的用户请求,为防止缓存击穿,需要设计一个缓存策略 ,将恶意请求过滤掉。什么是缓存击穿得搞清楚。就是有人恶意传入本来数据库就不存在的用户ID,然后大量请求数据库导致数据库挂掉(这里的缓存使用redis)需求设计redis没有拦住,那肯定是没有拦住的呀。因为redis中没有这个数据,一般策略就是去数据库中读,如果读到了就返回且更新到缓存中(且设置一个过期时间),没有读到就进行回填空值到reids中防止同一个数据库中不存在userId多次请求。但是这里的userId是不同的且不原创 2020-08-20 21:47:27 · 2547 阅读 · 8 评论 -
细品Reids的HyperLogLog数据结构
背景实现一个统计页面的UV数据,每个网页的用户访问量(同一个用户多次请求只算一次)。那这个功能我们怎么去实现呢?也许有同学就会说了,我们都用的是growingIO,不用自己实现成本太高,直接用别人的。这样也挺好。今天我们来看一下我们自己如何实现这个需求并且可以抗击较高的TPS服务呢?设计方案既然是页面用户量的统计是不重复的那我们选择一个数据结构那就是SET集合进行存储。将用户的ID进行存储,如果是没有登录的用户随机生成一个(使用时间戳等),存入set。为了快那就基于内存来搞?但是不可能用自身服务原创 2020-08-18 23:51:15 · 293 阅读 · 0 评论 -
redis高性能数据结构之有序集
背景已经讲了两个数据结构了,今天我们来讲一下在redis中最具有特色的数据结构zset(有序列表)ZSET简介zset有序列表,显而易见意思就是一个有序且是不重复上的数据结构,它类似于Java中的sortset和hashmap的结合体,但是在redis中是通过两种底层数据结构实现的。一种是ziplist压缩列表,另一种就是redis中最经典的数据结构skipList跳跃表。底层数据结构的选择第一次插入数据结构的选择在使用ZDD 命令添加第一个元素到空key时,程序通过检查输入的第一个元素来决原创 2020-08-16 19:05:42 · 1077 阅读 · 0 评论 -
细品redis分布式锁
背景已经写了两节的redis的高性能数据结构了点击查看,今天换个口味,今天我们看一下redis在分布式系统中的应用,使用redis做分布式锁,这可以说是老生常谈的问题了。redis分布式锁分布式锁解决的问题说到锁,第一反应就是线程阻塞,在这里需要注意的是这里的维度会上升一个层次,不单单是一个服务(进程)的线程之间,是多个服务之间的并发安全问题,也可以这么说吧多个进程(这两个进程之间是分别在两个服务上的)之间的并发问题。所以说这里使用线程之间的锁是不能解决问题的如(reentrantLock,Sych原创 2020-08-14 00:57:20 · 1151 阅读 · 0 评论 -
细品Redis高性能数据结构之hash对象
背景上一节讲Redis的高性能字符串结构SDS,今天我们来看一下redis的hash对象。Hash对象简介redis的hash对象有两种编码(底层实现)方式,字典编码和压缩列表编码。在使用字典编码的时候程序就是将hash表的key存为字典的键,hash的value作为字典的值,字典的键值都是用的是字符串类型。在哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节和哈希对象保存的键值对数量小于 512 个使用的是ziplist,不能满足这个的使用的是hashtable(字典编码)深度原创 2020-08-12 01:37:51 · 1473 阅读 · 0 评论 -
细品Redis高性能数据结构之SDS
背景redis之所以快,除了他是基于内存存储的,还有优秀的IO框架外更离不了其底层高性能数据结构的设计。现在我们来细细品一下redis的高新能数据结构是如何设计的。Redis数据结构redis有五种数据结构,分别是String,list(列表),Set(集合),Hash(哈希),Zset(有序结合)。这五种数据结构代表的是他的Value值的数据结构。今天我们来看redis的String类型。动态字符串SDS。SDS(Simple Dynamic String)redis中的字符串是一个动态可修改原创 2020-08-10 23:13:19 · 1052 阅读 · 0 评论 -
redis的持久化存储AOF的原理
背景上篇文章我们将了RDB的原理,这节来看看AOF。AOF字面的意思是,append only file仅追加文件。AOF 是以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件,以此达到记录数据库状态的目的。是不是和mysql的binlog日志模式还是有点类似mysql的binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。AOFAOF是通过记录写入的命令来同步和原创 2020-06-07 16:50:44 · 685 阅读 · 0 评论 -
redis的持久化存储RDB的原理分析
背景想到redis,你的第一反应是什么呢?redis很快,我们一般一用它做缓存,再想想他为什么快呢?也许你的第一反应和我的第一反应是一样的,因为他是基于内存存储的,IO多路复用等。那么既然是基于内存存储的,那要是redis当宕机了那岂不是内存的数据都无法恢复了(在一些特殊情况下数据比较重要的情况)。那redis是如何解决这一问题?那就是redis的持久化机制。redis持久化机制redis 有两种持久化方式,RDB和AOF,今天我们主要先聊聊RDB持久化数据1. RDB权威指南(redis官方原创 2020-06-07 00:35:23 · 1969 阅读 · 0 评论 -
【redis】缓存穿透的解决方案
解决缓存穿透 我们得首先知道什么是缓存穿透吧?缓存穿透就是在缓存中没有查到数据,而去数据库去查询。少量的缓存穿透对系统是没有影响的。但是大量的访问数据库则是有问题的,如2/8原则,百分之20是重要的数据 ,百分之80是次要的。也就是百分之20可以去访问DB而百分之80去访问cache。1.回种空值当有大量的无效用户访问缓存时这个时候肯定不会有key 则就会大量请求数据库,然后再去数据库...原创 2020-03-10 21:36:28 · 213 阅读 · 0 评论 -
redis keys和scan命令
redis keys和scan命令redis的keys命令1.自1.0.0起可用。时间复杂度: O(N),其中N为数据库中密钥的数目,假设数据库中的密钥名称和给定模式的长度有限。返回所有匹配的键pattern。尽管此操作的时间复杂度为O(N),但恒定时间却很短。例如,运行在入门级笔记本电脑上的Redis可以在40毫秒内扫描一百万个密钥数据库。警告:将KEYS视为命令,仅应在生产环境中格...原创 2019-11-22 13:23:07 · 304 阅读 · 0 评论 -
深入理解分布式锁
深入理解分布式锁什么是分布式锁?分布式锁是实现有序调度不同的进程,解决分布式系统下不同进程之间相互干扰的问题的技术手段分布式锁的实现方式redis:利用redis的setnx命令,此命令同样是原子性的操作,只有在key不存在的情况下,add成功mechache:利用mechache的add命令,改命令是原子性的操作,只有在key 不存在的情况下,才能add成功,也就意味着线程拿到了锁...原创 2019-11-21 23:30:53 · 191 阅读 · 0 评论 -
跳跃表(跳表)
什么是跳跃表?跳跃表是将链表改造支持二分法查找的数据结构 ,如果是一个单链表的话,他查找数据的时间复杂度为O(n),于是给单链表添加一级索引 每两个节点提取一个节点到上一级,我们把诌出来的哪一级叫做索引或者索引层,如下图:如上图当你查找16的时候,你只需要遍历7次就可以得到结果值 , 先去第一层索引查到,遍历到13的时候 发现下一个节点是17 那我们就知道此时16就在这两个节点之间,所以我...原创 2019-10-08 09:54:32 · 2019 阅读 · 0 评论 -
redis的sortset为什么使用的是跳表,而不使用红黑树?
redis的有序号集合是通过跳表来实现的,严格地讲还有散列表我们都知道redis的有序集合操作都包括 :插入一个数据删除一个数据,-查找一个数据,按照区间查找数据(例如[100,256])之间的数据),迭代输出有序序列。其中插入删除,删除,查找以及迭代输出时间复杂度红黑树和跳表的时间复杂度是一样的。跳表在区间查询的时候效率是高于红黑树的,跳表进行查找O(logn)的时间复杂度...原创 2019-10-07 14:01:27 · 1537 阅读 · 0 评论 -
redis为什么快?
基于内存存储Redis是一个开源的内存中的数据结构存储系统,redis也提供持久化的选项可以持久话到磁盘里面(可以通过命令)正是因为redis是内存中的数据结构存储体系所以他是不受io限制的,每一次CPU进行一次IO读去一个数据块是非常耗时间的(直接在内存中读取和在磁盘中读取大概相差40多倍)看看下面的这两张图真的是太直观了。拓展一下:第一张图说的是数据库的: 储存索引的话也就是咋们创键索...原创 2019-09-02 23:15:55 · 826 阅读 · 0 评论