Skip to main content

· 13 min read

概述#

对 Redis 的印象可能很多人都还只停留在 2.8 的阶段,一个结构化的内存存储(嗯,好像也没什么问题)。虽然距离 4.0 发布(2017.7.14)已经一年过去了,但相信很多人已经不再去关心 Redis 的新特性了,因为从 2.8 后的 Redis 已经足够好用了。😄

Redis 3.0 添加了集群的能力,4.0 添加了模块化能力,5.0 添加了流类型。如果说 3.0 和 4.0 添加的新特性对于一般用户来说无足轻重,那 5.0 新的流类型就不可忽视啦!

在没有 Stream 类型之前,其实 Redis 也支持各种类似于流的处理模式,例如 Fire and forget 模式的 Pub/Sub,阻塞队列 BLPOP,时间序列 zsort 存储,等各种方式都能模拟类似的场景,但却都觉得有点欠缺,终于,流类型成功的解决了以上所有问题,并能支持其他的常见使用场景。

说到流消息就不得不说到 Kafka 啦,我相信大家应该都听说过消息中间件 Kafka,至于 RocketMQ 或者 MetaQ 就不再赘述他们与 Kafka 的关系啦,Redis 作者在实现流类型时大量参考了 Kafka 中的概念,例如消费模型,流消息的概念。当然所有的参考只局限于 Kafka 的文档,与 Kafka 的代码实现没有任何关系哦。

心动不如心动,那先一睹为快吧。

· 11 min read

概述#

Java 11 自 2018.9.25 发布以来,已经好几个月了,在还没正式 GA 之前都习惯性的去 java-countdown.xyz check 发布倒计时。Java 11 有比较多的新功能,而其中最吸引我的

  • Java 11 是 LTS 版本
    • 这意味着体验 Java9 带来的模块特性变得更有意义
  • JavaFX 从 JDK 中移除,作为独立模块

· 13 min read

动态策略#

动态策略概念相对宽泛,在进入正式的内容之前容我先明确题目中动态策略的范畴。

这里的动态策略指,现在以 A 方式来做某件事,在过程中可能被切换为 B 方案,但对上层来说是无感的。策略可以映射为策略模式(Strategy Pattern),例如

· 2 min read

Tips#

初试#

# 生成 libdemo.so libdemo.hgo build -buildmode=c-shared -o libdemo.so ./demo.go# 编译 maingo build main.go./main
# macos - 查看内容nm libdemo.so | grep hello -i# linuxnm libdemo.so# windowsdumpbin /EXPORTS libdemo.dll
# windows 交叉编译 - 需要安装 mingwbrew install mingw-w64
# 32 位 交叉编译GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -buildmode=c-shared -o libdemo.dll ./demo.goGOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build main.go
# macos wine 不支持 32 位 - mingw 版本低不支持 64 位# mac 会出现异常 cc1: sorry, unimplemented: 64-bit mode not compiled in# 通过 docker 编译docker run --rm -v $HOME/go:/root/go -v $PWD:/host -w /host wener/go:win sh
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build -buildmode=c-shared -o libdemo.dll ./demo.goGOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build main.go
# 回到 mac 使用 wine 执行# wine 无法在 macos 上编译安装 - 系统版本问题 - 需要使用 cask 安装brew cask install wine-stablewine64 main.exe
# wine 4.0 初始化 dll 失败# 0010:fixme:winsock:set_dont_fragment IP_DONTFRAGMENT for IPv4 not supported in this platform# 0009:err:module:attach_dlls "libdemo.dll" failed to initialize, aborting# 0009:err:module:attach_dlls Initializing dlls for L"Z:\\Users\\wener\\demo\\main.exe" failed, status c0000005

demo.go

package main
import "C"
//export Versionfunc Version() int32 {    return 123}
//export Hellofunc Hello(name *C.char) *C.char {    return C.CString("Hello "+C.GoString(name)+"!")}
func main() {}

main.go

package main
import "fmt"
/*#cgo CFLAGS: -I.#cgo LDFLAGS: -L. -ldemo#include "libdemo.h"*/import "C"
func main() {    fmt.Printf("Int %v String %v\n",C.Version(), C.GoString(C.Hello(C.CString("Wener"))))}