达梦新云数据库(For Redis)(简称DMNCDB)是一款深度兼容原生Redis的Key-Value缓存数据库,其在并发访问性能上相比原生Redis具有明显优势,可满足业务系统对具有高性能、高可靠性、弹性扩展、数据强一致等特性的Key-Value系统的需求,能够无缝替换原生Redis。
1、Reids介绍
Redis(Remote Dictionary Server )即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。目前,VMware在资助着Redis项目的开发和维护。同时,Redis也已经成为应用最为广泛的缓存数据库。DMNCDB深度兼容原生Redis,因此本文的程序样例可以同时在DMNCDB和Redis上运行。
2、DMNCDB的安装和启动
用户可以在达梦公司官方网站下载安装DMNCDB的试用版。安装完毕后,用户进入安装目录的bin子目录,然后启动dmncdb_redis进程即可。在安装目录中的readme.txt中也有注册服务和启动dmncdb_redis进程的方法,如图2.1所示。
图2.1 DMNCDB安装简要说明
3、DMNCDB的使用
DMNCDB是一款深度兼容Redis的键值型缓存数据库,因此可以通过原生Redis的接口对DMNCDB进行连接和操作。本文将通过Golang语言和开源的连接工具“garyburd/redigo/redis”演示DMNCDB相关功能。
3.1 连接数据库
首先,调用redis.Dail()方法连接数据库,该方法会返回一个连接结构体,这个连接结构体会在后续操作中使用。DMNCDB的默认端口是6379,详细代码如表3.1所示。最终没有打印错误,代表连接成功。
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(c)
}
表3.1 连接到DMNCDB
3.2 数据库读写
3.1节中连接DMNCDB后会返回一个连接结构体,通过调用连接结构体的Do()接口便可以进行增删查等操作。Do()接口通常第一个入参是操作指令,第二个入参是key值,而第三个或更往后的入参则是value的值。本文先演示了最简单的操作方式,通过Do()接口的“Set”操作给key1存储值为556的整数类型数据,之后通过Do()接口的“Get”操作获取数据,并断言为整数类型进行输出。详细代码如表3.2所示,执行结果如图3.3所示。
func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println(err)
return
}
//fmt.Println(c)
_, err = c.Do("Set", "key1", 556) //redis写入数据
if err != nil {
fmt.Println(err)
return
}
r, err := redis.Int(c.Do("Get", "key1")) //类型断言接口
if err != nil {
fmt.Println(err)
}
fmt.Println(r)
}
表3.2 读写DMNCDB
图3.3 查询结果
3.3 哈希表类型的读写
DMNCDB支持和Redis相同的哈希表结构数据的存储和读取。在Do()方法的第一个入参设置为“HMSet”或“HMGet”即可,第二个入参即哈希表的名称,之后入参的奇数列就是哈希表的键,偶数列就是哈希表的值。如下表3.4所示,往名为“user01”的哈希表中插入“name”为“john”,“age”为“18”的数据,并且通过“HMGet”进行获取,执行结果如图3.5所示。
func main(){
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println(err)
return
}
//fmt.Println(c)
//修改为HMSet
_, err = c.Do("HMSet", "user01", "name", "john", "age", 18)
if err != nil {
fmt.Println(err)
return
}
//redis.String 表示为一个组,用于接收多个数据,形式是一个切片
r, err := redis.Strings(c.Do("HMGet", "user01", "name", "age"))
if err != nil {
fmt.Println(err)
return
}
//上面返回的是一个集合,类似于切片,我们通过for-range去遍历切片
for i, v := range r {
fmt.Printf(map的内容为[%d]=%s\n", i, v)
}
}
表3.4 读写哈希表
图3.5 读写哈希表结果
3.4 集合类型的读写
DMNCDB支持和Redis相同的集合类型的数据的存储和读取。在Do()方法的第一个入参设置为“SAdd”或“Smembers”即可,第二个入参即集合的名称。在“SAdd”时第三个以及之后的入参的即为集合的内容。如下表3.6,往名为“user02”的集合中插入一串的数据。之后通过“Smemebers”进行获取,结果如图3.7所示,可以正常获取。
func main(){
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println(err)
return
}
//fmt.Println(c)
// 为set user02添加值
_, err = c.Do("SAdd", "user02", "jeffery", "johnson",”age”,18)
if err != nil {
fmt.Println(err)
}
//名称 字符串
r1, err := redis.String(c.Do("Smembers", "user02"))
if err != nil {
fmt.Println(err)
}
fmt.Printf("user02的name为:%v\n", r1)
//上面返回的是一个集合,类似于切片,我们通过for-range去遍历切片
for i, v := range r {
fmt.Printf("map的内容为[%d]=%s\n", i, v)
}
表3.6 读写集合
图3.7 读写集合结果
3.5 列表类型的读写
DMNCDB支持和Redis相同的列表类型的存储和读取。在Do()方法的第一个入参设置为“LPush”或“RPush”即可往列表的左侧或者右侧添加数据,第二个入参即列表的名称,第三个往后的入参的即为列表需要被添加的值。在Do()方法设置第一个入参为“LRange”或“RRange”时,即可从左侧或者右侧获取列表结果。如下表3.8,往名为“user03”的列表中从右侧插入“johonsn”、“jeffery”和“daniel”的数据。之后通过“LRange”从“user03”的左侧获取2个单位的数据,执行结果如图3.9所示。
func main(){
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println(err)
return
}
//fmt.Println(c)
// 从右侧插入
_, err = c.Do("RPush", "user03", "johnson", "jeffery", "daniel")
if err != nil {
fmt.Println(err)
return
}
r, err := redis.Strings(c.Do("LRange", "user03", 0, 1))
if err != nil {
fmt.Println(err)
return
}
for i, v := range r {
fmt.Printf("user03的数据内容为: %v", r)博
}
}
表3.8 读写列表
图3.9 读写列表结果
4、总结
由本文以上演示内容,展示了达梦缓存数据库DMNCDB是可以深度兼容原生Redis的,希望可以对读者带来帮助。