消息队列是在乐视这边非常普遍使用的技术。在我们部门内部,不同的项目使用的消息队列实现也不一样。下面是支付系统的流转图(部门兄弟画的,借用一下):

从图中可以看到,里面用到了kafka消息队列。作用是做数据库分库分表后的聚合,异步汇总到一张总表。里面也用到了redis,用来处理高并发下的订单重复提交。我们这边还使用了公司统一集群的apache qpid消息队列,是AMQP的一个实现,主要用于不同部门间的通信。一般的大公司都会有一些公司统一的集群,但是这种统一集群对开发者来说相对透明,所以部门间相互合作的时候用的多,自己部门内部用,避免采坑,大家宁愿自己搭一套。redis用处就更多了。阿里的阳哥自己做了一个异常日志监控平台,主要就是用redis做数据传输和存储。

  别人做的东西我就不多说了。下午说说redis在我自己的框架中使用实战。这是epiphany离线数据的流程图。epiphany框架源码地址:https://github.com/xiexiaojing/epiphany。我们部门内部使用实例地址是:https://github.com/xiexiaojing/epiphany-demo。大家可以将里面的DAO部分数据做替换,替换成自己的数据库随便什么数据即可运行。

  从图中可以看到处理过程基本都是在和redis打交道。Redis的基本数据结构是跳跃表。像这种跟存储打交道的,数据结构是必须要了解的。比如lucene搜索最初的版本也是用的跳跃表,后来改成基于图的有限自动机了。想了解具体了解跳跃表可以看我的另一篇文章《看Lucene源码必须知道的基本规则和算法》。像一些java写的框架,比如dubbo,spring IoC里,一提到注册,要注册到一个地方,在JVM的数据结构一般是hashmap。准确的说:spring IoC里是通过一个hashmap来持有载入的BeanDefinition对象实现注册的。

Redis持久化原理

  Redis提供了两种方式对数据进行持久化,分别是RDB(Redis DataBase)和AOF(APPEND ONLY FILE)。RDB持久化方式能够在指定的时间间隔对数据进行快照存储。AOF持久化方式记录每次服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写操作到文件末尾。Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。不过,我问过很多部门,出于性能考虑,他们的持久化都是不开启的。如果同时开启两种持久化方式,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。

  了解一下持久化的C语言实现。Redis需要执行RDB的时候,服务器会执行以下操作:redis调用系统函数fork(),创建一个子进程。子进程将数据集写入到一个临时RDB文件中。当子进程完成对临时RDB文件的写入时,redis用新的临时RDB文件替换原来的RDB文件,并删除旧RDB文件。在执行fork时linux操作系统(一般大公司的服务器都是这个系统)会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更新其中某片数据时,操作系统会将该片数据复制一份以保证子进程的数据不收影响,所以新的RDB文件存储的是之执行fork那一刻的内存数据。RDB文件是经过压缩的二进制格式,所以占用的空间会小于内存的数据大小。但是压缩操作很占CPU,所以可以通过配置文件配置禁止压缩。

  了解一下对应的redis命令。除了自动快照,还可以手动发送save或者bgsave命令让redis直行快照。save命令是在主进程上进行的,会阻塞其他请求。后者会fork子进程进行快照操作。

  和mysql存储比较。RDB方式比较类似于mysql的mysqldump命令备份。而AOF更接近于binlog。

Redis内存优化

   redis配置文件中有个maxmemory参数设置,如果没有设置会继续分配内存,因此可以逐渐吃掉所有可用内存。因此,通常建议配置一些限制和策略。这样做的优点是:不会导致因为内存饥饿而整机死亡。缺点是:Redis可能会返回内存不足的错误写命令。redis有6种过期策略。

  1>volatile-lru:只对设置了过期时间的key进行LRU

  2>allkeys-lur:对所有的key进行LRU

  3>volatile-random:随机删除即将过期的key

  4>allkeys-random:从所有的key中随时删除

  5>volatile-ttl:删除即将过期的,ttl(tiime to live)剩余生存时间

  6>noeviction:永不过期,返回错误

  参数的设置可以采用命令方式,也可以采用配置文件方式(所有的配置都支持这两种),配置命令如

  config set maxmemory-policy volatile-lru

  还可以设置随机抽样数,如

  config set maxmemory-samples 5 就是说每次进行淘汰的时候,会随机抽取5个key从里面淘汰最不经常使用的。

  

  redis压缩列表(ziplist)。压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量表项,并且每个列表要么是小整数,要么是较短的字符串,那么redis就会使用压缩列表来作为列表键的底层实现。当一个哈席键只包含少量key-value对,且每个key和value要么是小整数,要么是较短字符串,那么redis就会使用ziplist作为哈希键的底层实现。

  

  我在介绍自己的epiphany框架的时候(在上面流程图里也有体现),如果一个key里的结构是个hash,在小于1k的hash键的情况下我直接用hash,而大于1k,考虑到写入性能差,我就直接将hash打包压缩成一个大value来存储。考虑使用这两种策略的其中一个原因是小散列表使用的内存非常小,节省存储空间。

