redis-01-简介
01.Redis 简介Redis 是一个高性能的 key/value 数据库。它是完全开源免费的,并且遵守 BSD 协议。
Redis 特点
不仅支持 key/value 类型的数据,也支持 list,hash,set,zset 等等数据结构。
支持持久化,可以把内存数据保存到磁盘上,重启后再次加载到内存中使用。
支持备份,可以使用主/从模式进行数据备份。
Redis 优势
数据类型丰富 : Redis 支持 Strings, Lists, Hash, Set 及 Ordered Sets 数据类型操作。
高性能 : Redis 能读的速度是 110000 次/s ,写的速度是 81000 次/s。
原子型操作 : Redis 的所有操作都是原子性的,还支持对几个操作完成后的原子性执行。
丰富的特性 : Redis 支持 publish/subscribe, 通知, key 过期等等特性。
Redis 安装使用 docker 安装和启动 redis,我们创建 docker-compose.yml
12345678910s ...
if let 和 while let
if let在一些场合下,用 match 匹配枚举类型并不优雅。if let 在这样的场合要简洁得多,并且允许指明数种失败情形下的选项:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 let s = Some("从0到Go语言微服务架构师"); let s1: Option<i32> = None; let s2: Option<i32> = None; // 如果 `let` 将 `s` 解构成 `Some(i)`,则执行语句块(`{}`) if let Some(i) = s { println!("已上车 {:?}!", i); } // 如果要指明失败情形,就使用 else: if let Some(i) = s1 { pr ...
rust-match匹配
match 匹配Rust 通过 match 关键字来提供模式匹配,和 C 语言的 switch 用法类似。第一个匹配分支会被比对,并且所有可能的值都必须被覆盖。
解构枚举见 22 小节内容
解构指针和引用对指针来说,解构(destructure)和解引用(dereference)要区分开,因为这两者的概念是不同的,和 C 那样的语言用法不一样。
解引用使用 *
解构使用 &、ref、和 ref mut
1234567891011121314151617181920212223242526272829303132333435363738// 获得一个 `i32` 类型的引用。`&` 表示取引用。 let num = &100; match num { // 用 `&val` 这个模式去匹配 `num` &val => println!("&val 是: {:?}", val), } // 如果不想用 `&`,需要 ...
rust-类型转换
类型转换Rust 使用 trait 解决类型之间的转换问题。最一般的转换会用到 From 和 Into 两个 trait。
From 和 IntoFrom 和 Into 两个 trait 是内部相关联的,实际上这是它们实现的一部分。如果我们能够从类型 B 得到类型 A,那么很容易相信我们也能把类型 B 转换为类型 A。
FromFrom trait 允许一种类型定义 “怎么根据另一种类型生成自己”,因此它提供了一种类型转换的简单机制。在标准库中有无数 From 的实现,规定原生类型及其他常见类型的转换功能。
123456789101112131415161718 let s1 = "从0到Go语言微服务架构师"; let s2 = String::from(s1);#[derive(Debug)]struct MyNumber { num: i32,}impl From<i32> for MyNumber { fn from(item: i32) -> Self { My ...
rust-类型系统
类型系统类型转换Rust 不提供原生类型之间的隐式类型转换,但可以使用 as 关键字进行显式类型转换。整型之间的转换大体遵循 C 语言的惯例,除了 C 会产生未定义行为的情形。在 Rust 中所 有整型转换都是定义良好的。
12345678let spend = 1;// 错误!不提供隐式转换// error[E0308]: mismatched types// let cost: f64 = spend;// 可以显式转换let cost = spend as f64;println!("转换: {} -> {}", spend, cost);
字面量对数值字面量,只要把类型作为后缀加上去,就完成了类型说明。比如指定字面量 42 的 类型是 i32,只需要写 42i32。
无后缀的数值字面量,其类型取决于怎样使用它们。如果没有限制,编译器会对整数使用 i32,对浮点数使用 f64。
12345678// 带后缀的字面量,其类型在初始化时已经知道了。 let x = 1u8; let y = 2u32; let z = ...
rust-变量绑定
变量绑定变量绑定默认是不可变的(immutable),但加上 mut 修饰语后变量就可以改变。
作用域和遮蔽变量绑定有一个作用域(scope),它被限定只在一个代码块(block)中生存(live)。 代码块是一个被 {} 包围的语句集合。另外也允许变量遮蔽(variable shadowing)。
1234567891011121314151617181920212223242526// 此绑定生存于 main 函数中let spend = 1;// 这是一个代码块,比 main 函数拥有更小的作用域{ // 此绑定只存在于本代码块 let target = "面向加薪学习"; println!("inner short: {}", target); // 此绑定*遮蔽*了外面的绑定 let spend = 2.0; println!("inner long: {}", spend);}// 代码块结束// 报错!`target` ...
Go语言-Gin参数获取总结
Gin-参数获取总结Path 参数1234567891011121314151617181920func main() { router := gin.Default() //可以匹配/user/john, 但是不能匹配 /user/ or /user router.GET("/user/:name", func(c *gin.Context) { name := c.Param("name") c.String(http.StatusOK, "Hello %s", name) }) //可以匹配/user/john/ 和 /user/john/send //如果没有匹配到 /user/john, 将重定向到 /user/john/ router.GET("/user/:name/*action", func(c *gin.Context) { name := c.Param(&quo ...
rust-模块
33.模块(Modules)我们常说 功能模块,就是用于将函数或结构体按照功能分组。也常常把相似的函数或者实现相同功能的或者共同实现一个功能的函数和结构体划分到一个模块中。
Rust 中的模块,类似 C++ 中的命名空间,Java 语言中的包。
在代码组织上,比模块更高级的是 crate ,一个crate 可以存放多个模块,在 Rust 语言中crate 是基本编译单元,分为 可执行二进制文件(包含 main 函数作为程序入口) 或者 一个库。
crates.io 是 Rust 官方提供的第三方包的地址。可以使用 cargo install 命令从 crates.io 上下载你所需要的 crate。
定义模块12345mod module_name { fn function_name() { // 具体的函数逻辑 }}
module_name 要是一个合法的名称。
Rust 语言中的模块默认是私有的。
如果一个模块或者模块内的函数需要导出为外部使用,则需要添加 pub 关键字。
私有的模块不能为外部其它模块或程序所调 ...
rust-包管理
32.包管理(Cargo)Rust 内置了一个包管理器 cargo和 Rust 自带安装的,它也可以管理项目。
查看 cargo 版本1cargo --version
命令行输出
1cargo 1.59.0
查看 Cargo 命令列表1cargo --list
命令行输出结果如下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445Installed Commands: b alias: build bench Execute all benchmarks of a local package build Compile a local package and all of its dependencies c alias: check check Check a local ...
rust-智能指针
31.智能指针Rust 可以在 堆 上存储数据。Rust 语言中的某些类型,如 向量 Vector 和 字符串对象 String 默认就是把数据存储在 堆 上的。
Rust 语言把指针封装在如下两个特质Trait中。
特质名
包
Description
Deref
std::ops::Deref
用于创建一个只读智能指针,例如 *v
Drop
std::ops::Drop
智能指针超出它的作用域范围时会回调该特质的 drop() 方法。 类似于其它语言的 析构函数。
当一个结构体实现了以上的接口后,它们就不再是普通的结构体了。
Rust 提供了在 堆 上存储数据的能力并把这个能力封装到了 Box 中。
这种把 栈 上数据搬到 堆 上的能力,我们称之为 装箱。
Box 指针Box 指针可以把数据存储在堆(heap)上,而不是栈(stack)上。这就是装箱(box),栈(stack)还是包含指向 堆(heap) 上数据的指针。
12345fn main() { let a = 6; // 默认保存在 栈 上 let b = Bo ...