redis深度历险
文章平均质量分 54
主要是学习Redis深度历险(核心原理与应用实践)这本书,加上自己在应用中的实践与坑
进京务工小卢
不爱敲代码 就爱小彬彬的小卢同学
展开
-
(零)redis系列目录
(一)redis常见5种数据结构原创 2020-11-18 00:51:48 · 1154 阅读 · 0 评论 -
简单redis锁
@Componentpublic class DistributedLock { private static final Logger LOGGER = LoggerFactory.getLogger(DistributedLock.class); @Resource(name = "cscRedisClient") private RedisStoreClient redisStoreClient; private static final String LOC.原创 2021-04-08 10:52:39 · 184 阅读 · 0 评论 -
(一)redis常见5种数据结构
官网介绍(https://redis.io/)Redis是一个开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半径查询和流的地理空间索引。Redis具有内置的复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。扩展知识谁也不知道Redis是Remote Dictionary Service远原创 2020-11-10 00:00:13 · 1587 阅读 · 0 评论 -
(二)redis位图+HyperLogLog+布隆过滤器+GEO
(一)位图有时候会有一些boolean类型的值需要存取例:记录用户一年的签到记录,1就是签到,0是未签到。使用普通的key/value要记录365个。但是使用位图365天就是365个位,需要46个字节。位图不是特殊的数据结构,就是普通的字符串,也就是byte数组。我们可以使用get/set操作整个位图的内容,也可以直接使用getbit/setbit等将byte数组看成[位数组]来处理如果某个偏移位置超过了现有范围就会自动进行扩容(二)HyperLogLog四两拨千斤统计达成网站原创 2020-11-12 23:59:50 · 3308 阅读 · 1 评论 -
(三)redis实现延时队列
说明:平时使用rabbitMQ和kafka作为消息队列中间件,但是使用稍微复杂。就rabbitMQ为例,使用前需要创建exchange,queue以及路由routing-key进行绑定 redis可以轻松搞定只有一组消息的队列,但是没有非常多的高级特性以及ack保证redis的list常用来做异步消息队列使用,使用rpush/lpush操作入队列,使用lpop/rpop来出队列【问题一】队列空了咋整?办法:如果队列为空pop会陷入死循环浪费CPU资源,拉高redis的QPS造成r..原创 2020-11-11 21:21:07 · 3070 阅读 · 1 评论 -
(四)redis实现限流的两种方式
方式一:滑动窗口实现原理:利用zset的score值来圈定这个时间窗口。每次请求过来,都会使用zset的范围查询统计总数,这个范围就是(当前时间)到(当前时间-滑动窗口时间),然后将总数和限流次数进行比较,从而决定是否限流那这个 zset 的 value 填什么比较合适呢?它只需要保证唯一性即可,用 uuid 会比较浪费空间,那就改用毫秒时间戳吧。 public boolean limitFlow(String redisKey){ int targetNum = 5.原创 2020-11-14 00:31:59 · 3875 阅读 · 1 评论 -
(五)Redis的sacn
redis指令keys指令用于列出所有满足特定正则字符串规则的key两个缺点:没有offset,limit参数,一次性吐出所有满足条件的key 算法是遍历算法,复杂度是O(n),如果有千万级以上的key,这个指令会导致redis卡顿,因为redis是单线程的为了解决上诉问题redis在2.8中引入了scan,具有以下特点虽然复杂度也是O(n),但是它通过游标分步进行,不会阻塞线程 提供limit参数,返回结果可控 同样具备匹配功能 返回结果可能重复,需要客户端去重 单次返回的结.原创 2020-11-16 00:04:30 · 4125 阅读 · 4 评论 -
(六)redis线程模型
为啥redis单线程模型也能效率这么高?1)纯内存操作。(Redis 读的速度是 110000 次 /s, 写的速度是 81000 次 /s)2)核心是基于非阻塞的IO多路复用机制3)单线程反而避免了多线程的频繁上下文切换问题(百度)redis线程模型1)文件事件处理器redis基于reactor模式开发了网络事件处理器,这个处理器叫做文件事件处理器,file event handler。这个文件事件处理器,是单线程的,redis才叫做单线程的模型,采用I...原创 2020-11-10 22:33:28 · 2955 阅读 · 0 评论 -
(七)redis持久化RDB和AOF
1、RDB和AOF两种持久化机制的介绍RDB持久化机制,对redis中的数据执行周期性的持久化AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的时候,可以通过回放AOF日志中的写入指令来重新构建整个数据集如果我们想要redis仅仅作为纯内存的缓存来用,那么可以禁止RDB和AOF所有的持久化机制通过RDB或AOF,都可以将redis内存中的数据给持久化到磁盘上面来,然后可以将这些数据备份到别的地方去,比如说阿里云,云服...原创 2020-11-11 00:44:17 · 2556 阅读 · 0 评论 -
(八)redis管道原理
大家可能有一个误解,redis的管道是服务端提供的特别的技术。实际这个技术是客户端提供的redis的消息交互原创 2020-11-17 22:20:06 · 1664 阅读 · 0 评论 -
(九)redis事物+发布订阅模式
发布订阅一般不用 Redis 做消息发布订阅。简介Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:实例原创 2020-11-10 22:37:47 · 2806 阅读 · 0 评论 -
(十)redis高可用之主从复制replication+哨兵sentinal
单机的redis几乎不太可能说QPS超过10万+,除非机器性能特别好。那如何支撑20w+QPS呢--->答案就是读写分离那就需要进行数据同步。redis支持主从同步和从从同步(一)redis同步(replication)核心机制redis采用异步方式复制数据到slave节点,不过redis 2.8开始,slave node会周期性地确认自己每次复制的数据量 一个master node是可以配置多个slave node的 slave node也可以连接其他的slave node s.原创 2020-11-17 23:47:11 · 1397 阅读 · 0 评论 -
(十一)redis分而治之Codis
1、redis高并发跟整个系统的高并发之间的关系redis,你要搞高并发的话,不可避免,要把底层的缓存搞得很好mysql,高并发,做到了,那么也是通过一系列复杂的分库分表,订单系统,事务要求的,QPS到几万,比较高了要做一些电商的商品详情页,真正的超高并发,QPS上十万,甚至是百万,一秒钟百万的请求量光是redis是不够的,但是redis是整个大型的缓存架构中,支撑高并发的架构里面,非常重要的一个环节首先,你的底层的缓存中间件,缓存系统,必须能够支撑的起我们...原创 2020-11-10 22:36:55 · 1580 阅读 · 0 评论 -
(十二)redis cluster集群模式
为什么使用集群模式1、单机redis在海量数据面前的瓶颈2、怎么才能够突破单机瓶颈,让redis支撑海量数据?3、redis的集群架构redis cluster支撑N个redis master node,每个master node都可以挂载多个slave node读写分离的架构,对于每个master来说,写就写到master,然后读就从mater对应的slave去读高可用,因为每个master都有salve节点,那么如果mater挂掉,r...原创 2020-11-11 00:44:10 · 2840 阅读 · 0 评论 -
(十三)redis无所不知info指令
想要了解Redis的运行状态,必须通过强大的info指令主要分为9大块细节请查阅官方文档https://redis.io/commands/info按时原创 2020-11-18 08:46:59 · 997 阅读 · 1 评论 -
(十四)redis过期策略
(1)设置过期时间我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时?10分钟?这个很有用,我们自己可以指定缓存到期就失效。如果假设你设置一个一批key只能存活1个小时,那么接下来1小时后,redis是怎么对这批key进行删除的?答案是:定期删除+惰性删除所谓定期删除,指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。假设redis里放了10万个key...原创 2020-11-10 22:36:06 · 3444 阅读 · 0 评论 -
(扩展一)Redis大key问题
大 key 定义: 1. 一个简单的key存储的value值特别大 2. hash, set, zset, list 中存储过多的元素 3. 某个集群存储了许多许多的key 4. 大 Bitmap 或布隆过滤器 (Bloom)风险对大key的操作会产生堵塞,轻则慢查询引起超时,重则节点hang住引发主从切换 大key造成集群节点容量倾斜,所在节点成为容量瓶颈 大key影响整个集群,如果同集群的其他业务有大key,整个集群都会受影响解决方法...原创 2020-11-11 21:50:25 · 3030 阅读 · 1 评论 -
(扩展二)redis和数据库一致性
你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,最好不要做这个方案:读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况串行化之后,就会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支撑线上的一个请求。最经典的缓存+数据库读写的模式,cache asi...原创 2020-11-10 22:38:35 · 2788 阅读 · 0 评论 -
(扩展三)redis雪崩以及穿透
缓存雪崩发生的原因现象:查询缓存无数据或者缓存服务挂掉,导致大量请求到mysql,造成极大压力甚至搞垮数据库原因一:许多缓存的数据同一时间失效解决方案:过期时间加上随机值原因二:缓存服务器挂掉解决方案: 事前:redis高可用,主从+哨兵,redis cluster,避免全盘崩溃 事中:本地ehcache缓存 + hystrix限流&降级,避免MySQL被打死 事后:redis持久化,快速恢复缓存数据 缓存穿透的现象以及解决方法..原创 2020-11-10 00:37:30 · 1237 阅读 · 0 评论 -
(扩展四)redis的并发竞争问题
这个也是线上非常常见的一个问题,就是多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了。或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了。而且redis自己就有天然解决这个问题的CAS类的乐观锁方案基于所存储数据的修改时间进行判断...原创 2020-11-11 00:44:04 · 2810 阅读 · 0 评论 -
(扩展五)缓存优缺点
目录优点:高性能+高并发1)高性能2)高并发缓存缺点优点:高性能+高并发1)高性能把你一些复杂操作耗时查出来的结果,如果确定后面不咋变了,然后但是马上还有很多读请求,那么直接结果放缓存,后面直接读缓存就好了2)高并发mysql这么重的数据库,压根儿设计不是让你玩儿高并发的,虽然也可以玩儿,但是天然支持不好。mysql单机支撑到2000qps也开始容易报警了。所以要是你有个系统,高峰期一秒钟过来的请求有1万,那一个mysql单机绝对会死掉。你这个时候就只..原创 2020-11-10 00:07:07 · 2758 阅读 · 0 评论