golang-redis之list类型简单操作

本文介绍使用Go语言通过redigo库连接Redis,并演示了List类型的常见操作,包括lpush、rpush、llen、lrange等命令的具体应用及示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:安装redigo

go get github.com/garyburd/redigo/redis

2:连接redis(通过ip端口)

import (
    "github.com/garyburd/redigo/redis"
)
c, err := redis.Dial("tcp", "192.168.2.225:6379")
if err != nil {
    fmt.Println("connect to redis err", err.Error())
    return
}
defer c.Close()

3:命令执行

n,err := c.Do("lpush","key","value")  //写
result,err := redis.Values(c.Do("lpop","key"))//读

4:list类型常见操作

rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中startend之间的元素
ltrim(key, start, end):截取名称为key的list
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值
lrem(key, count, value):删除countkey的list中值为value的元素
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

5:示例
5.1:lpush示例

_,err = c.Do("lpush","mylist","ofo","mobike","foo")
if err != nil   {
    fmt.Println("redis lpush failed",err.Error())
}

5.2:rpush示例

_,err = c.Do("rpush","mylist","bluegogo","xiaolan","xiaoming")
if err != nil{
    fmt.Println("redis rpush failed",err.Error())
}

5.3:llen示例

num,err := c.Do("llen","mylist")
if err != nil{
    fmt.Println("mylist get len err",err.Error())
}else{
    fmt.Println("mylist's len is ",num)
}

5.4:lrange示例

values,err := redis.Values(c.Do("lrange","mylist",0,10))
if err != nil{
    fmt.Println("lrange err",err.Error())
}
fmt.Printf("mylist is:")
for _,v := range values{
    fmt.Printf(" %s ",v.([]byte))
}
fmt.Println()

5.5:ltrim示例

_, err = c.Do("ltrim", "mylist", 0, 4)
if err != nil {
    fmt.Println("ltrim error", err.Error())
} else {
    values, err = redis.Values(c.Do("lrange", "mylist", 0, 4))
    if err != nil {
        fmt.Println("ltrim failed:", err.Error())
    }
    fmt.Printf("ltrim mylist is:")
    for _, v := range values {
        fmt.Printf("%s ", v.([]byte))
    }
    fmt.Printf("\n")
}

5.6:lindex示例

val, err := c.Do("lindex", "mylist", 2)
if err != nil {
    fmt.Println("lindex error:", err.Error())
} else {
    fmt.Printf("lindex get result :%s\n", val)
}

5.7:rpoplpush示例

_, err = c.Do("rpoplpush", "mylist", "mybike")
if err != nil {
    fmt.Println("rpoplpush failed:", err.Error())
} else {
    values, err = redis.Values(c.Do("lrange", "mylist", 0, 10))
    if err != nil {
        fmt.Println("lrange failed:", err.Error())
    }
    for _, v := range values {
        fmt.Printf("rpoplpush %s\n", v.([]byte))
    }

    values, err = redis.Values(c.Do("lrange", "mybike", 0, 10))
    if err != nil {
        fmt.Println("lrange failed:", err.Error())
    }
    for _, v := range values {
        //fmt.Println(string(v.([]byte)))
        fmt.Printf("rpoplpush %s\n", v.([]byte))
    }
}

5.8:lset示例

_, err = c.Do("lset", "mylist", 2, "mysql")
if err != nil {
    fmt.Println("lset error:", err.Error())
}
val, err = c.Do("lindex", "mylist", 2)
if err != nil {
    fmt.Println("lset error:", err.Error())
} else {
    fmt.Printf("lset get result:%s\n", val)
}

5.9:lrem示例

_, err = c.Do("lrem", "mylist", 1, "mysql")
if err != nil {
    fmt.Println("lrem error", err.Error())
} else {
    values, err = redis.Values(c.Do("lrange", "mylist", 0, 10))
    if err != nil {
        fmt.Println("ltrim failed:", err.Error())
    }
    for _, v := range values {
        fmt.Printf("lrem mylist: %s", v.([]byte))
    }
    fmt.Printf("\n")
}

5.10:lpop示例

_, err = c.Do("lpop", "mylist")
if err != nil {
    fmt.Println("lpop failed:", err.Error())
} else {
    values, err = redis.Values(c.Do("lrange", "mylist", 0, 10))
    if err != nil {
        fmt.Println("lpop failed:", err.Error())
    }
    fmt.Printf("lpop mylist :")
    for _, v := range values {
        fmt.Printf("lpop mylist %s", v.([]byte))
    }
    fmt.Printf("\n")
}

