通过实际操作理解redis cluster原理
Redis 集群是redis官方提供的一种集群方案,从3.0开始提供稳定版,应用也已经比较广泛,也经受住了时间考验,个人感觉完全可以取代codis,tweemproxy等集群方案。 cluster原理介绍cluster是使用数据分片的形式实现的,一个 Redis cluster集群包含 16384 个哈希槽, 任意一个key都可以通过 CRC16(key) % 16384 这个公式计算出应当属于哪个槽。每个槽应当落在哪个节点上,也是事先定好。这样,进行任一操作时,首先会根据key计算出对应的节点,然后操作相应的节点就可以了。 所以说,其实cluster跟单点相比,只是多了一个给key计算sharding值的过程,并没有增加多少复杂度,完全可以放心使用。 在这样的设计下,一些对节点的操作也很方便,操作过程中对client端也不会有影响。1. 增加节点:将原有节点的某些slot转移到新节点上2. 删除节点: 将节点上的槽转移到其他节点上以后,移除空节点3. 节点故障:落到故障节点上的操作会失败,而集群其他部分可以正常访问,这样就不会出现一致性哈希方案的“雪崩”问题。单点的故障也可以通...
一种实现在hbase中存储set的思路
HBase 的存储模型是简单的键值对(rowkey → column family → qualifier → value),不像 Redis 那样原生支持 Set、List、Hash 等数据结构。但实际业务中,我们经常需要存储集合类型的数据——比如用户的标签集合、商品的属性集合、社交关系中的好友列表。 如何在 HBase 中优雅地实现一个 Set?本文介绍一种利用 HBase 列(qualifier)特性实现的高效方案。 需求定义一个合格的 Set 存储方案需要满足: 元素自动去重——Set 的基本语义 原子操作单个元素——增删查改不应影响其他元素 方便查询——能快速获取整个 Set,也能快速判断某个元素是否存在 方案对比方案 A:整体序列化把整个 Set 序列化为一个字节数组,存到 HBase 的某个 cell 中。 12345678910111213// 写Set<String> set = new HashSet<>(Arrays.asList("a", "b", "c"));by...
log4j2.xml配置示例及与log4j的区别
完整配置示例1234567891011121314151617181920212223242526272829303132333435<?xml version="1.0" encoding="UTF-8" ?><configuration status="warn"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="[%p] %d %c %l - %m%n"/> </Console> <RollingFile name="activity" fileName="/opt/fox.log" filePattern="...
不实现equals方法的情况下比较java list
问题的提出java里比较两个list的值是否一致,不考虑顺序,有多种方法,比如排序后直接用equals比较,相互之间执行两次containsAll等,这些办法都需要我们给list的元素类实现equals和hashcode方法。但是有一种特殊情况,如果我们并不方便去实习类的equals方法,例如是一个古老的第三方jar包,改代码会带来很多未知问题,这时候该怎么办呢。 不实现 equals 的比较方案其实很简单,万能的apache-commons早就想到了这一点,所以在commons-collections4中增加了外部输入equals和hashcode的方法,甚至equals和hashcode方法本身也不需要我们自己写代码,可以用comons-lang包实现,具体代码如下 使用第三方工具1234567891011<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> &...
使用lua脚本和jedis实现redis的hmsetnx命令,操作hash表时不覆盖原有数据
Redis 的 Hash 操作中,HSETNX 可以保证只在 field 不存在时才写入,但 HMSET(批量设置多个 field)却没有对应的 HMSETNX 命令。如果你需要批量初始化缓存且不覆盖已有数据,每次发 N 个 HSETNX 命令会产生 N 次网络往返,这在批量场景下性能很差。 用 Lua 脚本可以完美解决这个问题——把逻辑放到 Redis 服务端执行,只需要一次网络往返。 问题背景假设你有一个用户配置的缓存场景:新用户首次访问时,需要初始化一组默认配置到 Redis Hash 中。但如果用户已经有了部分配置,不应该覆盖。 用 HSETNX 逐个设置当然可以,但如果有 20 个配置项,就是 20 次 Redis 往返。在高并发下,这会成为瓶颈。 而 HMSET 一次可以设多个 field,但它会无条件覆盖已有值——这不符合需求。 Lua 脚本方案12345678910local keyfor i, j in ipairs(ARGV)do if i % 2 == 0 then redis.call('hsetnx', KEY...
vitualbox虚拟机安装centos 7 及ssh访问、自启动等配置
为了方便,最近用vitualbox搭了一个centos7的虚拟机,整个过程比较简单,在这里记录一下。 下载vitualbox直接去官网(https://www.virtualbox.org/wiki/Downloads)下载即可 下载centos安装包同样官网下载(https://www.centos.org/download/),我下载的是minimal iso 安装安装过程很简单,一路默认点下去就可以,中间内存、分区什么的可以根据需要调一下 配置本机ssh访问vitualbox默认的分辨率非常低,可以通过安装增强工具进行优化。不过由于我们不需要图形化界面,其实可以通过其他方式解决这一问题,就是用xshell或者putty通过ssh远程登陆到虚拟机上。 打开ssh服务12service sshd startchkconfig sshd on 分别启动ssh服务,并将ssh设定为自启动 关闭防火墙由于只是弄着玩的,直接把防火墙关掉,方便。 centos7的防火墙操作和之前版本区别很大: 12sudo systemctl stop firewalld.servicesudo sys...
在java独立进程(standalone app)中嵌入hawtio监控
hawtio(hawt.io)是一个开源的监控系统,它提供了多种启动方式,可以运行单独的jar包、war包,然后远程连接其他应用进行监控,也可以将它直接嵌到我们自己的应用中。 本文会介绍在一个单独的java进程(java standalone application)中嵌入hawtio,对应官方文档(http://hawt.io/getstarted/index.html)的 “Using hawtio inside a stand alone Java application”,不过这一节文档问题是比较多的,如果你只看这段,会遇到各种问题。 下面介绍具体步骤 引入jar包除了官方文档里说的hawtio-embedded外,hawtio-insight-log,hawtio-core,hawtio-web这几个包都是必需的,我们都引入当前的最新版本. 1234567891011121314151617181920<dependency> <groupId>io.hawt</groupId> <artifactId>haw...
java日志系统简介: 从tomcat大量打印debug日志说起
Java 的日志框架生态可能是所有编程语言中最复杂的——不是因为它功能多复杂,而是历史原因导致了多套体系的并存和交叉。本文从一个真实的线上排查案例出发,理清 Java 日志框架的体系结构。 Java 日志体系架构目前 Java 下最主流的两套日志体系是 Log4j 和 SLF4J + Logback。 日志门面 vs 日志实现理解这个区分是搞懂 Java 日志生态的关键: 类型 角色 例子 日志门面(Facade) 只定义接口,不提供具体实现 SLF4J、Commons Logging(JCL) 日志实现 真正的日志写入逻辑 Logback、Log4j 1.x、Log4j 2、java.util.logging(JUL) SLF4J + Logback 是典型的门面+实现分离架构:SLF4J 只包含接口(LoggerFactory、Logger),Logback 是具体实现。分离的好处是代码只依赖 SLF4J 接口,实现可以随时替换。 Log4j 1.x 则同时包含接口和实现——代码直接用 org.apache.log4j.Logger。 桥接器正是因为有...
Java kryo/protobuf/protostuff序列化 or Json 性能对比
为什么需要序列化方案对比对于一个java object的序列化,想测一下使用json和使用一般序列化工具,在时间性能、空间性能上的区别。 json选择用fastjson. 序列化工具使用了protostuff和kyro. 为什么不用protobuf呢?因为感觉对于一个已有的上百个属性的java class来说,再去新建一个匹配的proto文件有点反人类。protostuff是protobuf的改良版本,可以直接将一个java object进行序列化,使用方法与kyro有点类似,没有protobuf那么多中间过程。其他的,hession, java自带序列化之类的,据说性能比kryo和protobuf差很多,就不测了。 时间性能对比简单测了一下,发现差距还挺明显的,所以感觉也不需要做具体的评测了。把日志截一段发出来,大家感受下。 fastjson serilise cost <span class="hljs-number">555805</span> <span class="hljs-built_in"...
java分布式锁入门实战
这篇文章只讲使用,不讲原理,简单粗暴。 分布式锁,顾名思义,就是分布式的锁,应用于一些分布式系统中。例如,有一个服务部在数太机器上,然后有可能操作数据库中的同一条记录。这时,就需要分布式锁。 分布式锁实现的方式很多,一般来说需要一个实体来代表一个锁,占用锁时就新建这个实体,锁释放时也对应将相应实体删除。同时,一般还需要一个锁超时过期的策略,避免一些异常情况造成锁无法被释放。 zookeeper和redis都是常用的实现分布式锁的方式。接下来就简单介绍一下这两种方式的使用。 基于zookeeper的分布式锁使用zookeeper的话,建议直接使用curator客户端. <span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span c...













