08 Redis
Lamiaomiao
好好学习,天天向上
展开
-
14 Redis的IO多路复用模型
Redis是跑在单线程的,所有的操作都是按顺序线性执行的,由于读写操作需要等待用户输入或者输出是阻塞的,所以某一个文件I/O阻塞会导致整个进程无法对其他客户提供服务,I/O多路复用就是为了解决这个问题而出现的。阻塞I/O 当对某个文件描述符进行读写时,如果当前文件描述符不可读或者不可写,那么线程就会阻塞在那里,无法对其他操作做出相应。导致整个服务不可用。所以在需要处理多个客户端任务时,往往不会用阻塞模型。在I/O多路复用模型中,有几个很重要的函数,比如select、poll、epoll,这些函数能够同时原创 2020-08-09 00:12:42 · 141 阅读 · 0 评论 -
13 Redis并发竞争key问题及解决
1.并发竞争key的场景多个请求一起去对某个商品减库存,通常操作流程是:取出当前库存值计算新库存值写入新库存值由于这三部不是原子操作,有多个线程一起操作,数据会不一致。有3个请求有序的修改某个key,按正常顺序的话,数据版本应该是 1->2->3,最后应该是3。但如果第二个请求由于网络原因迟到了,数据版本就变为了 1->3->2,最后值为 2,出问题了。2. 解决使用Redis事务和watch命令: watch命令会监视给定的每一个key,当 exec 时如果监原创 2020-08-09 00:12:10 · 333 阅读 · 0 评论 -
12 HotKey问题
redis的hotkey如何处理?hotkey问题:就是瞬间有几十万的请求去访问redis上某个固定的key,从而压垮缓存服务的情情况怎么发现:凭借业务经验,进行预估哪些是热key。比如某商品在做秒杀,那这个商品的key就可以判断出是热key。在客户端进行收集,这个方式就是在操作redis之前,加入一行代码进行数据统计。那么这个数据统计的方式有很多种,也可以是给外部的通讯系统发送一个通知信息。缺点就是对客户端代码造成入侵。在Proxy层做收集,但是缺点很明显,并非所有的redis集群架构都有pr原创 2020-08-09 00:11:32 · 492 阅读 · 0 评论 -
11 Redis分布式锁
Redis是跑在单线程的,所有的操作都是按顺序线性执行的,由于读写操作需要等待用户输入或者输出是阻塞的,所以某一个文件I/O阻塞会导致整个进程无法对其他客户提供服务,I/O多路复用就是为了解决这个问题而出现的。阻塞I/O 当对某个文件描述符进行读写时,如果当前文件描述符不可读或者不可写,那么线程就会阻塞在那里,无法对其他操作做出相应。导致整个服务不可用。所以在需要处理多个客户端任务时,往往不会用阻塞模型。在I/O多路复用模型中,有几个很重要的函数,比如select、poll、epoll,这些函数能够同时原创 2020-07-27 16:59:47 · 156 阅读 · 0 评论 -
10 分布式缓存可能出现的问题
一、缓存雪崩我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期。所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。解决:使用锁。来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。(不推荐,线程阻塞,用户体验差)为key设置不同的缓存失...原创 2020-04-14 16:17:24 · 581 阅读 · 3 评论 -
09 Redis过期策略和内存淘汰策略
Redis过期删除策略和淘汰策略定期删除:Redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意这里是随机抽取的,随机抽取是因为如果全部遍历会给消耗大量CPU资源。惰性删除:惰性删除是指客户端在访问某个key时,Redis会对key的过期时间进行检查,如果过期了就立即删除。从库的过期策略从节点对过期key的处理是被动的,主节点在对...原创 2020-04-14 16:16:47 · 100 阅读 · 0 评论 -
08 Redis主从复制、哨兵、集群
CAP理论C-Consistent,一致性A-Availability,可用性P-Partition tolerance,分区容忍性简单来说就是当网络分区发生时,一致性和可用性不能同时保证。为什么要做主从同步因为当Redis的节点挂掉后,重启数据恢复需要较长时间,会影响服务,所以要做主从复制,一个master节点可以挂接多个slave节点,当master节点挂掉时,就可以让slave节...原创 2020-04-14 16:16:14 · 140 阅读 · 0 评论 -
07 Redis事务
Redis事务Redis事务不是很严格,操作指定有:multi :指示事务的开始exec:指示事务的执行discard:指示丢弃事务缓存队列中所有的指令所有的指定在 exec 之前不执行,而是缓存在一个队列中,一旦受到exec指令,才开始执行整个事务队列,执行完毕后一次性返回所有指令的执行结果。Redis事务可以保证隔离性,但是Redis事务一条执行失败后面的指令还会继...原创 2020-04-14 16:15:43 · 168 阅读 · 0 评论 -
06 Redis持久化RDB和AOF
redis持久化机制redis提供了持久化机制将内存中的数据写到硬盘里,以便于系统故障后可以恢复数据。redis提供了两种持久化操作。一种是RDB快照,另一种是AOF日志。RDB快照是全量备份,是内存数据的二进制序列化形式,AOF日志记录的是内存数据修改的指令记录文本,是增量备份,需要定期进行AOF重写。RDB快照持久化Redis可以通过创建快照来获得内存中的数据在某个时间点上的副本...原创 2020-04-14 16:15:09 · 88 阅读 · 0 评论 -
05 Redis线程模型、原理
Redis为什么是单线程的,Redis线程模型Redis内部使用了文件事件处理器file event handle,这个文件事件处理器是单线程的,所以Redis被称为单线程的模型。它采用I/O多路复用机制监听多个socket,多个socket可能会并发产生不同的操作,每个操作对应不同的文件事件,IO多路复用机制将socket产生的事件放入一个队列中,事件分派器每次从队列中取出一个事件,把该事件...原创 2020-04-14 16:14:32 · 203 阅读 · 0 评论 -
04 布隆过滤器、Scan、Geohash
布隆过滤器使用场景:可以应用来推荐系统中,过滤掉用户已经看到的内容。用户请求数据库数据时,可以先通过布隆过滤器,过滤掉对不存在数据的请求,减轻数据库的压力。在项目的多级缓存之上,可以添加一个布隆过滤器,防止用户对不存在的数据的请求直接打到数据库上。爬虫系统中,对URL去重。布隆过滤器的原理:是使用了一个大型的位数组和几个不同的的hash函数。...原创 2020-04-14 16:13:51 · 158 阅读 · 0 评论 -
03 Bitmap位图和HyperLogLog
Bitmap 位图位图不是特殊的数据结构,它其实就是普通的字符串,也就是 byte 数组,用 getbit 和 setbit 来操作,能够统计精确的值。可以用于布尔型数据的存取,比如用户一年的签到记录,签到了是1,没签到是0,记录365天,通过 bitcount 指令来统计用户一共签到了多少天,每个签到记录只占用一位,365位大约是46个字节大小,用户上亿时,大大节约了内存空间。Hype...原创 2020-04-14 16:13:10 · 161 阅读 · 0 评论 -
02 Redis数据结构
对锁的理解?(待简化)在单进程的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量。而同步的本质是通过锁来实现的。为了实现多个线程在一个时刻同一个代码块只能有一个线程可执行,那么需要在某个地方做个标记,这个标记必须每个线程都能看到,当标记不存在时可以设置该标记,其余后续线程发现已经有标记了则等待拥有标记的...原创 2020-04-14 16:12:23 · 131 阅读 · 0 评论 -
01 Redis使用场景 对比Memcached MySQL
Redis所有的数据结构都是以唯一的key字符串作为名称,然后通过这个唯一的key来获取响应的value数据。value有5种基础数据结构,分别是string(字符串)、list(列表)、set(集合)、hash(字典)、zset(有序集合)。数据类型的应用场景string:粉丝数list:存储关注列表、粉丝列表hash:用于存储用户信息,比如一个person对象,有姓名,年龄,生日等信息...原创 2020-04-14 16:11:28 · 116 阅读 · 0 评论