我的编程空间,编程开发者的网络收藏夹
学习永远不晚

一文了解大数据下 Redis 的应用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

一文了解大数据下 Redis 的应用

大数据下Redis的应用

1、Redis客户端区别

1.1 redis常用客户端

目前市面上比较流行的客户端有jedis、lettuce、redisson

jedis

jedis客户端连接方式是基于TCP阻塞方式

lettuce

lettuce内部是基于netty的多路复用异步非阻塞方式(目前业界解决高并发大数据的问题的思路)

redisson

相对于上面两种使用得较少

在并发数量不大的情况下,两者性能可能差不多,jedis的性能可能还优于lettuce,但当并发量的提升,jedis的超时错误会增加,但lettuce只是平均响应时间增加和最大响应时间会增加,lettuce是已稳定性为主的。

1.2 epoll模型-单线程的redis为什么快

redis内部使用epoll模型来提高链接处理能力

传统TCP链接与epoll模型的本质区别

TCP链接存在链接数瓶颈,随着连接数的增加,响应速度会明显变慢

epoll可支持更大数量的连接数而不会对性能有明显的影响

2、大数据下的redis的存储方案

2.1 分片模式

分片模式是把部署多个redis节点,然后由客户端决定数据分片规则,常见的分片规则就是以节点数量进行哈希分片

优点:

服务端不需要进行繁琐的配置,由客户端决定路由规则

缺点:

缺点很明显,如果多个节点中的某个节点挂了,将丢失这一部分数据,因为客户端还是为每个节点分配了连接,而且客户端配置分片节点IP的时候要注意

IP列表的顺序不能随意指定顺序,IP变更也会影响数据,扩容相当麻烦。

建议:如果分片节点较少可以使用分片来适当的分摊压力

配置示例:

  1. spring : 
  2.            remote : 
  3.       ecredis : 
  4.         type : sharding 
  5.         uri : 
  6.                    - 192.168.1.3:6379 
  7.                    - 192.168.1.4:6379 
  8.                    - 192.168.1.5:6379 
  9.                    - 192.168.1.6:6379 
  10.                    - 192.168.1.7:6379 
  11.         db : 1 
  12.         maxIdle : 10 
  13.         minIdle : 5 
  14.         maxActive : 10 
  15.         password : GpG4fZoxsp7cTB5f 
  16.         keyPrefix : 'ERP:EXPORT-CENTER:' 

2.2 哨兵机制

在Redis 2.8版本开始引入,就有了哨兵这个概念,哨兵实现了自动化的故障恢复,无需关心IP是否变更。

优点:

哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。

主从可以自动切换,系统更健壮,可用性更高。

Sentinel 会不断的检查 主服务器 和 从服务器 是否正常运行。当被监控的某个 Redis 服务器出现问题,Sentinel 通过API脚本向管理员或者其他的应用程序发送通知。

  缺点:

Redis较难支持在线扩容,对于集群,容量达到上限时在线扩容会变得很复杂。

  1. spring : 
  2.   redis : 
  3.     password : 123456 
  4.     sentinel : 
  5.       master : master 
  6.       nodes : 47.98.217.106:26379,47.98.217.109:26380,47.98.217.109:26381 
  7.     timeout : 20000 
  8.     database : 0 
  9.     jedis : 
  10.       pool : 
  11.         max-active : 300 
  12.         max-wait : -1 
  13.         max-idle : 100 
  14.         min-idle : 20 

2.3 redis cluster集群

通过数据分片的方式来进行数据共享问题,同时提供数据复制和故障转移功能,包含了哨兵模式的所有功能。

优点:数据按slot来分散存储,访问任何一个master节点都可以获取任何分片上面的数据,任何一个master节点都可以做扩容或者新增master节点的时候,数据会自动分片同步迁移(redis集群的重新分片由redis内部的redis-trib负责执行),服务器不需要下线。如果每个master使用了主从模式,那么当master发生故障的时候,下面的slave们会选举一个新的master

缺点:需要使用ruby进行部署,配置相当麻烦,维护不方便

