消息队列是在乐视这边非常普遍使用的技术。在我们部门内部,不同的项目使用的消息队列实现也不一样。下面是支付系统的流转图(部门兄弟画的,借用一下):
从图中可以看到,里面用到了kafka消息队列。作用是做数据库分库分表后的聚合,异步汇总到一张总表。里面也用到了redis,用来处理高并发下的订单重复提交。我们这边还使用了公司统一集群的apache qpid消息队列,是AMQP的一个实现,主要用于不同部门间的通信。一般的大公司都会有一些公司统一的集群,但是这种统一集群对开发者来说相对透明,所以部门间相互合作的时候用的多,自己部门内部用,避免采坑,大家宁愿自己搭一套。redis用处就更多了。阿里的阳哥自己做了一个异常日志监控平台,主要就是用redis做数据传输和存储。
别人做的东西我就不多说了。下午说说redis在我自己的框架中使用实战。这是epiphany离线数据的流程图(官网:www.fhadmin.org)。
从图中可以看到处理过程基本都是在和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那一刻的内存数据。(官网:www.fhadmin.org)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就会使用压缩列表来作为列表键的底层实现。(官网:www.fhadmin.org)当一个哈席键只包含少量key-value对,且每个key和value要么是小整数,要么是较短字符串,那么redis就会使用ziplist作为哈希键的底层实现。
我在介绍自己的epiphany框架的时候(在上面流程图里也有体现),如果一个key里的结构是个hash,在小于1k的hash键的情况下我直接用hash,而大于1k,考虑到写入性能差,我就直接将hash打包压缩成一个大value来存储。考虑使用这两种策略的其中一个原因是小散列表使用的内存非常小,节省存储空间。
跑题时间:
这幅画的名字叫《洗尽铅华》
相关推荐
【标题】中的“针对java、mysql、redis、消息队列开发的一款面经、题型的应试网站”表明这是一个专为准备Java、MySQL、Redis和消息队列面试者设计的在线学习平台。这个网站可能包含了各种面试问题、实战练习以及相关...
- **消息队列**:使用列表或发布/订阅模式实现消息的发送和接收。 - **限流**:利用计数器限制请求频率,防止系统过载。 - **分布式锁**:在分布式系统中,利用Redis实现跨节点的锁服务。 8. **性能优化** - **...
Redis的实战教学可以涵盖多个方面,包括Redis的基础概念、数据结构、命令使用、应用场景以及高级特性等。以下是一个简要的Redis实战教学概览: 一、Redis基础概念 定义:Redis是一个开源的、高性能的、基于键值对的...
11. **实战案例**:最后,通过实际项目或案例,演示如何在Web开发、缓存、计数器、队列等多种场景下使用Redis 6。 通过这些PPT的学习,你将能掌握Redis 6的核心知识,并具备在实际项目中运用的能力。每个主题都值得...
### Redis实战中文版知识点概述 #### 一、Key-Value存储系统简介 ##### 1.1.1 Voldemort - **特点**: Voldemort 是一个分布式Key-Value存储系统,它被设计用于处理大规模的数据,并且能够提供高可用性和容错性。 -...
### Redis实战知识点详解 #### 一、Redis快速入门 ##### 1.1 Key-Value存储系统简介 **Redis**作为一款高性能的键值(Key-Value)存储系统,在现代软件架构中扮演着重要的角色。与其他键值存储系统如**Voldemort**...
Redis,全称Remote Dictionary Server,是一款高性能的键值存储系统,常被用于数据库、缓存和消息中间件等场景。Redis以其高效的性能、丰富的数据结构和简单易用的API深受开发者的喜爱。以下是对Redis的一些核心知识...
Redis,全称Remote Dictionary Server,是一个开源的、高性能的键值对存储系统,常用于数据缓存、消息队列以及数据库功能。Redis以其高速度和丰富的数据结构支持而闻名,它支持字符串、哈希、列表、集合、有序集合等...
综上所述,《Redis设计与实战》这本书全面介绍了Redis的核心概念、设计原理、实战应用以及运维技巧,对于想要深入理解和使用Redis的IT从业者来说,是一份宝贵的参考资料。通过学习,读者不仅能掌握Redis的基本操作,...
总之,《Redis实战》是一本全面解析Redis的实用指南,无论你是初学者还是经验丰富的开发者,都能从中获取到宝贵的实战经验和深入理解,提升你在使用Redis时的效率和能力。通过学习这本书,你将能够熟练掌握Redis的...
### Redis实战中文PDF知识点概述 #### 一、Redis快速入门及理解深化 ...以上是对《Redis实战中文PDF》文档内容的深入解读和总结,旨在帮助读者更好地理解和掌握Redis的基本概念、数据类型、常用命令以及高级特性。
它支持存储的值包括字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)、位图(bitmaps)、超日志(hyperloglogs)、地理空间索引(...,如缓存、消息队列、会话存储等...
Redis,全称Remote Dictionary Server,是一款高性能的键值存储系统,常被用于数据库、缓存和消息中间件的角色。它的核心特点在于其内存中的数据存储,使得读写速度极快,能够处理大量的高并发请求。Redis的优势在于...
MongoDB实战与Redis实战是两个重要的数据库技术主题,它们在现代数据存储和处理领域占据了显著的位置。MongoDB是一种流行的文档型数据库,而Redis则是一款高效的数据结构存储系统,常用于缓存、消息队列等场景。 ...
4. **消息队列**:利用Redis的发布/订阅功能实现简单的消息队列系统。 5. **分布式锁**:通过Redis实现跨服务器间的锁定机制,确保数据的一致性和安全性。 6. **任务调度**:利用Redis的列表和延迟队列特性实现任务...
《Redis实战》这本书深入浅出地探讨了Redis这一高性能、键值存储系统在实际应用中的各种技巧和策略。Redis作为一款内存数据结构存储系统,因其快速的数据读写能力,广泛应用于缓存、消息队列、计数器以及分布式锁等...
Redis,全称Remote Dictionary Server,是一款高性能的键值存储系统,常被用于数据库、缓存和消息中间件的角色。在本资源"redis实战高清版"中,你将深入了解到Redis的功能及其实现原理,这对于理解并有效利用Redis...
Redis,全称Remote Dictionary Server,是一款高性能的键值存储系统,常被用于数据库、缓存和消息中间件的角色。在本资源"Redis实战(完整版)"中,你将找到有关Redis的深入实践和应用案例,帮助你更好地理解和运用...