
Redis
mango_love
习而简之,简而精之
展开
-
Redis分布式基础主从同步
在使用Redis的时候首先开始是从单台Redis服务器开始,随着业务和用户量的增长,单机会暴漏一些问题,比如单台服务器的响应达到了上限、Redis服务器宕机所有请求全部越过缓存等等一系列问题。那么我们最简单的就是有一个备用的Redis服务器,当主服务器挂了从服务器就顶替主服务器继续服务,提高可用性。我们拥有了主从两台Redis服务器之后,当主服务器挂掉之后从服务器就替换上去继续为我们服务,原来的主服务器恢复正常后我们两台服务器的数据又不一样了,那么我们如何保证这两台服务器的数据一致性问题呢呢?原创 2020-07-08 12:49:23 · 2928 阅读 · 0 评论 -
Redis解读持久化RDB和AOF原理
我们知道关系型数据库比如MySQL支持全备、差备、增备。为了保证Redis故障重启后仍然可用我们的Redis支持全备(RDB快照备份)和增备(AOF日志连续增量备份),下面我们就来解读Redis持久化的原理。RDB基础知识RDB文件存在是以一个压缩后的二进制文件,这个RDB文件一般是保存在Redis安装目录下,通过启动Redis服务器执行rdbLoad函数加载RDB文件,执行rdbSave函数保存RDB文件。RDB保存rdbSave函数负责将内存中的数据库数据以RDB格式保存到磁盘中,如原创 2020-07-04 18:44:24 · 4798 阅读 · 0 评论 -
Redis数据库实现原理(划重点)
Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每一项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库,服务器设置dbnum属性为初始数据库的个数,这个属性一般由数据库服务器配置conf文件中的database节点来配置,默认情况下这个初始值是16。struct redisServer{//数据库redisDb*db;//服务器数量intdbnum;};数据库切换...原创 2020-06-29 01:32:26 · 6228 阅读 · 0 评论 -
Redis实现消息队列之发布订阅模式
发布订阅(pub/sub)是一种消息通信模式:发送者(pub)在某一频道发送消息,订阅者(sub)接收消息。发布订阅模式类似与微博关注,比如说博主mango被张三、李四、王五关注,那么mango发一篇微博的时候张李王三人都会从关注里看到这条微博。那么发布订阅和生产消费有何异同之处呢?生产消费主要是生成一个消息只能被一个客户端消费,而发布订阅可以理解为发布一条消息,在该频道中的所有客户端都会收到,所以有时候我们这个发布订阅类似广播。注意pubsub是一个数据结构。Pub/Sub(发布订阅)原创 2020-06-18 01:06:09 · 4746 阅读 · 0 评论 -
Redis实现消息队列之生产消费模式
简单的介绍下消息队列,使用消息队列首先我们得有一个队列,那么这个队列之前讲过就是先进先出的一个数据结构;那么有了队列以后我们还需要有人在队列里面放东西,那么这个放东西的人我们称之为生产者;有了生产者对应的需要一个消费者,没有消费者这个队列满了就会溢出。简单队列实现那么我们Redis刚好有一个数据类型符合这个就是List。list可以实现队列(先进先出)和栈(先进后出),那么这个list又有两种插入数据的方式:头插法和尾插法。所以我们今天使用的结构是队列,使用尾插法,关键的命令有rpush(尾插)原创 2020-06-15 11:22:05 · 6788 阅读 · 0 评论 -
Redis缓存穿透、击穿、雪崩来解释个明白
随着用户的增长,用户的请求也越来越频繁,为了保证服务器在高并发的情况能正常提供服务,我们首先引入了缓存Redis,减少数据库的压力和数据的安全性同时提高了接口反应效率,解决了用户的请求直接与数据库建立连接。但是在使用Redis的时候,随之而来的问题也会越来越多,有些请求甚至会直接越过Redis直接请求数据库,今天我们来了解Redis数据库经常会谈及的问题缓存雪崩、缓存击穿、缓存穿透。缓存雪崩在某一时刻,大量的key失效,用户大量请求直接请求数据库,导致数据库宕机。此时的Redis形同虚设,用户.原创 2020-06-08 13:44:57 · 18963 阅读 · 3 评论 -
Redis通讯协议RESP详解
Redis的作者认为数据库系统的瓶颈一般不在于网络流量,而是数据库自身内部逻辑处理上。所以即使Redis使用了浪费流量的文本协议,依然可以取得极高的访问性能。Redis将所有数据都放在内存,用一个单线程对外提供服务,单个节点在跑满一个CPU核心的情况下可以达到了10w/s的超高QPS。RESP(RedisSerializationProtocol)RESP是Redis序列化协议的简写。它是一种直观的文本协议,优势在于实现异常简单,解析性能极好。Redis协议将传输的结构数据分为5种最小单元类型,..原创 2020-06-04 20:37:34 · 1437 阅读 · 0 评论 -
Redis线程IO模型的秘密知多少
在前面事务里面讲过Redis是一个单线程应用程序,当然我们比较有代表性的单线程还有Node.js、Nginx等。那么既然是单线程的为什么还这么快呢?Redis的数据都在内存里面,所有的运算都是内存级别,处理数据是非常快速的,所以这里得注意一些复杂度为O(n)的指令,可能会导致服务器卡顿。那么Redis是一个单线程是如何处理并发客户端的连接呢?这就是接下来要讲的非阻塞IO、多路复用和事件轮询API。非阻塞IO那什么是阻塞IO模型?即在读写数据过程中会发生阻塞现象。当用户线程发出I原创 2020-06-03 23:55:50 · 4282 阅读 · 0 评论 -
Redis单线程模型事务的实现原理
在使用关系型数据库的时候,为了保证数据的ACID(Atomicity:原子性,Consistency:一致性,Isolation:隔离性,Durability:持久性)我们经常会使用事务,要么全部提交成功,要么失败全部失败,不会存在中间状态。那么我们Redis也会有事务,只不过它不能保证原子性,Redis已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为Redis不需要事务回滚的能力。redis为我们的事务提供了四个指令:multi(开启事务),discard(丢弃),exec(执行),wat原创 2020-06-02 00:31:00 · 1600 阅读 · 0 评论 -
Redis分布式锁如何提高可用性
在编程中我们时常考虑高并发带来的数据访问不安全问题,那么我们在redis中是否也要考虑呢?答案是肯定的,有人会问:redis不是单线程的吗?对它是单线程,但是在某些情况他会出现信息更新,用户没有拿到最新数据,然后导致操作有误,看下图我们可以看到张三和李四同时请求这个number,但是李四执行set后张三拿到的数据是没有更新的,而后执行了set命令,这样这个number应该是30才对。Redis分布式锁简介redis给我们提供了分布式锁,开启锁的指令是setnx(set if not exis原创 2020-06-01 12:22:45 · 11355 阅读 · 0 评论 -
Redis高并发限流策略之漏斗限流算法
在双11活动当天凌晨,打折活动开始前多少名客户下单可以半折甚至是免单优惠,客户当然不会放过这个一年一次的机会,疯狂开始。这时候我们程序员小哥哥就苦了,稍一个不注意,服务器驾崩了,次日头条见。那么为了防止在当天凌晨压死服务器的并发,我们想到了一个很好的策略,一分钟搞不定的事情,我们可以两分钟搞定,至少保证我们的服务器不会瘫痪,就是说,假如我们的服务器并发量是1w左右,那么我们可以限制在9000的并发量,超过这个预警我们就严格限制请求访问量不能做越过这个警戒线,做到削峰或者说是平滑这个爆发点。很快我们程序员原创 2020-05-30 16:24:33 · 23652 阅读 · 0 评论 -
Redis如何实现刷抖音不重复-布隆过滤器(Bloom Filter)
刷抖音的时候是否曾想过,我们刷过的视频很难在重复刷到那么它到底是如何实现的呢?如果说我们每刷一个视频并且把视频id和用户的id组合成一条数据保存到数据库中每次推荐视频的时候都去数据检测是否已经刷过了,嗯,这样可以实现这个功能,但是存在多个问题,频繁操作数据表对数据库造成很大的负担,每次推荐视频时都得保存数据,人流量一多,数据库很快就扛不住。那么我们可否使用缓存redis中的set来实现呢?当然是可以的,redis4.0版本给我们提供了更加快捷更加节省空间的数据结构--布隆过滤器(Bloom Filt原创 2020-05-28 23:48:52 · 13539 阅读 · 5 评论 -
Redis站点流量统计HyperLogLog
在我们做站点流量统计的时候一般会统计页面UV(独立访客:unique visitor)和PV(即页面浏览量:page view),那么我们最常见的处理方式就是用户点击一次就插入一条数据到数据库,统计的时候通过查询表来达到统计流量的效果。那么我们如果是通过redis来处理,我们可以使用string类型然后自增计数即可达到统计PV,统计UV可以使用set,每个用户id是唯一的可以放到这个集合里,统计的时候只需要执行scard获取集合大小即可。这两种方式都是可以实现站点的流量统计,但是如果说当站点流量非常原创 2020-05-28 00:43:48 · 15562 阅读 · 0 评论 -
Redis快速扫描Scan
在平时我们维护线上Redis的时候需要从n个key里面找到某些特定规则的key,可能查看某些key可能清理某些不需要的key,可能我们第一印象就是keys这个指令,我们可以使用这个指令匹配我们想要的key,下面我们来试试。keys指令基本用法>msetname1aname2ana1meana2meaOK> keys name*1) "name"2) "name2"3) "name1"> keys na*me1) "name"2) "na1me"3)"na2me...原创 2020-05-26 23:23:19 · 8596 阅读 · 0 评论 -
Redis之GeoHash
在生活中我们有时候需要点外卖、骑共享单车等等,我们打开软件找到附近餐厅、离我最近的单车,那么他们是怎么快速定位到的呢?我们把地图看作一个二维平面,我们在某个点上然后找到附近10km内的所有餐厅,这时候我们知道求两点直接的距离是需要一个公式,且需要知道两点的x,y轴坐标才能计算出距离,通过计算出距离然后进行排列,那么我们就能过找到离我最近的一个餐厅了。那么这里我们考虑几个问题,我每次搜索的时候需要计算我离餐厅的距离,那么我们能不能把这个距离保存起来呢?如果我保存了,我下次在另一个地方那是不是还得重新计..原创 2020-05-26 00:29:11 · 11489 阅读 · 0 评论 -
Redis位图
上课签到时间到了,张三老师开始点名了,每点一名同学就新增加一条记录,我们数据库会把这条记录写到学生考勤表里,到学期末考核的时候汇总根据学生迟到次数计算总学分。假设一个班级50个学生,一天4课时,一个星期就要记录1000条记录,那么如果说我们根据学生的学号顺序记录学生签到信息,通过“0”和“1”来表示,“1”就代表学生签到,“0”代表学生迟到,那么我们一个星期只要保存20条数据即可。Redis也有这样的结构名叫位图,位图最小的单位是bit,每个bit是由0或1构成,我们的字符串就是由很多个bit数组组成的原创 2020-05-24 17:52:58 · 9889 阅读 · 0 评论 -
Redis-集合(Set)基础
Redis集合包括Set(无序集合)和ZSet(有序集合),这里的Set实现相当于Java中的HashSet,它内部实现了一个特殊的字典,字典中所有的value都是一个值NULL。下面我们来熟悉下set的常用的命令Set>saddname hello(integer)1>saddnamehello#重复,不能插入(integer)0>saddnamei am ok(integer)3>smembers name"hello""i""am""ok">s...原创 2020-05-22 19:37:25 · 234 阅读 · 0 评论 -
Redis-字典(hash)基础
Redis的字典数据结构跟Java的HashMap一样,也是数组+链表结构,数组是hash的位置,hash碰撞的值保存到链表种。但是跟HashMap不同的是Redis字典存储的值都是字符串类型的,而HashMap存储的值是所有数据类型常见操作>hset user name mango(ingeter)1>hmset user age 18 gender "男" OK>hlen user (ingeter)3 >hget user name "mango"原创 2020-05-21 00:33:32 · 231 阅读 · 0 评论 -
Redis-列表(List)基础
Redis的列表是一个双链结构,跟java里面的LinkedList一样,对于链表插入数据非常快时间复杂度为O(1),但是查询需要遍历这个链表时间复杂度为O(n),对于双链表来说既可以从头到尾遍历也可以从尾遍历的双向遍历,这个结构有点跟我们的队列和栈非常相似,该结构常用来做异步队列,将需要延后处理的任务结构体序列化成字符串,放入Redis列表,另一个线程从这个列表中轮询进行处理当然,我们的列表也提供这样的操作,下面我们来试试常见的的命令操作。队列(先进先出)列表是一个先进先出的数据结构,常用于消息队原创 2020-05-19 21:04:03 · 1017 阅读 · 0 评论 -
Redis-字符串(string)基础
redis是以keyvalue的数据结构存储的,每个key都是唯一的,字符串是redis里面最简单的数据结构,它的内部其实是一个字符数组。redis里面的字符串是一个动态字符数组,有点类似Java里的arrayList,采用预分配冗余的方式来减少内存的频繁分配,内部为当前字符串分配的实际空间 capacity一般要高于实际字符串长度len。当字符串长度小于1MB时,扩容都是加倍现有的空间。如果字符串长度超过1MB,扩容时一次只会多扩1MB 的空间,字符串最大长度为 512MB。下面我们尝试常用的..原创 2020-05-19 21:06:51 · 218 阅读 · 0 评论 -
Redis安装
直接点我网页练习使用Docker安装# 拉取 redis 镜像 > docker pull redis # 运行 redis 容器 > docker run --name myredis -d -p6379:6379 redis # 执行容器中的 redis-cli,可以直接使用命令行操作 redis > docker exec -it myredi...原创 2020-04-28 17:34:29 · 168 阅读 · 0 评论