5.11:rpop示例

_, err = c.Do("rpop", "mylist")
if err != nil {
    fmt.Println("rpop failed", err.Error())
} else {
    values, err = redis.Values(c.Do("lrange", "mylist", 0, 10))
    if err != nil {
        fmt.Println("rpop failed:", err.Error())
    }
    fmt.Printf("rpop mylist :")
    for _, v := range values {
        //fmt.Println(string(v.([]byte)))
        fmt.Printf("lpop mylist %s", v.([]byte))
    }
    fmt.Printf("\n")
}

5.12:blpop示例

res, err := c.Do("blpop", "mylist", 10)
if err != nil {
    fmt.Println("blpop error")
} else {
    fmt.Printf("blpop from mylist get:%s\n", res)
}

res, err = c.Do("blpop", "tmpbike", 10)
if err != nil {
    fmt.Println("blpop time out")
} else {
    fmt.Println("blpop from tmpbike get:", res)
}

5.13:brpop示例

res, err = c.Do("brpop", "tmpbike", 10)
if err != nil {
    fmt.Println("brpop error")
} else {
    fmt.Printf("brpop from tmpbike get :%s\n", res)
}

res, err = c.Do("brpop", "mybike", 10)
if err != nil {
    fmt.Println("brpop time out")
} else {
    fmt.Printf("brpop from mybike get:%s ", res)

}

6:结果
这里写图片描述

完整代码路径

### Golang 使用 Redis ZSet 实现排行榜 为了实现基于 Redis 的 `ZSet` 排行榜功能,在 Go 中通常借助于第三方库来简化与 Redis 数据库之间的交互。对于此目的,推荐使用 `go-redis/redis` 库[^1]。 下面是一个简单的例子,展示了如何初始化客户端连接到 Redis 并执行基本的 `ZSet` 操作: ```go package main import ( "fmt" "log" "github.com/go-redis/redis/v8" "context" ) var ctx = context.Background() func initRedis() *redis.Client { rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", // Redis服务器地址 Password: "", // 密码,默认为空字符串表示无密码认证 DB: 0, // 默认数据库编号为0 }) return rdb } // 添加成员至ZSet func addToLeaderboard(rdb *redis.Client, key string, member string, score float64) error { err := rdb.ZAdd(ctx, key, &redis.Z{Member: member, Score: score}).Err() if err != nil { return fmt.Errorf("failed to add %s with score %.2f into leaderboard '%s': %v", member, score, key, err) } return nil } // 获取指定范围内的排名列表 func getRankingList(rdb *redis.Client, key string, start int64, stop int64) ([]string, error) { result, err := rdb.ZRevRangeWithScores(ctx, key, start, stop).Result() if err != nil { return nil, fmt.Errorf("failed to fetch ranking list from leaderboard '%s': %v", key, err) } var rankings []string for i, item := range result { rankings = append(rankings, fmt.Sprintf("%d. %s (Score:%.2f)", i+start+1, item.Member, item.Score)) } return rankings, nil } func main() { client := initRedis() defer func(client *redis.Client) { err := client.Close() if err != nil { log.Fatal(err) } }(client) leaderBoardKey := "my_leader_board" // 向排行榜中添加几个条目作为示例 addToLeaderboard(client, leaderBoardKey, "Alice", 95.5) addToLeaderboard(client, leaderBoardKey, "Bob", 88.0) addToLeaderboard(client, leaderBoardKey, "Charlie", 92.3) // 查询前两名的成绩 topTwo, _ := getRankingList(client, leaderBoardKey, 0, 1) fmt.Println(topTwo...) } ``` 上述代码片段实现了两个主要的功能函数:一个是用于向给定键名对应的 `ZSet` 结构里增加新成员及其评分;另一个则是获取特定范围内按照评分降序排列后的成员名单。此外还提供了一个简单的入口程序来进行测试验证。 #### 关于性能优化和实际应用中的注意事项 当涉及到高频率更新或查询操作时,应该考虑到可能存在的热点问题以及网络延迟等因素的影响。因此建议采取诸如批量处理命令、合理设置过期时间等方式提高效率减少资源消耗[^2]。 另外值得注意的是,虽然这里只提供了最基础版本的操作接口,但在真实业务场景下还需要针对具体需求做出适当调整和完善,例如加入错误重试机制、支持分页显示等功能特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值