翻译自 Under the Hood of Redis: Strings

你知道简单string strings 在redis里占用了56 bytes的内存吗?

我会试图告诉你为什么,了解redis运行原理时非常重要的。当你试图构建一个高负载的应用显的尤为重要,同时,你很快就会理解你的redis实例为什么会消费大量的内存?

阅读全文 »

  1. Query 和 Criteria 查询

    1
    2
    3
    Query query = new Query();
    query.addCriteria(Criteria.where("name").is("Eric"));
    List<User> users = mongoTemplate.find(query, User.class);

    支持的查询方法:is, regex, lt, gt, pageable, sort

  2. 生成query方法

    • findByX

      1
      List<User> findByName(String name);
    • startinggWith and endingWith

      1
      2
      List<User> findByNameStartingWith(String regexp);
      List<User> findByNameEndingWith(String regexp);
    • between

      1
      List<User> findByAgeBetween(int ageGT, int ageLT);
    • like and orderBy

      1
      List<User> users = userRepository.findByNameLikeOrderByAgeAsc("A");
  3. JSON Query methods : @Query

    1
    2
    @Query("{ 'name' : ?0 }")
    List<User> findUsersByName(String name);

    支持的查询方法: $regex, $gt, $lt

  4. QueryDSL Queries

    4.1 maven

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <dependency>
    <groupId>com.mysema.querydsl</groupId>
    <artifactId>querydsl-mongodb</artifactId>
    <version>3.6.6</version>
    </dependency>
    <dependency>
    <groupId>com.mysema.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
    <version>3.6.6</version>
    </dependency>


    <plugin>
    <groupId>com.mysema.maven</groupId>
    <artifactId>apt-maven-plugin</artifactId>
    <version>1.1.3</version>
    <executions>
    <execution>
    <goals>
    <goal>process</goal>
    </goals>
    <configuration>
    <outputDirectory>target/generated-sources/java</outputDirectory>
    <processor>
    org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
    </processor>
    </configuration>
    </execution>
    </executions>
    </plugin>

    4.2 class

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @QueryEntity
    @Document
    public class User {

    @Id
    private String id;
    private String name;
    private Integer age;

    // standard getters and setters
    }
  5. Implement QueryDslPredicateExecutor

    1
    2
    3
    QUser qUser = new QUser("user");
    Predicate predicate = qUser.name.eq("Eric");
    List<User> users = (List<User>) userRepository.findAll(predicate);

    支持的查询方法:is,startinggWith and endingWith, between

获取项目配置

curl -X GET http://admin:[email protected]:37555/job/geek-icem_backend_build-packages/config.xml

build

curl -X POST http://admin:[email protected]:37555/job/geek-icem_backend_build-packages/build -F ‘json={“parameter”: [{“name”: “Project”, “value”: “geek-icem-gateway”}, {“name”: “Branch”, “value”: “ad”}]}’

curl -X POST http://127.0.0.1:37555/job/geek-icem_backend_build-packages/build –user admin:Jenkins -H ‘cache-control: no-cache’ -F ‘json={“parameter”: [{“name”: “Project”, “value”: “geek-icem-gateway”}, {“name”: “Branch”, “value”: “ad”}]}’

获取构建信息

curl -X GET http://admin:[email protected]:37555/job/geek-icem_backend_build-packages/lastCompletedBuild/api/json

获取构建信息

curl -X GET http://admin:[email protected]:37555/job/geek-icem_backend_build-packages/lastBuild/api/json

获取控制台日志

curl -X GET http://admin:[email protected]:37555/job/geek-icem_backend_build-packages/17/consoleText

lastBuild, lastStableBuild, lastSuccessfulBuild, lastFailedBuild, lastUnstableBuild, lastUnsuccessfulBuild, lastCompletedBuild

获取描述

curl -X GET http://admin:[email protected]:37555/job/geek-icem_backend_build-packages/description

References

jenkins 出现“Error 403 No valid crumb was included in the request ”的解决方案

python-jenkins

使用 Python 操作 Git 版本库 - GitPython

Jenkins获取编译状态

GitPython Tutorial

背景

项目原本是用jedis连接redis,但考虑到需要用redis锁,因此替换为方便快捷的redisson,但是使用redisson之后会报decode error,具体信息如下:

