【Redis】使用Go语言实现快速调用KVS【Redigo】
首先
由于Go语言的ORM正在逐渐发展,所以下一步我打算尝试使用Go语言来操作键值存储(KVS)Redis。
偶尔由于数据库调用的缓慢成为瓶颈。通过引入键值存储(KVS)解决这个问题!就是这种感觉。
实践!!)
环境
-
- golang ver1.4.2
-
- Redis ver3.2.4
- EC2
在EC2上安装
我将在EC2上安装Redis。
安装
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo yum --enablerepo=remi install redis
启动服务器
$ sudo service redis start
应该已经启动了服务器、、、
您可以使用以下命令进行交互式确认。
$ redis-cli
如果能够正常启动的话,
$ 127.0.0.1/6379>
在上方的图像中表示。
$ 127.0.0.1/6379> get "hoge"
<nil>
给我一个叫”hoge”的键的值!这样说。
当然,因为没有记忆,所以会返回nil。
所以,
$ 127.0.0.1/6379> set "hoge" "bell"
OK
$ 127.0.0.1:6379> get "hoge"
"bell"
使用set指令,将”bell”作为值存储到键”hoge”中。
再次使用get指令,调用键”hoge”的值时,返回了之前存储的”bell”。
这样,Redis在EC2上的安装就完成了!
接下来,我们将使用Go语言进行操作。
用Go语言实现Redis,使用Redigo。
必要的软件包 de
github.com/garyburd/redigo/redis – 就只有这个(笑)
请前往GitHub网址github.com/garyburd/redigo/redis。
与Redis的连接
首先,我们要连接到在EC2上安装的Redis。
func redis_connection() redis.Conn {
const IP_PORT = "52.###.55.###:6379"
//redisに接続
c, err := redis.Dial("tcp", IP_PORT)
if err != nil {
panic(err)
}
return c
}
连接需要以下要素。
-
- プロトコル:tcp
-
- IPアドレス:52.###.55.###
- ポート番号:6379(デフォルト設定)
IP地址应该是安装了Redis的服务器的IP地址,端口号应该是默认设置的6379。
如果连接已建立,err应返回nil。相反,如果连接未建立,则不会返回nil,而是在错误检测部分会出现错误。
顺便说一下,redis.Conn指定了返回值的类型,表示与Redis连接的c数据类型。
设置和获取
在建立连接之后,我们将实现将值存入和取出的操作。这与上述通过命令进行的交互几乎相同。
func redis_set(key string, value string, c redis.Conn){
c.Do("SET", key, value)
}
首先是SET操作,它用于将键和值存储在Redis中。
正如你所见,需要使用连接c的Do函数。
接下来是GET操作。
func redis_get(key string, c redis.Conn) string{
s, err := redis.String(c.Do("GET", key))
if err != nil {
fmt.Println(err)
os.Exit(1)
}
return s
}
使用第一个参数传递”GET”,并传递要提取值的键。
通过redis.String()将其转换为字符串类型。
如果您能够熟练掌握这两个,我认为您对基本的Redis操作应该没有问题。
我附上以下的示例代码。
package main
import (
"github.com/garyburd/redigo/redis"
"fmt"
"os"
)
func redis_set(key string, value string, c redis.Conn){
c.Do("SET", key, value)
}
func redis_get(key string, c redis.Conn) string{
s, err := redis.String(c.Do("GET", key))
if err != nil {
fmt.Println(err)
os.Exit(1)
}
return s
}
func redis_connection() redis.Conn {
const IP_PORT = "52.###.55.###:6379"
//redisに接続
c, err := redis.Dial("tcp", IP_PORT)
if err != nil {
panic(err)
}
return c
}
func main() {
c := redis_connection()
defer c.Close()
var key = "KEY"
var val = "VALUE"
redis_set(key, val, c)
s := redis_get(key, c)
fmt.Println(s)
}
在Redis中查询
用命令行
钥匙*
试着通过运行go-redis.go文件,可以确认所有的键和对应的值。
跑go-redis.go文件
执行后再次确认一下key,发现
如果尝试GET,会得到已经SET的New_KEY。
新的数值已经被取出。
顺便提一句,由于它是一个键值存储系统,所以更新值只需对相同的键进行SET操作进行覆写。
当然,不允许在Redis中重复注册相同的键。
我有疑問。
这里有一个问题。当想要为一个KEY提供多个元素时应该怎么办呢?
如果无法重复注册Key的话,那只能放弃了吗?
所以我查了一下。
这和Redis本身的原理有关,根据存储数据的结构不同,注册的命令也不同。
将Value设为List类型,并进行SET操作,但取出时发现每个字符串都被转换为数字。
Redis希望将多个Value塞入一个Key中进行注册。
将多个Value填充到一个Key的命令是RPUSH。
当执行此命令时,会将值装入NewListKey中。
取出时使用的命令不是GET而是LRANGE。在此过程中,需要指定Key和取出的范围。
第三个参数表示取出的起始索引,第四个参数表示取出的结束索引。若指定为-1,则表示取出所有的值。
将此用Golang编写为以下内容。
package main
import (
"github.com/garyburd/redigo/redis"
"fmt"
"os"
_ "reflect"
)
func redisSet(key string, value string, c redis.Conn){
c.Do("SET", key, value)
}
func redisSetList(key string, value []string, c redis.Conn){
for _ , v := range value {
fmt.Println(v)
c.Do("RPUSH", key, v)
}
}
func redisGet(key string, c redis.Conn) string{
s, err := redis.String(c.Do("GET", key))
if err != nil {
fmt.Println(err)
os.Exit(1)
}
return s
}
func redisGetList(key string, c redis.Conn) []string{
s, err := redis.Strings(c.Do("LRANGE", key, 0, -1))
if err != nil {
fmt.Println(err)
os.Exit(1)
}
return s
}
func redisConnection() redis.Conn {
const IP_PORT = "52.###.55.###:6379"
//redisに接続
c, err := redis.Dial("tcp", IP_PORT)
if err != nil {
panic(err)
}
return c
}
func main() {
c := redisConnection()
defer c.Close()
var key = "New_KEY"
var val = "Re_VALUE"
redisSet(key, val, c)
s := redisGet(key, c)
fmt.Println(s)
key = "List"
var vallist = []string{"redis", "cash", "kvs"}
redisSetList(key, vallist, c)
sl := redisGetList(key, c)
fmt.Println(sl)
fmt.Println(sl[0])
fmt.Println(sl[1])
fmt.Println(sl[2])
}
执行结果如下。
通过这种方法,我们可以把多个元素装入一个键中并且取出来!
以上是实践部分的结束。
最后
如果能够最低限度地进行GET和SET,就可以实现对值的快速调用。
接下来,我想将其集成到应用程序中,以确认其效果。
如果对Go这方面有一点点帮助的话,我会非常高兴。
以下是参考:
Redis的数据类型
github.com/garyburd/redigo/tree/master/redis的数据类型