0%

# SPI 可以用来做什么

在设计一个框架或者组件,甚至是项目中的某些模块时,经常都需要考虑扩展性, 而扩展性好应该符合以下两点:

  1. 作为框架的维护者,在添加一个新功能时,只需要添加一些新代码,而不用大量的修改现有的代码,即符合开闭原则。
  2. 作为框架的使用者,在添加一个新功能时,不需要去修改框架的源码,在自己的工程中添加代码或者修改配置即可。

而 Java SPI 可以很好的满足以上两点,从而达到良好的扩展性。

Java SPI(Service Provider Interface)是 JDK 内置的一种动态加载扩展点的实现,是一种“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。对扩展性支持非常友好,想要扩展实现,新只需要增实现接口,然后把接口的实现描述给JDK就行了。

阅读全文 »

# 产生背景

Distributed locks are a very useful primitive in many environments where different processes must operate with shared resources in a mutually exclusive way.

在某些场景中,多个进程必须以互斥的方式独占共享资源,这时用分布式锁是最直接有效的。

随着互联网技术快速发展,数据规模增大,分布式系统越来越普及,一个应用往往会部署在多台机器上(多节点),在有些场景中,为了保证数据不重复,要求在同一时刻,同一任务只在一个节点上运行,即保证某一方法同一时刻只能被一个线程执行。在单机环境中,应用是在同一进程下的,只需要保证单进程多线程环境中的线程安全性,通过 JAVA 提供的 volatile、ReentrantLock、synchronized 以及 concurrent 并发包下一些线程安全的类等就可以做到。而在多机部署环境中,不同机器不同进程,就需要在多进程下保证线程的安全性了。因此,分布式锁应运而生。

阅读全文 »

一、需求

  1. 设置了生存时间的Key,在过期时能不能有所提示?
  2. 如果能对过期Key有个监听,如何对过期Key进行一个回调处理?
  3. 如何使用 Redis 来实现定时任务?

比如:

  • 处理订单过期自动取消,12306 购票系统超过30分钟没有成功支付的订单会被回收处理;
  • 购买商品15天后默认好评;
  • 外卖系统的送餐超时提醒;
  • 客服与顾客聊天,客服超过多长时间没回复,系统给客服发一个提醒消息;
阅读全文 »

一、集合框架层次结构

ArrayList、Vector、LinkedList 这三者都是集合框架中的 List,所以要弄清楚它们之间的区别与联系,最好先对集合框架类的层级有个整体直观的认识。

下面是集合框架的简要类图:

从上图可以看到,Collection接口是所有集合的根,然后扩展开提供了三大类集合,分别是:

阅读全文 »

一、概述

集群的搭建可以分为以节点准备、节点握手、分配槽三个步骤。

节点准备

Redis集群一般由多个节点组成,节点数量至少为6个才能保证组成完整高可用的集群。每个节点需要开启配置 cluster-enabled yes,让 Redis 运行在集群模式下。建议为集群内所有节点统一目录,一般划分三个目录:conf、data、log,分别存放配置、数据和日志相关文件。把6个节点配置统一放在conf目录下。

阅读全文 »

一、版本选择

Redis 借鉴了 Linux 操作系统对于版本号的命名规则:版本号第二位如果是奇数,则为非稳定版本(例如2.7、2.9、3.1),如果是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2、4.0)。当前奇数版本就是下一个稳定版本的开发版本,例如2.9版本是3.0版本的开发版本。所以我们在生产环境通常选取偶数版本的 Redis。

阅读全文 »

一、概述

Redis 是一种基于键值对(key-value)的高性能内存数据库。与很多键值对数据库不同的是,Redis 的值支持 string(字符串)、 hash(哈希)、list(列表)、set(集合)、 zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位) 等多种数据结构,因此适用场景也更加丰富。Redis 是用 C 语言实现的,采用单线程架构,把所有的数据都放到内存中,因此 Redis 速度很快。除此之外,Redis 还提供了 持久化、主从复制、集群 以及以下几点功能:

  • 提供了键过期功能,可以用来实现缓存。
  • 提供了发布订阅功能,可以用来实现消息系统。
  • 支持 Lua 脚本功能,可以根据需要定制自己的 Redis 命令。
  • 提供了简单的事务功能, 能在一定程度上保证事物特性。
  • 提供了流水线(Pipeline)功能, 客户端可以将一批命令一次性传到 Redis,从而减少网络的开销。
阅读全文 »

一、分库与分表是为了解决什么问题(目的)

随着业务的增长,表数据的增加,查询一次所消耗的时间会变得越来越长,甚至会造成数据库的单点压力。当数据库已经成为系统性能的瓶颈,这时,通过分库分表,可以减小数据库的单库单表负担,提高查询性能,缩短查询时间,从而提升系统的响应速度。

阅读全文 »

一、背景

最近在 ifeve.com 看到这么一个面试题 “京东面试题 – 有一个生成唯一串的需求,并发请求量非常大,该如何实现?”。在现实开发中,这也是必须要考虑到的一个点。比如分库分表后主键采用什么策略生成?在分布式系统中如何生成唯一ID标识?

阅读全文 »