Redis 知识点总结(三)

十一 、线上部署示例

redis cluster,10台机器,5台机器部署了redis主实例,另外5台机器部署了redis的从实例,每个主实例挂了一个从实例,5个节点对外提供读写服务,每个节点的读写高峰qps可能可以达到每秒5万,5台机器最多是25万读写请求/s。

机器是什么配置?32G内存+8核CPU+1T磁盘,但是分配给redis进程的是10g内存,一般线上生产环境,redis的内存尽量不要超过10g,超过10g可能会有问题。

5台机器对外提供读写,一共有50g内存。

因为每个主实例都挂了一个从实例,所以是高可用的,任何一个主实例宕机,都会自动故障迁移,redis从实例会自动变成主实例继续提供读写服务

你往内存里写的是什么数据?每条数据的大小是多少?商品数据,每条数据是1kb。1000条数据是1mb,100万条数据是1g。常驻内存的是500万条session数据,占用内存是5g,仅仅不到总内存的10%。还有常用用户信息 和 订单状态信息 储存在 redis中

还有一些产品,渠道等公共配置信息

目前高峰期每秒就是2000左右的请求量

十二、热key大value问题

其实使用缓存集群的时候,最怕的就是热key、大value这两种情况,那啥叫热key大value呢?

简单来说,热key,就是你的缓存集群中的某个key瞬间被数万甚至十万的并发请求打爆。

大value,就是你的某个key对应的value可能有GB级的大小,导致查询value的时候导致网络相关的故障问题。

1)如果要缓存几百GB的数据会有什么坑该这么弄?

淘汰策略+减少膨胀+减少碎片+md5散列桶

http://www.cnblogs.com/colorfulkoala/p/5783556.html

#使用新技术 SSDB

2)如果缓存出现热点现象该这么处理?

热key 解决方案 :基于流式计算技术的缓存热点自动发现

https://juejin.im/post/5c448670e51d455bd36b67f9

1、此时完全可以基于大数据领域的流式计算技术来进行实时数据访问次数的统计,比如storm、spark streaming、flink,这些技术都是可以的。 然后一旦在实时数据访问次数统计的过程中,比如发现一秒之内,某条数据突然访问次数超过了1000,就直接立马把这条数据判定为是热点数据,可以将这个发现出来的热点数据写入比如zookeeper中。

2、此时系统层就可以立马把相关的缓存数据从数据库加载出来,然后直接放在自己系统内部的本地缓存里即可。 这个本地缓存,你用ehcache、hashmap,其实都可以,一切都看自己的业务需求,主要说的就是将缓存集群里的集中式缓存,直接变成每个系统自己本地实现缓存即可,每个系统自己本地是无法缓存过多数据的

3、限流\熔断 最终保护缓存集群

3)某个value特别大把网卡给打死了怎么办

1、拆分+多次存取

2、scan+ pipeline(事务)优化

https://www.jianshu.com/p/5b7877bb6e08

https://www.jianshu.com/p/460fa9e628b7

redis使用pipeline通道大幅度提升redis的处理速度,节省成本

https://blog.csdn.net/limingcai168/article/details/81170399

分布式缓存Redis之Pipeline(管道)

https://blog.csdn.net/u011489043/article/details/78769428

十三、redis 分布式锁

分布式锁主要解决的几个问题:

互斥性: 同一时刻只能有一个服务(或应用)访问资源

安全性: 锁只能被持有该锁的服务(或应用)释放

容错: 在持有锁的服务crash时,锁仍能得到释放 避免死锁

1)redission 实现分布式锁,通过lua脚本,可以实现自动延期,可重入

https://juejin.im/post/5bf3f15851882526a643e207

缺点 :在redis master实例宕机的时候,可能导致多个客户端同时完成加锁

https://www.jianshu.com/p/2b19dec72ab0

https://www.cnblogs.com/yangzhilong/p/7605807.html

java集成redission

https://mp.weixin.qq.com/s?__biz=MzU5ODUwNzY1Nw==&mid=2247484155&idx=1&sn=0c73f45f2f641ba0bf4399f57170ac9b&scene=21#wechat_redirect

Redlock:Redis分布式锁最牛逼的实现

https://mp.weixin.qq.com/s?__biz=MzU5ODUwNzY1Nw==&mid=2247484164&idx=1&sn=210397905ef284c1d2756d1cdf73880f

Redisson实现Redis分布式锁的N种姿势

2)每秒上千订单场景下的分布式锁高并发优化思路(分段加锁)

https://www.jianshu.com/p/24fda20ad33a

十四、redis 搭建与配置

redis.conf 详解

https://www.cnblogs.com/wing7319/p/6962552.html

sentinel.conf 详解

https://blog.csdn.net/jyzhoujb/article/details/80076474

十五、开发规范和技巧

键值设计 命令使用 客户端使用 相关工具(删除bigkey)

https://mp.weixin.qq.com/s/dUfkS3ijfxSlRuJPZ9B01A

# 后续深入了解 

&1 一致性问题

1)redis做缓存的情况

