在java语言中,我们遇到错误的话会涉及到使用try-catch-finally这样子的操作,例如我们在使用redis的时候,我们使用redis的连接池,那么在return或者报错的处理的时候,我们需要涉及到把redis的connection还回到连接池里面,所以我们经常会涉及到finally函数里面关闭掉资源,下面列举下java代码使用redis的案例:
package com.test;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.extern.slf4j.Slf4j;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@Slf4j
public class GoodController {
private JedisPool pool;
@PostConstruct
public void init() {
// 连接池配置
JedisPoolConfig poolConfig = new JedisPoolConfig();
// 设置最多连接数为200个
poolConfig.setMaxTotal(200);
// 创建连接池
pool = new JedisPool(poolConfig, "127.0.0.1", 6379);
}
@PreDestroy
public void destory() {
if (null != pool) {
pool.close();
}
}
public Integer getGoodsNum() {
Jedis jedis = null;
try {
// 获取连接对象jedis
jedis = pool.getResource();
return Integer.valueOf(jedis.get("goods_num"));
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
if (null != jedis) {
jedis.close();
}
}
return 0;
}
}从这里我们可以看到在finally里面我们把jedis客户端还回到了redis 连接池里面,这时候不管是发生异常还是在return之前,都会执行这里的jedis.close()代码。
在go语言中,其实我们同样都会遇到这样的问题,如果报错或者如果需要返回,那么我们一定要去释放这里的资源,如果不释放的话,资源会一直被进程给占用着,导致其他线程获取不到这些资源。
那么在go语言中怎么处理这种fanally呢?其实就是这个defer函数,在go语言中,我们在做一些类似错误异常处理或者最后销毁资源的时候,把对应的函数方法使用defer修饰,这样子go语言会自动在最后执行这个对应的函数方法,下面我们列举下使用go语言来处理redis上面这个案例的例子,示例代码如下:
// demo1 project main.go
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func getGoodsNum() {
// 通过go向redis写入数据和读取数据
// 1.连接到redis "3c0bef8420ca0961a74ff1fbe8c66ef4"
conn, err := redis.Dial("tcp", "192.168.31.30:6379", redis.DialPassword("3c0bef8420ca0961a74ff1fbe8c66ef4"))
defer conn.Close() //关闭连接
if err != nil {
fmt.Println("redis connect failed. err = ", err)
return
}
// 2.通过go向redis写入数据
_, err = conn.Do("Set", "goods_num", 1)
if err != nil {
fmt.Println("Set err = ", err)
return
}
// 3.从redis中读取数据
// 由于返回的r是一个interface{},故要转成字符串
r, err := redis.Int(conn.Do("Get", "goods_num"))
if err != nil {
fmt.Println("Get err = ", err)
return
}
fmt.Println("获取goods_num的结果是:", r) //
}
func main() {
getGoodsNum()
}可以看到这里我们在处理redis连接关闭的时候,我们使用defer函数,同时这个defer函数的话和java使用finally不一样,在java中finally是写在方法最后的,在go语言中,一般我们创建完资源之后,立马会直接defer释放资源,这样子做主要是为了避免后面忘记掉释放这里的资源。









还没有评论,来说两句吧...