Redis 介绍
Redis 是一个开源的内存数据库, Redis 提供了 5 种不同类型的数据结构, 很多业务场景下的问题都可以很自然地映射到这些数据结构上. 除此之外, 通过复制, 持久化和客户端分片等特性, 我们可以很方便地将 Redis 扩展成一个能够包含数百 GB 数据, 每秒处理上百万次请求的系统.
Redis 支持的数据结构
Redis 支持诸如字符串(strings), 哈希(hashes), 列表(lists), 集合(sets), 带范围查询的排序集合(sorted sets), 位图(bitmaps),hyperloglogs, 带半径查询和流的地理空间索引等数据结构(geospatial indexes).
Redis 应用场景
缓存系统, 减轻主数据库 (MySQL) 的压力.
计数场景, 比如微博, 抖音中的关注数和粉丝数.
热门排行榜, 需要排序的场景特别适合使用 ZSET.
利用 LIST 可以实现队列的功能.
Redis 与 Memcached 比较
Memcached 中的值只支持简单的字符串, Reids 支持更丰富的 5 中数据结构类型. Redis 的性能比 Memcached 好很多 Redis 支持 RDB 持久化和 AOF 持久化. Redis 支持 master/slave 模式.
- // 声明一个全局的 redisdb 变量
- var redisdb *Redis.Client
- // 初始化连接
- func initClient() (err error) {
- redisdb = Redis.NewClient(&Redis.Options{
- Addr: "localhost:6379",
- Password: "", // no password set
- DB: 0, // use default DB
- })
- _, err = redisdb.Ping().Result()
- if err != nil {
- return err
- }
- return nil
- }
- func redisExample() {
- err := redisdb.Set("score", 100, 0).Err()
- if err != nil {
- fmt.Printf("set score failed, err:%v\n", err)
- return
- }
- val, err := redisdb.Get("score").Result()
- if err != nil {
- fmt.Printf("get score failed, err:%v\n", err)
- return
- }
- fmt.Println("score", val)
- val2, err := redisdb.Get("name").Result()
- if err == Redis.Nil {
- fmt.Println("name does not exist")
- } else if err != nil {
- fmt.Printf("get name failed, err:%v\n", err)
- return
- } else {
- fmt.Println("name", val2)
- }
- }
- func redisExample2() {
- zsetKey := "language_rank"
- languages := []*Redis.Z{
- &Redis.Z{Score: 90.0, Member: "Golang"},
- &Redis.Z{Score: 98.0, Member: "Java"},
- &Redis.Z{Score: 95.0, Member: "Python"},
- &Redis.Z{Score: 97.0, Member: "JavaScript"},
- &Redis.Z{Score: 99.0, Member: "C/C++"},
- }
- // ZADD
- num, err := redisdb.ZAdd(zsetKey, languages...).Result()
- if err != nil {
- fmt.Printf("zadd failed, err:%v\n", err)
- return
- }
- fmt.Printf("zadd %d succ.\n", num)
- // 把 Golang 的分数加 10
- newScore, err := redisdb.ZIncrBy(zsetKey, 10.0, "Golang").Result()
- if err != nil {
- fmt.Printf("zincrby failed, err:%v\n", err)
- return
- }
- fmt.Printf("Golang's score is %f now.\n", newScore)
- // 取分数最高的 3 个
- ret, err := redisdb.ZRevRangeWithScores(zsetKey, 0, 2).Result()
- if err != nil {
- fmt.Printf("zrevrange failed, err:%v\n", err)
- return
- }
- for _, z := range ret {
- fmt.Println(z.Member, z.Score)
- }
- // 取 95~100 分的
- op := &Redis.ZRangeBy{
- Min: "95",
- Max: "100",
- }
- ret, err = redisdb.ZRangeByScoreWithScores(zsetKey, op).Result()
- if err != nil {
- fmt.Printf("zrangebyscore failed, err:%v\n", err)
- return
- }
- for _, z := range ret {
- fmt.Println(z.Member, z.Score)
- }
- }
- $ ./06redis_demo
- zadd 0 succ.
- Golang's score is 100.000000 now.
- Golang 100
- C/C++ 99
- Java 98
- JavaScript 97
- Java 98
- C/C++ 99
- Golang 100
来源: http://www.bubuko.com/infodetail-3110204.html