1
2
3
4
5
6
7
8
9
10
11
2019-05-15 13:39:59.973 [redisson-netty-2-3] ERROR o.r.c.h.CommandDecoder [decodeCommand:203]     - Unable to decode data. channel: [id: 0x477c5ced, L:/192.168.4.94:57423 - R:10.10.10.43/10.10.10.43:6379], reply: ReplayingDecoderByteBuf(ridx=102, widx=102), command: (GET), params: [Geek:xxxxx:xxxx]
java.io.IOException: java.lang.NullPointerException
at org.nustaq.serialization.FSTObjectInput.readObject(FSTObjectInput.java:247)
at org.redisson.codec.FstCodec$1.decode(FstCodec.java:228)
at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:368)
at org.redisson.client.handler.CommandDecoder.decodeCommand(CommandDecoder.java:200)
at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:140)
at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:115)
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:502)
at io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:366)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:278)
阅读全文 »

  1. mysql自增

    优点:简单

    缺点:扩容复杂,业务增大时数据迁移困难

  2. 基于时间戳和随机字符串

    优点:对人比较友好

    缺点:随机数生成不易控制

  3. UUID

    优点:简单粗暴,性能好,全球唯一,基本不会有性能问题

    缺点:占用空间大,无序,查询效率低

    变种:COMB算法

  4. redis自增

    优点:简单,易实现,数字ID天然有序

    缺点:依赖redis,考验redis性能

  5. Twitter-Snowflake算法

    优点:

    • 不依赖数据库,性能高,单机有序
    • 灵活,支持多节点部署

    缺点:

    • 无法做到全局递增
  6. 微信id生成算法

    万亿级调用下的优雅:微信序列号生成器架构设计及演变

    • 类似于批量生成多个id,性能好,避免每次访问库的压力
    • 可能会有单点故障,服务重启ID不连续
  7. 百度 - UidGenerator

    • 雪花算法变种
  8. Leaf——美团点评分布式ID生成系统- 美团技术团队

  9. wuid一个比 UUID 快百倍的唯一 ID 生成器

  10. vesta

  11. MongoDB — ObjectId

定义

目标和关键成果(Objectives and Key Results)

原则

  1. OKRs要是可量化的(时间&数量),比如不能说“使gmail达到成功”而是“在9月上线gmail并在11月有100万用户”

  2. 目标要是有野心的,有一些挑战的,有些让你不舒服的。一般来说,1为总分的评分,达到0.6-0.7是较好的了,这样你才会不断为你的目标而奋斗,而不会出现期限不到就完成目标的情况。

  3. 每个人的OKRs在全公司都是公开透明的。比如每个人的介绍页里面就放着他们的OKRs的记录,包括内容和评分

两个不同

  1. O和KR的不同:O要是有挑战性的,如果是板上钉钉的事情就是不够的;KRs能很好的支持O的完成,是要明显可量化的,便于评分的。

  2. 个人、组、公司OKRs的不同:个人OKRs是你个人展现你将会做什么;组的OKRs不是个人打包,是组优先做的事情;公司OKRs是高层对整个公司的展望。

优势

  1. 目标的协调和统一。公司 -> 团队-> 个人目标层层分解,每个人不再只关注自己的工作,而是能够看到”the bigger picture”,了解自己在团队和公司整体目标中发挥的作用,让自己的工作更有意义,从而更有积极性。并且,所有团队的目标都能被统一地联系在一起,执行起来可以相互支持;
  2. 判断优先级。通过梳理 OKRs,能找出最重要的事情,让全公司专注在最有价值的事情上,便于做出取舍,最有效地利用资源;
  3. 双向沟通。OKRs 的制定由员工和自己的直线上级一起制定,需要双方同意,而不是简单粗暴的由上而下,员工只是被动接受
  4. 灵活调整。不像 KPI 是死的,只要目标不变,OKRs 中的关键事件(Key Results)在回顾的过程中可以根据情况随时灵活调整;
  5. 鼓励创新。员工有自主权去制定有挑战性的目标,而不是拘泥于公司设定的框架里。往往能激发和产生出一些意想不到的新想法和结果,鼓励公司内部创新的发生。

原则

SMART

责任分配矩阵(RAM)

效果

  1. 清楚界定每项成果
  2. 为项目的每项成果设定责任人
  3. 让跨职能沟通更为有效
  4. 加速项目决策流程,简化审批

分配基本原则(RACI模型)

  1. 相互独立,完全穷尽(Mutually Exclusive Collectively Exhaustive,MECE):分解的任务各部分之间相互独立,所有部分完全覆盖任务的各个部分;
  2. 结果导向,而非行动:分解任务时关注结果,而不要陷入对细节行动的过分关注当中,导致分解过于繁琐复杂

References

转:力荐神器级员工考核工具:谷歌OKR

一张图、一颗心、一场仗,阿里巴巴的绩效之道

揭秘阿里leader的绩效管理之道

OKRs 与目标分解

关于 OKR 的常见问题

教你几招,即刻开始实施 OKRs