从应用到底层 36张图带你进入Redis世界(五)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,倚天版 1GB 1个月
简介: 从应用到底层 36张图带你进入Redis世界(五)

2.4、建议


既然单独用RDB会丢失很多数据。单独用AOF,数据恢复没RDB来的快,所以出现问题了第一时间用RDB恢复,然后AOF做数据补全才说王道。


3、Redis为什么那么快


3.1、 基于内存实现:


数据都存储在内存里,相比磁盘IO操作快百倍,操作速率很快。


3.2、高效的数据结构:


Redis底层多种数据结构支持不同的数据类型,比如HyperLogLog它连2个字节都不想浪费。


3.3、丰富而合理的编码:


Redis底层提供了 丰富而合理的编码  ,五种数据类型根据长度及元素的个数适配不同的编码格式。


1、String:自动存储int类型,非int类型用raw编码。


2、List:字符串长度且元素个数小于一定范围使用 ziplist 编码,否则转化为 linkedlist 编码。


3、Hash:hash 对象保存的键值对内的键和值字符串长度小于一定值及键值对。


4、Set:保存元素为整数及元素个数小于一定范围使用 intset 编码,任意条件不满足,则使用 hashtable 编码。


5、Zset:保存的元素个数小于定值且成员长度小于定值使用 ziplist 编码,任意条件不满足,则使用 skiplist 编码。


3.4、合适的线程模型:


I/O 多路复用模型同时监听客户端连接,多线程是需要上下文切换的,对于内存数据库来说这点很致命。


微信图片_20220111195406.png


3.5、 Redis6.0后引入多线程提速:


要知道 读写网络的read/write系统耗时 >> Redis运行执行耗时,Redis的瓶颈主要在于网络的 IO 消耗, 优化主要有两个方向:


1、提高网络 IO 性能,典型的实现比如使用 DPDK 来替代内核网络栈的方式


2、使用多线程充分利用多核,典型的实现比如 Memcached。


协议栈优化的这种方式跟 Redis 关系不大,支持多线程是一种最有效最便捷的操作方式。所以Redis支持多线程主要就是两个原因:


1、可以充分利用服务器 CPU 资源,目前主线程只能利用一个核


2、多线程任务可以分摊 Redis 同步 IO 读写负荷


关于多线程须知:


Redis 6.0 版本 默认多线程是关闭的 io-threads-do-reads no


Redis 6.0 版本 开启多线程后 线程数也要 谨慎设置。


多线程可以使得性能翻倍,但是多线程只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行。


4、常见问题


4.1、缓存雪崩


雪崩定义:

image.png


Redis中大批量key在同一时间同时失效导致所有请求都打到了MySQL。而MySQL扛不住导致大面积崩塌。


雪崩解决方案:


1、缓存数据的过期时间加上个随机值,防止同一时间大量数据过期现象发生。


2、如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。


3、设置热点数据永远不过期。


4.2、缓存穿透


穿透定义:


缓存穿透 是 指缓存和数据库中都没有的数据,比如ID默认>0,黑客一直 请求ID= -12的数据那么就会导致数据库压力过大,严重会击垮数据库。


穿透解决方案:


1、后端接口层增加 用户鉴权校验,参数做校验等。


2、单个IP每秒访问次数超过阈值直接拉黑IP,关进小黑屋1天,在获取IP代理池的时候我就被拉黑过。


3、从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null 失效时间可以为15秒防止恶意攻击。


4、用Redis提供的Bloom Filter 特性也OK。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
缓存 NoSQL Java
在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能
在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能
99 0
|
17天前
|
NoSQL Java Redis
Spring Boot集成Redis全攻略:高效数据存取,打造性能飞跃的Java微服务应用!
【8月更文挑战第3天】Spring Boot是备受欢迎的微服务框架,以其快速开发与轻量特性著称。结合高性能键值数据库Redis,可显著增强应用性能。集成步骤包括:添加`spring-boot-starter-data-redis`依赖,配置Redis服务器参数,注入`RedisTemplate`或`StringRedisTemplate`进行数据操作。这种集成方案适用于缓存、高并发等场景,有效提升数据处理效率。
71 2
|
20天前
|
运维 NoSQL Serverless
Serverless 应用引擎使用问题之首次启动无法获取redis连接,重启实例后可以获取,是什么原因
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
Serverless 应用引擎使用问题之首次启动无法获取redis连接,重启实例后可以获取,是什么原因
|
22天前
|
NoSQL Redis
Redis set数据类型命令使用及应用场景使用总结
Redis set数据类型命令使用及应用场景使用总结
22 1
|
26天前
|
存储 NoSQL 容灾
Redis问题之压缩列表zipList在Redis中有哪些应用场景
Redis问题之压缩列表zipList在Redis中有哪些应用场景
|
2月前
|
存储 缓存 NoSQL
Redis 缓存失效策略及其应用场景
Redis 缓存失效策略及其应用场景
51 1
|
2月前
|
存储 缓存 NoSQL
使用Redis优化Java应用的性能
使用Redis优化Java应用的性能
|
4天前
|
NoSQL 数据可视化 Redis
Mac安装Redis
Mac安装Redis
15 3
|
5天前
|
NoSQL Ubuntu 安全
在Ubuntu 18.04上安装和保护Redis的方法
在Ubuntu 18.04上安装和保护Redis的方法
14 0
|
5天前
|
存储 NoSQL Java
使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)
该博客文章展示了如何在Linux虚拟机上使用Redis和Jedis客户端实现手机验证码的验证功能,包括验证码的生成、存储、验证以及限制每天发送次数的逻辑,并提供了测试结果截图。
使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)