一种实现在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...
leetcode第三题: 输出不包含重复字母的最长子串
题目Given a string, find the length of the longest substring without repeating characters. Examples: Given “abcabcbb”, the answer is “abc”, which the length is 3. Given “bbbbb”, the answer is “b”, with the length of 1. Given “pwwkew”, the answer is “wke”, with the length of 3. Note that the answer must be a substring, “pwke” is a subsequence and not a substring. 也就是说给定一个字符串,输出不包含重复字母的最长子串长度。 思路遍历一次字符串,O(n)复杂度下可以...













