Redis的Module

Redismodule 是 Redis 4.0 加入的。Redis modules 可以使用外部模块扩展 Redis 功能,并以与内核本身内部功能类似的速度快速实现新的 Redis 命令。

Redis 模块系统是动态库,可以在 Redis 启动或者使用MODULE LOAD命令时加载到 Redis 中。Redis 以单个 叫redismodule.h的C 头文件开放 C API,模块系统使用 C 语言编写,但是可以使用 C++ 或者其他具有绑定 C 功能的语言。

一个较为简单的Example

😓大学的C忘的差不多了,还是知识不够牢固。本想按照官网咔咔咔操作一遍,发现始终load不了,有时间要补一补这Mac下这动态链接的知识


小提问:你是否曾想过使用redis的Map结构来节省内存,但是又因为field不能过期而不得不做兼容?

我是有的,网上也有许多文章在节约redis内存的时候建议使用hash代替string,这样可以充分利用map底层的ziplist来达到空间压缩的作用 redis探秘:选择合适的数据结构,减少80%的内存占用,这些点你get到了吗?

可惜Map有个缺点,field没有过期时间

这就有点痛苦了!!!


redis依赖pom文件 redis module_java

本着程序猿的原则(实际上是搬砖找到了 哈哈哈哈哈~),

发现了reids的module,然后同时发现了 TairHash 这个redis的moudle.

它强在实现了field可以过期的方法(果然得跟大佬多学习)

接下来,让我CV一段它的介绍哈

TairHash是基于redis module开发的一种hash数据结构,和redis原生的hash数据结构相比,TairHash不但和原生hash一样具有丰富的数据接口和高性能,还可以为field设置过期时间和版本,这极大的提高了hash数据结构的灵活性,在很多场景下可以大大的简化业务开发。TairHash提供active expire机制,即使field在过期后没有被访问也可以被主动删除,释放内存。

剩下的有中文的介绍,有兴趣可以研究下哈

它有docker的运行方式,懒人福利哇

  1. 执行脚本命令如下:
docker rm -f redismodule
docker run -d -p 6380:6379 --name=redismodule tairmodule/tairhash:latest
  1. 编写代码程序进行验证
package main

import (
   "fmt"
   "github.com/garyburd/redigo/redis"
   "time"
)

var (
   RD = redis.Pool{
      Dial: func() (conn redis.Conn, err error) {
         conn, err = redis.Dial("tcp", "127.0.0.1:6380")
         return
      }}
)

func main() {
   //1.获取redis的链接
   conn := RD.Get()
   defer conn.Close()
   //2.存储到redis中,结果为 [1 <nil>]
   reply, err := conn.Do("EXHSET", "key", "field", "value", "ex", "10")
   fmt.Println(reply,err)
   //3.从redis中获取数据,结果为 [value <nil>]
   reply, err = conn.Do("EXHGET", "key", "field")
   fmt.Println(redis.String(reply,err))
   //4.简单睡10s,看还能否取到值
   time.Sleep(10*time.Second)
   //5.再次从redis中获取数据,结果为 [ redigo: nil returned]
   reply, err = conn.Do("EXHGET", "key", "field")
   fmt.Println(redis.String(reply,err))
}

感兴趣的可以亲自试试,先不考虑其性能的情况下,该设计还是十分方便的。

参考文章: