Redis-快速入门 Posted on 2019-06-26 Edited on 2021-04-15 简介介绍REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo 写的key-value 存储系统。Redis 是一个开源的使用ANSI C 语言编写、遵守BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的API 。它通常被称为数据结构服务器,因为值value 可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets) 等类型。 Read more »
Python-编码问题 Posted on 2019-06-24 Edited on 2020-02-05 问题123File "sms.py", line 8SyntaxError: Non-UTF-8 code starting with '\xe6' in file sms.py on line 8, but no encoding declared;see http://python.org/dev/peps/pep-0263/ for details Read more »
Zookeeper-分布式锁 Posted on 2019-06-23 Edited on 2020-02-05 分布式锁简介分布式锁的实现有哪些? Memcached 分布式锁 利用Memcached 的add 命令。此命令是原子性操作,只有在key 不存在的情况下,才能add 成功,也就意味着线程得到了锁。 Redis 分布式锁 和Memcached 的方式类似,利用Redis 的setnx 命令。此命令同样是原子性操作,只有在key 不存在的情况下,才能set 成功。(setnx命令并不完善,后续会介绍替代方案) Zookeeper 分布式锁 利用Zookeeper 的顺序临时节点,来实现分布式锁和等待队列。Zookeeper 设计的初衷,就是为了实现分布式锁服务的。 Chubby Google 公司实现的粗粒度分布式锁服务,底层利用了Paxos 一致性算法。 Read more »
151-suggestions-for-improving-java Posted on 2019-06-16 Edited on 2023-09-09 不要在常量和变量中出现易混淆的字母包名全小写,类名首字母全大写,常量全部大写并用下划线分隔,变量采用驼峰命名法(Camel Case) 命名等,这些都是最基本的Java 编码规范,是每个Javaer 都应熟知的规则,但是在变量的声明中要注意不要引入容易混淆的字母。 尝试阅读如下代码,思考一下打印出的i等于多少: 123456public class Client { public static void main(String[] args) { long i = 1l; System.out.println("i的两倍是:" + (i+i)); }} 肯定有人会说:这么简单的例子还能出错?运行结果肯定是22! 实践是检验真理的唯一标准,将其拷贝到Eclipse 中,然后Run 一下看看,或许你会很奇怪,结果是2,而不是22,难道是Eclipse 的显示有问题,少了个“2”?因为赋给变量i 的数字就是“1”,只是后面加了长整型变量的标示字母“l” 而已。别说是我挖坑让你跳,如果有类似程序出现在项目中,当你试图通过阅读代码来理解作者的思想时,此情此景就有可能会出现。所以,为了让您的程序更容易理解,字母“l”(还包括大写字母“O”)尽量不要和数字混用,以免使阅读者的理解与程序意图产生偏差。如果字母和数字必须混合使用,字母“l”务必大写,字母“O”则增加注释。 字母“l”作为长整型标志时务必大写。 Read more »
Java-ThreadLocal之工作原理 Posted on 2019-06-02 Edited on 2020-02-05 基础概念概念引入在实际开发中,并发是很重要的需求,由此而带来的语言层面的切入点就是线程了,引入多线程开发之后,自然要考虑好同步、互斥、安全等内容。因为这些需求就出现了以下三种来实现线程安全的手段: 互斥同步 简单点理解就是通过加锁来实现对临界资源的访问限制。加锁方式有Synchorized 和Lock 。 非阻塞同步 前面提到的互斥同步属于一种悲观锁机制,非阻塞同步属于乐观锁机制。典型的实现方式就是CAS 操作。 无同步方案 要保证线程安全,并不是一定就需要同步,两者没有因果关系,同步只是保证共享数据征用时正确性的手段,如果一个方法本来就不涉及共享数据,那它就不需要任何同步措施去保证正确性。ThreadLocal 的概念就是从这里引申出来的。 Read more »
Java-transient瞬态关键字 Posted on 2019-05-20 Edited on 2020-02-05 简介当一个类的对象需要被序列化时,但是某些属性不需要被序列化,这时不需要序列化的属性可以使用关键字transient 修饰。只要被关键字transient 修饰了,序列化时这个属性就不会被序列化了。同时静态修饰也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化。 Read more »
Dubbo-快速入门 Posted on 2019-05-11 Edited on 2020-06-29 简介Dubbo是阿里巴巴在2011年开源的的分布式服务框架,是SOA服务化治理方案的核心框架。Dubbo的整体架构如下:Dubbo主要提供三个方面的功能: 远程接口调用。 负载均衡和容错。 自动服务注册与发现。 首先准备环境,需要安装Zookeeper。详细的Zookeeper信息可以看我的另一篇博客。 Read more »
Zookeeper-快速入门 Posted on 2019-04-28 Edited on 2020-02-05 简介ZooKeeper 是一种用于分布式应用程序的分布式开源协调服务。Zookeeper 公开了一组简单的原语,分布式应用程序可以构建这些原语,以实现更高级别的服务,以实现同步,配置维护以及组和命名。Zookeeper 被设计为易于编程,并使用在熟悉的文件系统目录树结构之后设计的数据模型。它在Java 中运行,并且具有Java 和C 的绑定。众所周知,协调服务很难做到。他们特别容易出现比赛条件和死锁等错误。ZooKeeper 背后的动机是减轻分布式应用程序从头开始实施协调服务的责任 Read more »
GraphQL-快速入门 Posted on 2019-04-27 Edited on 2020-02-05 示例代码123456789101112131415161718192021222324252627282930313233import graphql.ExecutionResult;import graphql.GraphQL;import graphql.schema.GraphQLSchema;import graphql.schema.StaticDataFetcher;import graphql.schema.idl.RuntimeWiring;import graphql.schema.idl.SchemaGenerator;import graphql.schema.idl.SchemaParser;import graphql.schema.idl.TypeDefinitionRegistry;import static graphql.schema.idl.RuntimeWiring.newRuntimeWiring;public class HelloWorld { public static void main(String[] args) { String schema = "type Query{hello: String} schema{query: Query}"; SchemaParser schemaParser = new SchemaParser(); TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema); RuntimeWiring runtimeWiring = newRuntimeWiring() .type("Query", builder -> builder.dataFetcher("hello", new StaticDataFetcher("world"))) .build(); SchemaGenerator schemaGenerator = new SchemaGenerator(); GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring); GraphQL build = GraphQL.newGraphQL(graphQLSchema).build(); ExecutionResult executionResult = build.execute("{hello}"); System.out.println(executionResult.getData().toString()); // Prints: {hello=world} }} Read more »
JS 中的var、let和const的区别和相同 Posted on 2019-04-22 Edited on 2020-02-05 varJavaScript没有块级作用域 在JS函数中用var声明的变量,其作用域是函数体的全部。 123456<script type="text/javascript"> for (var i = 0; i < 10; i++) { var x = 8; } console.log(x);</script> 这里的”x”已经跳出了”for”的作用域,却还可以被访问到。 Read more »