事务
redis 中和事务相关的命令有四个:MULTI EXEC DISCARD WATCH,MULTI 用于开始一个事务,EXEC 用于提交事务,DISCARD WATCH 可以为事务提供乐观锁(后面会讲具体使用)。
事务的流程:客户端连接服务器,MULTI 命令开启一个事务,然后客户端可以向服务器发送任意多条命令,但是命令不会立即执行,直到我们发送EXEC命令,所有命令才会根据发送的顺序依次执行。当我们在执行EXEC之前如果想要停止事务可以通过发送DISCARD来终止事务。
redis 事务有如下特性:
事务是一个隔离操作,事务中的命令会按顺序执行,事务执行过程中不会被其他客户端打断。
redis 是内存性 key-value 数据库,所以 redis 的存储数据的大小受内存的限制,redis 默认是不会删除 key 的(过期的可以除外),当内存使用完的时候,新的写入操作就会返回错误。但是 redis 支持配置回收策略来实现数据过期,Redis 只支持 LRU 回收算法(memcache也是默认算法)。
maxmemory
maxmemory 用来配置 Redis 存储数据的内存大小限制,如果我们要使用 redis 实现 LRU 算法,并限制数据的多少可以通过这个配置来实现。
示例
maxmemory 1g # 限制 1G 内存大小
设置maxmemory为0代表没有内存限
redis 的 string 类型是支持过期设置的,默认是永不过期的。
Redis 设置过期
redis 中设置设置 key 过期有3中方式
第一种在设置值的时候指定过期时间
Set 命令格式
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。
PX millisecond :设置键的过期时间为 millisecond 毫秒。 3. SET key value PX m
information_schema
MySQL 自带一个数据库 information_schema ,这个数据库用于记录 MySQL 数据库的基本信息,比如数据库名,数据库的表,表栏的数据类型与访问权限等。
mysql> use information_schema;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
Go 语言的可移植性
Java 平台可移植性是众所都知的,Java 的可移植性依赖于其虚拟机 JVM,Java 实现了对不同平台的 JVM 的支持,那么一份 Java 代码就可以在各个平台上运行。而 Go 语言的可移植性也是依赖于其 runtime,runtime 去对接操作系统层,用户代码在 runtime 中运行,用户代码就不用去关心平台问题。
查看 Go 支持的OS和平台:
> $ go version
go version go1.11 darwin/amd64
liushuai@liushuaideMacBook-Pro ~/Documents/goProject/src
我们写一个关于系统信号量的程序并用 go run 调试。
测试代码如下:
package main
import (
"os"
"os/signal"
"fmt"
"syscall"
)
func main() {
sig := make(chan os.Signal)
signal.Notify(sig, syscall.SIGUSR2)
for {
select {
case s := <-sig:
fmt.Println(s.String())
}
我们经常需要让主 goroutine 处于永久阻塞状态,这样其他的 gorotine 就可以一直运行处理信息。下面我总结了几种可以实现永久阻塞的方法,其中大部分实例代码无法直接运行,因为 Go runtime 会检查所有 goroutine 并提示所有的 goroutine 都处于 deadlock,在实际使用中,我们添加具体的业务 goroutien 就可以运行了。
死循环
说到永久阻塞第一个想到的应该就是死循环。
package main
func main() {
for {}
}
死循环虽然可以实现永久阻塞,但是对于 Go 而言,for 死循环所在的 goroutine 还是
webcron
源码地址
功能列表
基本任务创建、启动、手动执行、暂停
任务日志
任务执行结果邮件通知
任务分组
任务运行实例控制
缺点
任务只能在单机跑
不能添加用户
评价
安装部署简单,功能页面简洁,适合任务量不多个人或者小型项目组使用。
gocron
源码地址
功能列表
基本任务创建、手动执行、禁止执行、删除
任务依赖
任务分组
超时、重试
可以选择任务执行结果通知不同用户,通知类型包括邮件(并支持模板配置)、slack、webhook。
任务日志
支持分布式,添加执行任务节点,创建任务可指定任务可运行的节点(如果是单例模式,会选择一台执行)
用户管理
登录日志
执行方式支持
Hello world
Go 标注库 net/http 中封装了丰富的 http 服务相关的方法,只需要使用标准库就可以方便的构建 http 服务。
Hello world 示例
package main
import (
"net/http"
"fmt"
)
type Handler struct {
}
func (h *Handler)ServeHTTP(rep http.ResponseWriter, req *http.Request) {
rep.Write([]byte("Hello world"))
}
func main() {
ht
InnoDB MyISAM都是使用B-tree索引,只是两者实现方式不太一样,InnoDB 使用了聚簇索引的数据结构也称为B+tree,而MyISAM并没有。
explain 返回的 Extra 中包含 Using index 即表示使用索引覆盖查询(InnoDb、MyISAM都存在)。
explain 放回的 Extra 中包含 Using where是即表明在存储引擎把数据返回给 MySQL 服务器后再应用 Where 里的条件过滤行。这样就会导致存储引擎返回的数据比实际需要的多,就会导致额外的行被锁。
InnoDB索引中,覆盖查询要考虑主键的情况,即使索引中不包含主键,而查询包含索引中