博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go读取超大文件内容并发写入到redis的功能
阅读量:6868 次
发布时间:2019-06-26

本文共 4649 字,大约阅读时间需要 15 分钟。

hot3.png

连接redis使用的github.com/garyburd/redigo/redis 包

redis连接代码如下:  library/redis.go

package libraryimport (        "github.com/garyburd/redigo/redis")//redis配置文件使用map来存储func ConnectRedis(config map[string]string) (redis.Conn, error) {        server := config["host"] + ":" + config["port"]        conn, err := redis.Dial("tcp", server)        if err != nil {                return nil, err        }        if config["auth"] != "" {                if _, err := conn.Do("AUTH", config["auth"]); err != nil {                        conn.Close()                        return nil, err                }        }        return conn, nil}

main.go

package mainimport (    "bufio"    "bytes"    "fmt"    "io"    "library"    "os"    "runtime"    "strings"    "sync"    "time"    "github.com/garyburd/redigo/redis")var wg sync.WaitGrouptype midList struct {    mid []string}//字符串插入到redis中func (i midList) insertMidToRedis() {    redisCon := make(map[string]string)    redisCon["host"] = "10.222.4.221"    redisCon["port"] = "16560"    redisCon["auth"] = "xxxxxxxxxxxxx"    redisCon["prefix"] = "minihelper:dislike:"    //获取redis连接    redisObj, err := library.ConnectRedis(redisCon)    if err != nil {        fmt.Println("connect redis error", err)    }    defer redisObj.Close()    var buf bytes.Buffer    for _, mid := range i.mid {        if length := len(mid); length != 32 {            continue        } else {            //写入set集合            all_mid_set := redisCon["prefix"] + "user_choose:set"            if exists, err := redis.Int(redisObj.Do("SISMEMBER", all_mid_set, mid)); err != nil {                _, _, line, _ := runtime.Caller(0)                fmt.Println("line: ", line, " redis execute SISMEMBER error", err)                break            } else {                if exists == int(0) {                    if _, err := redisObj.Do("SADD", all_mid_set, mid); err != nil {                        _, _, line, _ := runtime.Caller(0)                        fmt.Println("line: ", line, " redis execute SADD error", err)                        fmt.Println("mid is:", mid)                        break                    } else {                        fmt.Println("sadd mid: ", mid, " success")                    }                }            }            //写入string键            buf.Reset()            buf.WriteString(redisCon["prefix"])            buf.WriteString(mid)            mid := buf.String()            if exists, err := redis.Bool(redisObj.Do("EXISTS", mid)); err != nil {                _, _, line, _ := runtime.Caller(0)                fmt.Println("line: ", line, " redis execute exists error", err)                fmt.Println("previous mid is:", mid)                break            } else {                if exists == true {                    continue                } else {                    _, err := redisObj.Do("SET", mid, 1)                    if err != nil {                        _, _, line, _ := runtime.Caller(0)                        fmt.Println("line: ", line, " redis execute set error", err)                        break                    }                    redisObj.Do("EXPIRE", mid, 10*24*3600)                    fmt.Println("insert mid: ", mid, " success")                }            }        }    }    wg.Done()    return}func main() {    fmt.Println("script begin.... ", time.Now().Format("2006-01-02 15:04:05"))    timeObj := time.Now()    yesTime := timeObj.AddDate(0, 0, -1)    yesterday := yesTime.Format("20060102")    mid_file := "/data/dislike/triggerdislike/" + yesterday + "/uniq"    fp, err := os.Open(mid_file)    defer fp.Close()    if err != nil {        fmt.Println(mid_file, err)        return    }    var contents []midList    var content midList    buf := bufio.NewReader(fp)    iterator := 0    for {        line, err := buf.ReadString('\n')        if err != nil {            if err == io.EOF {                //                fmt.Println("meet file ending")            } else {                fmt.Println(err)            }            break        }        iterator++        mid := strings.TrimSpace(line)        //将文件切割成每2000行一份        if iterator <= 2000 {            content.mid = append(content.mid, mid)        } else {            iterator = 1            contents = append(contents, content)            content.mid = nil            content.mid = append(content.mid, mid)        }    }    contents = append(contents, content)    for _, mid_list := range contents {        wg.Add(1)   //这里也可以直接使用chan来完成通信        go mid_list.insertMidToRedis()    }    wg.Wait()    fmt.Println("script end.... ", time.Now().Format("2006-01-02 15:04:05"))}

 

转载于:https://my.oschina.net/u/3470972/blog/1527954

你可能感兴趣的文章
Maven学习总结(六)——Maven与Eclipse整合
查看>>
Java基础学习总结(14)——Java对象的序列化和反序列化
查看>>
vmware中centos6.7系统图形化安装Oracle-无法打开RUNINSTALLER
查看>>
设计模式(十三)——享元模式
查看>>
jQuery零基础开发之富客户端应用
查看>>
linux系统内核UDP丢包原因分析
查看>>
Maven学习总结(七)——eclipse中使用Maven创建Web项目
查看>>
Java Web学习总结(3)——Servlet详解
查看>>
Java基础学习总结(24)——Java单元测试之JUnit4详解
查看>>
Spring学习总结(2)——Spring的常用注解
查看>>
Git使用详细教程
查看>>
临时邮箱
查看>>
开源史上最成功的8个开源产品
查看>>
为vsftpd 本地用户指定目录
查看>>
springboot集成swagger-UI 开发API项目
查看>>
RabbitMQ学习总结(4)——分发任务在多个工作者之间实例教程
查看>>
HPP文件还是CPP文件
查看>>
oracle listener 详解("DEDICATED" established:0 refused:0)
查看>>
回顾 | 开源分布式中间件DBLE社区分享活动总结
查看>>
joomla代码编译入门(创世纪新篇0
查看>>