cache aside pattern  1、reids 数据设置有效期   2、更新时先变更数据库,删除redis缓存 3 查询时缓存不存在, 查数据库再同步到 缓存

2)redis做储存的情况

1、查询时查redis缓存

2、更新时只变更db数据库

3 异步变更到redis

(1)定时任务 ,最长的不一致时长 就是 更新任务的执行间隔

(2)队列的方式更新  不一致时间取决于队列产生和消费的延迟

变体 是 write through ,写入时 直接写 db ,db把数据更新 cache ,读取时读取cache

3) 极端情况下(很少)

读写 走队列  或者 读写 加分布式锁

4)

关键是满足 业务需要 ,分布式一致性 有各种各样的模型 (线性一致性 ,顺序一致性)

保持 一致性 (多数据中心数据一致)

1、 saga 或者 tcc 的补偿一致性

2  强一致性 xa协议

&2 redis 的 同步非阻塞io ,reactor 模型

redis底层就是用epoll实现,所以它是同步io,为什么说是非阻塞是因为创建fd的时候,就设置为非阻塞模式,内核通知就绪的fd时候,才去处理

参考文章 :https://www.jianshu.com/p/427cf97d7951?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

# 网上redis线上实战问题

1、Redis client链接池配置不当引起的频繁full gc

https://mp.weixin.qq.com/s/JTXMZqNp-8gN15J28ADZ1Q

2、Redis Stream 实践(用作消息队列)

https://mp.weixin.qq.com/s/vLs3XRUHhu-JQxjtgRfOTw

3、Redis5:抛弃ruby基于redis-cli创建集群&集群模式的得与失(高可用的选型方案)

https://mp.weixin.qq.com/s/csQE3RV17uZsAXwS4mI1Tw

4、玩转Redis持久化(写的更好,更详细,好好读)

(1)aof重写是直接把当前内存的数据生成对应命令,并不需要读取老的AOF文件进行分析、命令合并(重要)

(2)对redis rdb持久化或者aof重写时的fork子进程操作,是基于copy-on-write机制

fork后,需要多少内存,取决于这段时间有多少更新操作,如果基本上都是查询操作。只需要很少的内存

https://mp.weixin.qq.com/s/NG3t9ny2TLXvlQzure66EA

5、redis 的两种持久化方式及原理(更深入的解释,基于copy-on-write机制)

https://zhengdl126.iteye.com/blog/2191834

copy-on-write 写时复制

https://blog.csdn.net/u010712083/article/details/8963202

Copy On Write机制了解一下

https://juejin.im/post/5bd96bcaf265da396b72f855

6、分布式redis架构设计简介(真实案例)

Redis的主要性能瓶颈是序列化、网络带宽和内存大小,滥用时处理器也会达到瓶颈

https://mp.weixin.qq.com/s?__biz=MzI3NTYzNzQ0NA==&mid=2247483879&idx=1&sn=3c5944c73bdbd6eb0ee2badbee4d413b&chksm=eb00f44cdc777d5a472656d59c987dd61b7f2ae8ada91165538477f9827236b0e35e9f37667d&scene=21#wechat_redirect

7、分布式高性能redis集群线上常见问题(文章下一系列文章)

jd 用redis 储存非核心业务数据

https://mp.weixin.qq.com/s/3ErULN4rvYeCLgm4HYTGuA

自己写分布式限流组件-基于Redis的RateLimter

http://wuwenliang.net/2018/10/27/%E8%87%AA%E5%B7%B1%E5%86%99%E5%88%86%E5%B8%83%E5%BC%8F%E9%99%90%E6%B5%81%E7%BB%84%E4%BB%B6-%E5%9F%BA%E4%BA%8ERedis%E7%9A%84RateLimter/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

欲求不满之 Redis Lua 脚本的执行原理

https://mp.weixin.qq.com/s/SiUaK6_50XDPZLOh4YcgDA

面试官问我,Redis分布式锁如何续期?懵了。

https://mp.weixin.qq.com/s/y-8W6H9JriUv557Nhudpow

Redis热点问题发现及通用解决方案(深入学习)

https://mp.weixin.qq.com/s/h64iigkIEH4qgHv49kuwLg

8、延时队列

延时队列可使用redis的 sorted set 数据结构,使用时间戳作为 score ,消息内容作为 member,使用 zadd 命令来生产消息,消费者使用 zrangebyscore 命令获取指定时间之前的消息数据轮询进行处理。

9、如何高效操作Redis数据库?//好好实践

http://rdc.hundsun.com/portal/article/943.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

10、如何保持mysql和redis中数据的一致性?(读写一致性)

https://www.zhihu.com/question/319817091/answer/653985863?utm_source=wechat_session&utm_medium=social&s_s_i=oH4xqcyhIZHJyxXkimvcXs%2Fbhgg1xwHUANxPQtshwX0%3D&s_r=1

#后续会有一系列java实践redis文章,敬请期待

总结一共三篇,谢谢大家观看

如果喜欢,欢迎关注我的公众号:乔志勇笔记