配置示例:

  1. spring : 
  2.   redis : 
  3.     password : 
  4.     cluster : 
  5.       nodes : 192.168.1.3:6379,192.168.1.4:6379,192.168.1.5:6379 
  6.       max-redirects : 3 
  7.     lettuce : 
  8.       pool : 
  9.         max-idle : 16 
  10.         max-active : 32 
  11.         min-idle : 8 

2.4 cachecloud

cachecloud是一套解决方案,实现多种类型(Redis Standalone、Redis Sentinel、Redis Cluster)自动部署、解决Redis实例碎片化现象、提供完善统计、监控、运维功能、减少运维成本和误操作,提高机器的利用率,提供灵活的伸缩

优点:

使配置更简单,集群节点不再由客户端维护,配置一个domain即可自动获取节点列表

配置示例:

  1. spring : 
  2.            domain : cachecloud.server1.com:8080 
  3.            remote : 
  4.       ecredis : 
  5.                  appid : 2 
  6.         type : cloud 
  7.         uri : 
  8.         db : 1 
  9.         maxIdle : 10 
  10.         minIdle : 5 
  11.         maxActive : 10 
  12.         password : GpG4fZoxsp7cTB5f 
  13.         keyPrefix : 'ERP:EXPORT-CENTER:' 

应用案例:

2.5 redis存储方案选型

吞吐量数据量较少、数据安全性不高:单机模式或者分片模式

吞吐量数据量较大、数据安全性较高:哨兵模式、集群模式

吞吐量数据量大、数据安全性高、扩展性强:集群模式

3、性能优化

3.1 日志优化

Redis日志存储模式分为两种:RDB和AOF,RDB为实时写入磁盘,AOF为延迟批量写入磁盘

RDB模式:

优点:实时存储日志,在数据恢复方面更有优势

缺点:磁盘IO比较频繁,会影响redis的吞吐能力

AOF模式:

优点:定时批量刷新日志到磁盘,适合高吞吐的场景,对redis性能影响较小

缺点:如果某一个时刻redis发生故障,可能会丢失内存中的数据,故障恢复的时候恢复不了这部分数据

模式选择:

如果吞吐量较小,使用RDB即可,吞吐量较大,可以选择AOF来提高性能,两种方式根据具体场景来选择

AOF配置:

  1. appendonly yes 
  2. #aof文件名设置 
  3. appendfilename "appendonly-${port}.aof" 
  4. #配置选择 
  5. appendfsync everysec 
  6. dir /bigdiskpath 
  7. #不开启aof重写,因为太消耗性能 
  8. no-appendfsync-on-rewrite yes 

AOF重写:分析当前redis中key对应的值来优化指令,来减少磁盘空间和压力,但因为需要判断合并逻辑,会有很大的性能开销,一般不开启aof重写

  1. # 假设服务器对键list执行了以下命令; 
  2. 127.0.0.1:6379> RPUSH list "A" "B" 
  3. (integer) 2 
  4. 127.0.0.1:6379> RPUSH list "C" 
  5. (integer) 3 
  6. 127.0.0.1:6379> RPUSH list "D" "E" 
  7. (integer) 5 
  8. 127.0.0.1:6379> LPOP list 
  9. "A" 
  10. 127.0.0.1:6379> LPOP list 
  11. "B" 
  12. 127.0.0.1:6379> RPUSH list "F" "G" 
  13. (integer) 5 
  14. 127.0.0.1:6379> LRANGE list 0 -1 
  15. 1"C" 
  16. 2"D" 
  17. 3"E" 
  18. 4"F" 
  19. 5"G" 
  20. 127.0.0.1:6379

正常AOF会把前面的6条写入命令都存入日志中,AOF重写会先去redis获取list的值,发现是["C","D","E","F","G"],然后生成一条 RPUSH list "C" "D" "E" "F" "G" 来代替前面6条

3.2 缓存更新策略

redis默认情况下就是使用LRU策略的,因为内存是有限的,但是如果你不断地往redis里面写入数据,那肯定是没法存放下所有的数据在内存的

(1)noeviction: 如果内存使用达到了maxmemory,client还要继续写入数据,那么就直接报错给客户端

(2)allkeys-lru: 就是我们常说的LRU算法,移除掉最近最少使用的那些keys对应的数据(最常用的)

(3)volatile-lru: 也是采取LRU算法,但是仅仅针对那些设置了指定存活时间(TTL)的key才会清理掉

