陈川的个人专栏

Redis内部数据结构——词典dictType以及哈希算法的选择

词典dict概览提到了使用Hash Table作为Redis 词典的内部实现,需要考虑三个要点。这章讨论第一个问题:Redis哈希算法的选择。哈希是把任意长度的输入通过哈希算法转换为固定长度的值。根据不同的使用场景,人们设计出了多种哈希算法,我们常见的有CRC,MD5,HMAC,SHA-256等等,关于多种哈希算法,可以在查看wiki。Redis作为一个高性能的key-value内存服务器,哈希算
阅读更多

Redis内部数据结构——词典哈希表dictht

这一节主要讨论”如何解决Hash碰撞“的问题,去理解Redis的哈希表dictht。解决Hash冲突方法我们知道,使用哈希函数对输入计算出的哈希值是相同,称为哈希碰撞。发生哈希碰撞通常有以下两种做法处理冲突的存储:链表法开放寻址法链表法链表法是Redis选择解决hash冲突的方法,数据结构为:数组 + 链表。数组的每个位置,称之为桶(bucket)或槽(slot)。当计算的hash值在同一个槽位时
阅读更多

Java初始化静态Map,且不可更改(含Java 9)

Java 9之前Java 9之前需要在static块里初始化静态Map。public class Demo{     private static final Map<Integer, String> myMap;    &nb
阅读更多

Java 10 赋值Arrays.asList给var变量:AssertionError: Unexpected intersection type

体验了下Java 10的局部变量类型推断var。使用List.of()给var赋值。List list1 = Arrays.asList(1, "a",10L); var list2 = list1; 上面通过中间的list1再赋值给var,编译通过。但如果直接使用Arrays.asList()赋值给var,如:var
阅读更多

Redis内部数据结构——dict词典概览

了解词典在了解Redis如何实现dict之前,先梳理下dict特征以及使用。词典数据结构通常用于以键值对的方式存储数据。词典存放了一组键,每个键关联一个值。词典存放的键是唯一的,通过查询词典里的键,可以获取键对应的值。如果存储重复的键,会导致新值覆盖键关联的旧值。词典数据结构支持以下几种操作:addOrUpdate(K key, V v):以键值对的形式插入数据,如果key在词典中存在,会用新值覆
阅读更多

[译]代码优先的Java 9模块系统教程(一)

Java平台模块系统(JPMS)将模块化带入Java和JVM,并改变了我们在大型应用中的编程方式。 为了充分利用它,我们需要很好地了解,第一步是学习基础知识。 在本教程中,我首先向你展示一个简单的Hello World示例,然后我们用Java 9将一个现有的demo程序模块化。我们将创建模块声明(module-info。java),使用模块路径来编译,打包,
阅读更多

Spring JPA报错:InvalidDataAccessResourceUsageException: could not extract ResultSet;

Spring JPA调用时报错InvalidDataAccessResourceUsageException: could not extract ResultSet错误,详细如下:org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nest
阅读更多

Spring JPA报错:InvalidDataAccessApiUsageException: Executing an update/delete query

集成Spring JPA,在执行delete,update时需要添加事务。错误信息:org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredExcepti
阅读更多

Spring JPA报错:Not supported for DML operations

在一个Spring JPA项目中,执行更新或删除是报错:Not supported for DML operations解决方法:只需要添加注解@Modifying即可。@Modifying@Query(value = "update User user set user.address = :address where user.id = :id ")void updateUserAddress
阅读更多

Ubuntu 18.10 LTS上安装JDK 11.0.6

下载JDK首先到Oracle官网下载JDK,JDK 11的下载地址:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html下载的是linux通用版本:jdk-11.0.6_linux-x64_bin.tar.gz,如图: 安装JDK安装压缩包版本的jdk比较简单,创建一个安装路径,然后把压
阅读更多

Java防止非静态内部类内存泄漏

内存泄漏一个不会被使用的对象,因为另一个正在使用的对象持有该对象的引用,导致它不能正常被回收,而停留在堆内存中,从而导致内存泄漏。最坏的情况下,由于大量的内存泄漏,最终导致jvm的内存耗尽,致使程序奔溃。也可能会导致内存空间不足,jvm出现频繁的GC。代码示例import java.util.ArrayList;class OuterClass{ private int[] data; p
阅读更多

查询Redis数据库的数量

redis数据库的数量是固定的,可以在redis.conf查询到redis数据库的数量。使用grep命令:$ cat redis.conf | grep databasesdatabases 16当然,也可以在redis-cli上查询数据库的数量:127.0.0.1:6379> CONFIG GET databases1) "databases"2) "16"使用config get dat
阅读更多

Redis设置key过期以及删除过期key的策略

Redis有以下几个命令用于设置key的过期时间:expire <key> <seconds>:给key设置以秒为单位的过期时间pexpire <key> <milliseconds>:给key设置以毫秒为单位的过期时间expireat <key> <timestamp_in_seconds>:指定一个以秒为单位的时间戳,当到
阅读更多

Java Predicate接口的使用

Java 8新增了Predicate接口,它是一个函数接口,提供的test函数会接收一个参数,并返回一个bool值,我们可以用它来做过滤,检测类等功能。源码说明@FunctionalInterfacepublic interface Predicate<T> { /** * 具体过滤操作 需要被子类实现. * 用来处理参数T是否满足要求,可以理解为 条件A
阅读更多

阿里云ECS默认禁用25端口导致发邮件失败:Couldn't connect to host, port: smtp.example.com

使用JavaMail发送邮件,用的是阿里云的邮件服务。在本地测试是没有问题,但是上传到阿里云的ecs上就报错:MailSendException: Mail server connection failed; nested exception is com.sun.mail.util.MailConnectExcept
阅读更多

Java验证公私密钥对

验证过程:创建一个足够长的随机字节数,称为challenge使用密钥签名challenge使用公钥验证challenge示例代码:KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");  //密钥生成器 keyGen.initialize(2048); Ke
阅读更多

[译]代码优先的Java 9模块系统教程(二)

服务监控(ServiceMonitor)让我们来想象一个提供娱乐服务的网络,可能是社交网络或者是视频网络。我们希望监控这些服务,以确定系统的健康状况,并且在发生问题时能够发现,而不是客户报告。 这就是ServiceMonitor示例程序所要做的:监视这些服务(另一个惊喜)。幸运的是,服务已经收集了我们想要的数据,ServiceMonitor所需要做的就是定期查询。 不幸的是,并
阅读更多
X

欢迎加群学习交流

联系我们