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