(4)allkeys-random: 随机选择一些key来删除掉

(5)volatile-random: 随机选择一些设置了TTL的key来删除掉

(6)volatile-ttl: 移除掉部分keys,选择那些TTL时间比较短的keys

除了LRU,还可以使用scan的方式进行轮询ttl的方式清理

3.3 代码中使用redis的一些建议

避免使用keys *这种模糊查询,会阻塞当前线程,使用scan的方式去处理,redis客户端建议不要使用redis desktop manager

  1. String cursor = ScanParams . SCAN_POINTER_START ; 
  2. ScanParams scanParams = new ScanParams (); 
  3. // 匹配表达式 
  4. scanParams . match ( "key*" ); 
  5. // 每次scan的条数 
  6. scanParams . count ( 1000 ); 
  7. while ( true ) { 
  8.            ScanResult << span=""> String > result = jedis . scan ( cursor , scanParams ); 
  9.            cursor = result . getStringCursor (); 
  10.            if ( "0" . equals ( cursor )) { 
  11.                       break ; 
  12.            } 

hgetall也应该避免使用,使用hscan代替,但如果通过RedisTemplate回调的方式使用hscan应该注意资源的释放,否则会出现请求到达一定次数的时候就不能发起请求的问题(客户端hang住了)

如果set的时候同时设置expire过期时间,不要先set再expire这种方式,应该使用原子操作

  1. set key value [EX seconds] [PX milliseconds] [NX|XX] 

对于同一个需求多次改版redis中写入不同格式的数据,会产生兼容性问题,可以使用type命令去处理兼容,然后监控等老数据不存在之后再把判断逻辑移除

  1. String type = jedis . type ( "a" ); 
  2. if ( "string" . equalsIgnoreCase ( type )) { 
  3.   // do something 
  4. else if ( "list" . equalsIgnoreCase ( type )) { 
  5.   // do something 

如果redis中的数据需要做去重,可以使用set或hashmap,hashmap性能更高,但对于维护hashmap数据结构之外的数据比较多,之前测试过,100B的数据存放到hashmap,但实际占用量可能有200B~300B甚至更多,set对于数据多的情况下性能会低一点

建议:数据少的情况下用set,数据多就用hashmap,但要注意尽量减少存储内容的长度,比如{"source":"order"}可以改成{"s":1}

去重操作不建议使用list,因为每次判断都要从list中取数据然后再add进去,多线程操作下还是可能会出现重复问题(比如两个线程同时lrange操作)

  1. // 在多线程模式下会有问题 
  2. // 假设线程A和线程B同时执行lrange 
  3. List << span=""> String > list = jedis . lrange ( "a" , 0 , - 1 ); 
  4. if (! list . contains ( "bbb" )) { 
  5.                       jedis . lpush ( "bbb" ); 

如果一次处理的命令很多,使用pipeline性能更好

list可以结合lpush/rpop、rpush/lpop来实现队列功能,但不建议把list当成是MQ的功能,因为没有记录的状态,无法跟踪数据处理情况

关于redis分布式锁,目前流行的实现方式还没有完美的方案,使用lua脚本的版本也不是完美的,如果需求允许延时或者一定时间内不允许执行多次,setnx设置过期时间是最好的方案

4、故障转移与数据迁移

4.1 数据迁移方案

老节点替换为新节点、新老key兼容处理

将新节点作为老节点的slave节点,等数据自动同步完成之后下架老节点,不建议使用代码迁移,因为不同业务数据结构可能很多

不同类型的节点之间迁移的方法不同,如果单节点迁移至分片集群只能借助迁移工具来完成

如果新业务将使用新的key,要保留旧key,可以开启两个连接池,一个处理新key,一个处理旧key,这样等旧key都失效的时候移除对旧key的连接就可以完全迁移到新key业务

动态扩容

必须在集群模式下才可以进行动态扩容,也可以使用cachecloud,数据会自动同步到各个节点

在数据迁移的过程中即使访问的某个key正在迁移,数据也是可以正常返回的,不用担心迁移过程会对数据访问造成影响

4.2 故障转移对于客户端的影响

redis集群模式虽然可以在某个master节点发生故障的时候自动从slave中选举节点当master,但类似jedis的客户端并不支持故障转移,也就是当集群某节点发生故障正在切换的时候,客户端如果正在访问故障节点,这时集群故障转移还没有完成,客户端会报错,如果需要让客户端也支持故障转移,需要修改jedis客户端源码来实现。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

一文了解大数据下 Redis 的应用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一文了解大数据下 Redis 的应用

目前市面上比较流行的客户端有jedis、lettuce、redisson。在并发数量不大的情况下,两者性能可能差不多,jedis的性能可能还优于lettuce,但当并发量的提升,jedis的超时错误会增加,但lettuce只是平均响应时间增

一文了解云原生大数据

传统的大数据架构在资源利用、高效运维、可观测性等方面存在诸多不足,已经越来越无法适应当下的发展需求。

Python五大应用领域 一起了解一下

Python五大应用领域,要说近两年比较火的编程语言是什么?毫无疑问是Python,而且不仅是编程人员、为做论文数据的研究生、职场人士纷纷加入Python学习大军。而市面上的Python课程也会针对大家不同需求进行调整。

做为一名大数据新手,应该通过这篇文章了解大数据

大数据顾名思义就是其具有海量的数据规模、快速的数据流转、多样的数据类型的特性,且大数据技术不在于掌握庞大的数据信息,而是把这些数据进行专业化处理。通过阅读本文,可以了解学习大数据的处理流程以及大数据处理技术。
大数据Hadoop2024-12-03

一文带你了解大数据管道

如果您从大数据开始,通常会被众多工具,框架和选项所困扰。 在本文中,我将尝试总结其成分和基本配方,以帮助您开始大数据之旅。 我的目标是对不同的工具进行分类,并试图解释每个工具的目的以及它如何适应生态系统。

关于大数据服务应该了解的一切

大数据是一个在商业和技术领域广泛使用的术语。简而言之,这是从各种来源获取极大量复杂数据,并对其进行分析以发现模式、趋势、问题并提供获得有用见解的机会的过程。

一文带你了解大数据基石-Hadoop

基于存储以及计算Hadoop量大两大功能模块-分布式存储HDFS以及分布式计算MapReduce,下面分别针对这两大功能模块详细介绍。

一文了解大数据在国内外疾病监测与预防中的应用现状

医疗大数据在常态化监测、疫情预警处置、趋势预测研判、传染源追本溯源、资源调配和防控救治方面都能起到至关作用。本文详细的讲了大数据在国内外疾病监测领域中的应用现状以及当前健康大数据所面临的挑战。

一文了解-云原生大数据知识地图

云原生大数据是大数据平台新一代架构和运行形态,是一种以平台云原生化部署、计算云原生调度、存储统一负载为特点,可以支持多种计算负载,计算调度更弹性,存储效能更高的大数据处理和分析平台。

数据库高可用架构了解一下

数据存储高可用的方案本质都是通过将数据复制到多个存储设备,通过数据冗余的方式来实现高可用。常见的高可用架构有主备、主从、主主、集群、分区等,接下来我们聊聊每种架构的优缺点。

对于大数据,你了解吗?常见的大数据应用场景有哪些?

云计算、大数据和人工智能这三种技术现在备受欢迎,并且它们之间好像互相有关系:一般谈云计算的时候会提到大数据、谈人工智能的时候会提大数据、谈人工智能的时候会提云计算,三者之间既互相独立又相辅相成。本文详细地介绍了大数据以及大数据应用场景。

一文让你了解什么是管理大数据技术!

为了能更好地适应每一个时代的机遇与挑战,企业的制度需不断更新迭代。那么时至今日,最具备划时代特点的企业管理制度是什么呢?看看这里,一文让你了解什么是管理大数据技术!

Redis在大数据处理中的作用及应用场景

标题:Redis在大数据处理中的作用及应用场景引言:随着互联网的快速发展,数据量也在不断增长。对于大数据的处理和存储成为了一个重要的问题。在这个过程中,Redis作为一种高性能的内存缓存数据库,发挥了重要的作用。本文将详细介绍Redis在大
Redis在大数据处理中的作用及应用场景
2023-11-07

数据科学家应了解Java的六大原因

数据科学家应学习Java,原因多多。本文介绍了帮助确定Java是否适合您项目的六个具体原因。

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录