从零学习redis(11)--- 管道、发布订阅、脚本

管道 redis 是基于客户端-服务端模型以及请求/响应协议的TCP服务。也就是说每次请求都需要建立 TCP 连接并发送命令和接受返回数据。所以当我们有大量的命令需要执行的话那么就需要花费太多的时间在 TCP 连接建立上。 依次 TCP 连接之后可以执行多条命令这样就可以提升命令执行速度,减少不必要的消耗,redis 就是通过支持管道技术来实现的。 管道示例如下: > $ (printf "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379 +PONG +PONG +PONG 发布订阅 发布订阅实现了不同的客户端对不同的频道发送

redis
发布于 5年前

从零学习redis(10)--- 事务

事务 redis 中和事务相关的命令有四个:MULTI EXEC DISCARD WATCH,MULTI 用于开始一个事务,EXEC 用于提交事务,DISCARD WATCH 可以为事务提供乐观锁(后面会讲具体使用)。 事务的流程:客户端连接服务器,MULTI 命令开启一个事务,然后客户端可以向服务器发送任意多条命令,但是命令不会立即执行,直到我们发送EXEC命令,所有命令才会根据发送的顺序依次执行。当我们在执行EXEC之前如果想要停止事务可以通过发送DISCARD来终止事务。 redis 事务有如下特性: 事务是一个隔离操作,事务中的命令会按顺序执行,事务执行过程中不会被其他客户端打断。

redis
发布于 5年前

从零学习redis(9)--- LRU算法缓存

redis 是内存性 key-value 数据库,所以 redis 的存储数据的大小受内存的限制,redis 默认是不会删除 key 的(过期的可以除外),当内存使用完的时候,新的写入操作就会返回错误。但是 redis 支持配置回收策略来实现数据过期,Redis 只支持 LRU 回收算法(memcache也是默认算法)。 maxmemory maxmemory 用来配置 Redis 存储数据的内存大小限制,如果我们要使用 redis 实现 LRU 算法,并限制数据的多少可以通过这个配置来实现。 示例 maxmemory 1g # 限制 1G 内存大小 设置maxmemory为0代表没有内存限

redis
发布于 5年前

从零学习redis(8)--- 过期及过期策略

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

redis
发布于 5年前

查看 MySQL 表的大小

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>

MySQL
发布于 5年前

Golang 本地编译和交叉编译

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
发布于 5年前

go run 调试误区

我们写一个关于系统信号量的程序并用 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()) }

go
发布于 5年前

Go 永久阻塞的方法

我们经常需要让主 goroutine 处于永久阻塞状态,这样其他的 gorotine 就可以一直运行处理信息。下面我总结了几种可以实现永久阻塞的方法,其中大部分实例代码无法直接运行,因为 Go runtime 会检查所有 goroutine 并提示所有的 goroutine 都处于 deadlock,在实际使用中,我们添加具体的业务 goroutien 就可以运行了。 死循环 说到永久阻塞第一个想到的应该就是死循环。 package main func main() { for {} } 死循环虽然可以实现永久阻塞,但是对于 Go 而言,for 死循环所在的 goroutine 还是

go
发布于 5年前

定时任务系统调研

webcron 源码地址 功能列表 基本任务创建、启动、手动执行、暂停 任务日志 任务执行结果邮件通知 任务分组 任务运行实例控制 缺点 任务只能在单机跑 不能添加用户 评价 安装部署简单,功能页面简洁,适合任务量不多个人或者小型项目组使用。 gocron 源码地址 功能列表 基本任务创建、手动执行、禁止执行、删除 任务依赖 任务分组 超时、重试 可以选择任务执行结果通知不同用户,通知类型包括邮件(并支持模板配置)、slack、webhook。 任务日志 支持分布式,添加执行任务节点,创建任务可指定任务可运行的节点(如果是单例模式,会选择一台执行) 用户管理 登录日志 执行方式支持

工具
发布于 5年前

Go语言学习笔记(3)--- http

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

go
发布于 5年前