Redis 事务
Redis 事务 Redis 仅支持“非严格”的事务。所谓“非严格”是指:Redis 事务保证“全部执行命令”;但是,Redis 事务“不支持回滚”。 关键词:事务、ACID、MULTI、EXEC、DISCARD、WATCH Redis 事务简介什么是 ACIDACID 是数据库事务正确执行的四个基本要素。 原子性(Atomicity) 事务被视为不可分割的最小单元,事务中的所有操作要么全部提交成功,要么全部失败回滚。 回滚可以用日志来实现,日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。 一致性(Consistency) 数据库在事务执行前后都保持一致性状态。 在一致性状态下,所有事务对一个数据的读取结果都是相同的。 隔离性(Isolation) 一个事务所做的修改在最终提交以前,对其它事务是不可见的。 持久性(Durability) 一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。 可以通过数据库备份和恢复来实现,在系统发生奔溃时,使用备份的数据库进行数据恢复。 一个支持事务(Transa...
Redis 脚本
Redis 脚本 Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。 关键词:Lua 为什么使用 LuaLua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 在 Redis 中,执行单一命令是原子性操作,所以不会出现并发问题。但有的业务场景下,需要执行多个命令,同时确保不出现并发问题,这就需要用到 Lua 脚本了。 Redis 执行 Lua 是原子操作。因为 Redis 使用串行化的方式来执行 Redis 命令, 所以在任何特定时间里, 最多都只会有一个脚本能够被放进 Lua 环境里面运行, 因此, 整个 Redis 服务器只需要创建一个 Lua 环境即可。 由于,Redis 执行 Lua 具有原子性,所以常被用于需要原子性执行多命令的场景。 Redis 脚本命令 命令 说明 EVAL EVAL 命令为客户端输入的脚本在 Lua 环境中定义一个函数, 并通过调用这个函数来执行脚本。 EVALSHA EVALSHA 命令...
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...
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: "张三", ...
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 和相...
SpringBoot 之 Profile
SpringBoot 之 Profile 一个应用为了在不同的环境下工作,常常会有不同的配置,代码逻辑处理。Spring Boot 对此提供了简便的支持。 关键词: @Profile、spring.profiles.active 区分环境的配置properties 配置假设,一个应用的工作环境有:dev、test、prod 那么,我们可以添加 4 个配置文件: applcation.properties - 公共配置 application-dev.properties - 开发环境配置 application-test.properties - 测试环境配置 application-prod.properties - 生产环境配置 在 applcation.properties 文件中可以通过以下配置来激活 profile: 1spring.profiles.active = test yml 配置与 properties 文件类似,我们也可以添加 4 个配置文件: applcation.yml - 公共配置 application-dev.yml - 开发环境配置 ...