Redis 数据结构
Redis 数据结构 关键词:对象、SDS、链表、字典、跳表、整数集合、压缩列表 SDSSDS 简介SDS 是 Simple Dynamic String 的缩写,即简单动态字符串。Redis 为 SDS 做了一些优化,以替代 C 字符串来表示字符串内容。此外,SDS 还被 Redis 用作缓冲区(buffer),如:AOF 模块中的 AOF 缓冲区;客户端状态中的输入缓冲区。 SDS 相比 C 字符串,具有以下优势: C 字符串 SDS 获取字符串长度的复杂度为 O(N) 。 获取字符串长度的复杂度为 O(1) 。 API 是不安全的,可能会造成缓冲区溢出。 API 是安全的,不会造成缓冲区溢出。 修改字符串长度 N 次必然需要执行 N 次内存重分配。 修改字符串长度 N 次最多需要执行 N 次内存重分配。 只能保存文本数据。 可以保存文本或者二进制数据。 可以使用所有 <string.h> 库中的函数。 可以使用一部分 <string.h> 库中的函数。 SDS 实现每个 sds.h/sdshdr 结构表示一个 SDS...
深入理解 Java 注解
深入理解 Java 注解 本文内容基于 JDK8。注解是 JDK5 引入的,后续 JDK 版本扩展了一些内容,本文中没有明确指明版本的注解都是 JDK5 就已经支持的注解。 简介注解的形式Java 中,注解是以 @ 字符开始的修饰符。如下: 12@Overridevoid mySuperMethod() { ... } 注解可以包含命名或未命名的属性,并且这些属性有值。 12345@Author( name = "Benjamin Franklin", date = "3/27/2003")class MyClass() { ... } 如果只有一个名为 value 的属性,那么名称可以省略,如: 12@SuppressWarnings("unchecked")void myMethod() { ... } 如果注解没有属性,则称为标记注解。如:@Override。 什么是注解从本质上来说,注解是一种标签,其实质上可以视为一种特殊的注释,如果没有...
Redis 高级数据类型
Redis 高级数据类型 关键词:BitMap、HyperLogLog、Geo、Stream Redis 支持的高级数据类型:BitMap、HyperLogLog、GEO、Stream 使用 Redis ,不仅要了解其数据类型的特性,还需要根据业务场景,灵活的、高效的使用其数据类型来建模。 BitMapBitMap 简介Bitmap,即位图,是一串连续的二进制数组(0 和 1),可以通过偏移量(offset)定位元素。由于 bit 是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。例如在一个系统中,不同的用户使用单调递增的用户 ID 表示。40 亿($$2^{32}$$ = $$410241024*1024$$ ≈ 40 亿)用户只需要 512M 内存就能记住某种状态,例如用户是否已登录。 BitMap 实现实际上,BitMap 不是真实的数据结构,而是针对 String 实现的一组位操作。 由于 STRING 是二进制安全的,并且其最大长度是 512 MB,所以 BitMap 能最大设置 $$2^{32}$$ 个不同的 b...
Redis 基本数据类型
Redis 基本数据类型 关键词:String、Hash、List、Set、Zset Redis 提供了多种数据类型,每种数据类型有丰富的命令支持。 Redis 支持的基本数据类型:STRING、HASH、LIST、SET、ZSET Redis 支持的高级数据类型:BitMap、HyperLogLog、GEO、Stream 使用 Redis ,不仅要了解其数据类型的特性,还需要根据业务场景,灵活的、高效的使用其数据类型来建模。 StringString 简介String 类型是键值对结构。 String 类型是二进制安全的。二进制安全是指,String 类型不仅可以保存文本数据,还可以保存任意格式的二进制数据,如:图片、音频、视频、压缩文件等。 默认情况下,String 类型的值最大可为 512 MB。 String 实现String 类型的底层的数据结构实现主要是 int 和 SDS(简单动态字符串)。 SDS 和我们认识的 C 字符串不太一样,之所以没有使用 C 语言的字符串表示,因为 SDS 相比于 C 的原生字符串: SDS 不仅可以保存文本数据,还可以保存...
redis 学习笔记之快速入门
redis 学习笔记之快速入门初识RedisRedis是一种键值型的NoSql数据库,这里有两个关键字: 键值型 NoSql 其中键值型,是指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符串、数值、甚至json。 认识NosqlNoSql可以翻译做Not Only Sql(不仅仅是SQL),或者是No Sql(非Sql的)数据库。是相对于传统关系型数据库而言,有很大差异的一种特殊的数据库,因此也称之为非关系型数据库。 结构化和非结构化传统关系型数据库是结构化数据,每一张表都有严格的约束信息:字段名、字段数据类型、字段约束等等信息,插入的数据必须遵守这些约束。 而NoSql则对数据库格式没有严格约束,往往形式松散,自由。可以键值型,文档型,图格式。 关联和非关联传统数据库的表与表之间往往存在关联,例如外键。而非关系型数据库不存在关联关系,要维护关系要么靠代码中的业务逻辑,要么靠数据之间的耦合: 123456789101112131415161718{ id: 1, name: "张三", ...
Java 容器之 Map
Java 容器之 MapMap 简介Map 架构 Map 家族主要成员功能如下: Map 是 Map 容器家族的祖先,Map 是一个用于保存键值对(key-value)的接口。Map 中不能包含重复的键;每个键最多只能映射到一个值。 AbstractMap 继承了 Map 的抽象类,它实现了 Map 中的核心 API。其它 Map 的实现类可以通过继承 AbstractMap 来减少重复编码。 SortedMap 继承了 Map 的接口。SortedMap 中的内容是排序的键值对,排序的方法是通过实现比较器(Comparator)完成的。 NavigableMap 继承了 SortedMap 的接口。相比于 SortedMap,NavigableMap 有一系列的“导航”方法;如”获取大于/等于某对象的键值对”、“获取小于/等于某对象的键值对”等等。 HashMap 继承了 AbstractMap,但没实现 NavigableMap 接口。HashMap 的主要作用是储存无序的键值对,而 Hash 也体现了它的查找效率很高。HashMap 是使用最广泛...
Java 容器之 Set
Java 容器之 SetSet 简介 Set 家族成员简介: Set 继承了 Collection 的接口。实际上 Set 就是 Collection,只是行为略有不同:Set 集合不允许有重复元素。 SortedSet 继承了 Set 的接口。SortedSet 中的内容是排序的唯一值,排序的方法是通过比较器(Comparator)。 NavigableSet 继承了 SortedSet 的接口。它提供了丰富的查找方法:如”获取大于/等于某值的元素”、“获取小于/等于某值的元素”等等。 AbstractSet 是一个抽象类,它继承于 AbstractCollection,AbstractCollection 实现了 Set 中的绝大部分方法,为实现 Set 的实例类提供了便利。 HashSet 类依赖于 HashMap,它实际上是通过 HashMap 实现的。HashSet 中的元素是无序的、散列的。 TreeSet 类依赖于 TreeMap,它实际上是通过 TreeMap 实现的。TreeSet 中的元素是有序的,它是按自然排序或者用户指定比较器排...
Mysql 运维
Mysql 运维 如果你的公司有 DBA,那么我恭喜你,你可以无视 Mysql 运维。如果你的公司没有 DBA,那你就好好学两手 Mysql 基本运维操作,行走江湖,防身必备。 安装部署Windows 安装(1)下载 Mysql 5.7 免安装版 下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads (2)解压并创建 my.ini 在根目录 my.ini 文件示例: 123456789101112131415[mysqld]#设置3306端口port = 3306# 设置mysql的安装目录 这块换成自己解压的路径basedir=D:\\Tools\\DB\\mysql\\mysql-5.7.31# 允许最大连接数max_connections=200# 服务端使用的字符集默认为8比特编码的latin1字符集character-set-server=utf8# 创建新表时将使用的默认存储引擎default-storage-engine=INNODB[client]# 设置mysql客户端默认字符集defaul...
Spring Framework 综述
Spring Framework 综述Spring Framework 简介Spring Framework 是最受欢迎的企业级 Java 应用程序开发框架。用于构建企业级应用的轻量级、一站式解决方案。 当谈论到大小和透明度时, Spring 是轻量级的。 Spring 框架的基础版本是在 2 MB 左右的。 Spring 框架的核心特性可以用于开发任何 Java 应用程序,但是在 Java EE 平台上构建 web 应用程序是需要扩展的。 Spring 框架的目标是使 J2EE 开发变得更容易使用,通过启用基于 POJO 编程模型来促进良好的编程实践。 Spring Framework 设计理念如下: 力争让选择无处不在 体现海纳百川的精神 保持后向兼容性 专注 API 设计 追求严苛的代码质量 为什么使用 Spring下面列出的是使用 Spring 框架主要的好处: Spring 可以使开发人员使用 POJOs 开发企业级的应用程序。只使用 POJOs 的好处是你不需要一个 EJB 容器产品,比如一个应用程序服务器,但是你可以选择使用一个健壮的 servlet 容器,比...
SpringBoot 之发送邮件
SpringBoot 之发送邮件简介Spring Boot 收发邮件最简便方式是通过 spring-boot-starter-mail。 1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId></dependency> spring-boot-starter-mail 本质上是使用 JavaMail(javax.mail)。如果想对 JavaMail 有进一步了解,可以参考: JavaMail 使用指南 APISpring Framework 提供了一个使用 JavaMailSender 接口发送电子邮件的简单抽象,这是发送邮件的核心 API。 JavaMailSender 接口提供的 API 如下: 配置Spring Boot 为 JavaMailSender 提供了自动配置以及启动器模块。 如果 spring.mail.host 和相...