跑题时间:

  这幅画的名字叫《洗尽铅华》

转载于:https://www.cnblogs.com/xiexj/p/7391521.html

Redis和消息队列使用实战相关推荐

  1. 秒杀抢购异步下单:基于Redis的消息队列秒杀抢购异步下单功能

    学习Redis时,练习的实战项目代码--基于Redis的Stream类型的秒杀抢购异步下单. 说明: Redis的stream类型的消息队列实现异步下单功能.Redis版本至少要5.0及以上版本才可以 ...

  2. Redis做消息队列,香吗?

    来自:架构师修行之路 菜菜哥,我刚做完了一个订单系统,感觉很简单呀 说说看,大量的订单状态怎么处理的? 我设计的时候可是考虑了这一点,所以用了异步处理,采用了MQ 那用的什么MQ呢,透露一下呗 我用的 ...

  3. 【springboot】【redis】springboot+redis实现发布订阅功能,实现redis的消息队列的功能...

    springboot+redis实现发布订阅功能,实现redis的消息队列的功能 参考:https://www.cnblogs.com/cx987514451/p/9529611.html 思考一个问 ...

  4. PHP + Redis 实现消息队列

    Redis做消息队列的好处在于它的轻量级,高并发,延迟敏感,应用场景有 即时数据分析.秒杀计数器.缓存等 Redis做消息队列待解决的问题: 1.消息的可靠性: 没有相应的机制保证消息的消费,当消费者 ...

  5. ​redis实现消息队列

    redis是一个开源的key-value存储系统.与Memcached类似,Redis将大部分数据存储在内存中,支持的数据类型包括:字符串.哈希表.链表.集合.有序集合以及基于这些数据类型的相关操作. ...

  6. 用redis实现消息队列(实时消费+ack机制)【转】

    用redis实现消息队列(实时消费+ack机制) java queue 消息队列 redis 消息队列 首先做简单的引入. MQ主要是用来: 解耦应用. 异步化消息 流量削峰填谷 目前使用的较多的有A ...

  7. 使用Redis 实现消息队列

    一 .为什么要用Redis实现轻量级MQ? MQ的主要作用: 应用解耦 异步化消息 流量削峰填谷 目前使用比较多的是ActiveMQ . RabbitMQ . ZeroMQ . Kafka . Met ...

  8. 【BCVP】实现基于 Redis 的消息队列

    聆听自己的声音 如果自己学不动了,或者感觉没有动力的时候,看看书,听听音乐,跑跑步,休息两天,重新出发,偷懒虽好,可不要贪杯. 话说上回书我们说到了,Redis的使用修改<[BCVP更新]Sta ...

  9. 程序员过关斩将--redis做消息队列,香吗?

    菜菜哥,我刚做完了一个订单系统,感觉很简单呀 说说看,大量的订单状态怎么处理的? 我设计的时候可是考虑了这一点,所以用了异步处理,采用了MQ 那用的什么MQ呢,透露一下呗 我用的redis做的MQ,很 ...

最新文章

  1. 你应该知道的计算机网络知识
  2. 讨论一下文章的阅读量 (个人观点)
  3. 3种Python数据结构,13种创建方法,这个总结,超赞!
  4. Spring学习之AOP(面向切面编程)
  5. hdu 1115 计算多边形重心
  6. pymysql.err.InternalError: (1130, Host '127.0.0.1' is not allowed to connect to this MySQL server)
  7. 苹果阻止上架的这款软件,到底有多可恶?
  8. Spark 1.0.0版本号公布
  9. iphone win7无法识别_win7系统电脑不能识别iphone苹果设备的解决方法
  10. 高数_第6章无穷级数__幂级数_收敛点收敛域收敛半径
  11. 中国科学报:吴文俊的数字之舞
  12. Node.js中exports和moudle.exports
  13. RFID电子标签有哪些区
  14. 【语义分割】Searching for Efficient Multi-Scale Architectures for Dense Image Prediction翻译
  15. springCloud-day04
  16. View onMeasure 方法
  17. Linux驱动视频教程推荐,隆重推荐:linux驱动基础开发系列免费教程独家版本
  18. Java服务超时保护_五、服务保护-Hystrix
  19. 【动手学深度学习PyTorch版】12 卷积层
  20. WIFI模块调试_RTL8189FTV

热门文章

  1. MIT提出Liquid机器学习系统,可像液体一样适应动态变化
  2. 精心整理,机器学习的3大学习资源
  3. 论文 | 图像和谐化公开数据集:让前景和背景更“般配”
  4. 【AI学习篇】实战深度学习(3):深度学习的数据表示
  5. 旷世科技算法实习面经
  6. 人工智能正在引领全球企业的创新
  7. 深度丨Google告诉你为什么各大机构都在争相研究AI芯片
  8. 深入理解网络最大流和Ford-Fulkson算法
  9. ​两院院士评选“2021年中国/世界十大科技进展新闻”揭晓
  10. 2021年突破人类想象力的6大科学纪录