尝试接触 Redis 的所有数据类型。重新学习 Redis:不仅仅是缓存

Redis に触れたことがある方は多いと思いますが、キャッシュとして使うケースが多いのではないでしょうか?
僕も「スケーリングもできるキャッシュ」くらいな理解でしたが、ランキングなんかにも使えるらしいと聞いており、再入門してみました。

环境搭建、测试数据

我們將使用 Docker 上的官方 Redis 映像檔。

我将按照文件中的说明启动以下操作。

docker run --name some-redis -d redis redis-server --appendonly yes

我会让你能够使用redis-cli。

brew install redis

在中文中导入导出数据

这次我们将忠实地遵循基本原则,使用redis-cli来探索Redis支持的数据结构。

启动 redis-cli。

redis-cli

由于Redis拥有多种数据结构,我们将分别进行讨论。

字词序列

简单地保存键和值。最常见的用途是使用该方法来保存会话ID对应的用户信息。

127.0.0.1:6379> SET user_id1 kaiba
OK
127.0.0.1:6379> get user_id1
"kaiba"
127.0.0.1:6379> SET user_id1 kaibadash
OK
127.0.0.1:6379> get user_id1
"kaibadash"
127.0.0.1:6379> SET user_id2 taro
OK
127.0.0.1:6379> SET user_id3 jiro
OK
127.0.0.1:6379> MGET user_id1 user_id2 user_id3
1) "kaibadash"
2) "taro"
3) "jiro"

可以一口气获取。

清单

这是一个列表。您可以在开头或者末尾进行添加或删除操作。

127.0.0.1:6379> RPUSH members kaiba
(integer) 1
127.0.0.1:6379> RPUSH members taro
(integer) 2
127.0.0.1:6379> RPUSH members jiro
(integer) 3
127.0.0.1:6379> LLEN members
(integer) 3
127.0.0.1:6379> LPOP members
"kaiba"
127.0.0.1:6379> RPOP members
"jiro"

使用这个应该很方便来表示队列结构。使用Sidekiq或Redis应该是您使用的方法。

套装

这是一种无序且不允许重复的数据结构。

127.0.0.1:6379> SADD users kaiba
(integer) 1
127.0.0.1:6379> SADD users taro
(integer) 1
127.0.0.1:6379> SADD users jiro
(integer) 1
127.0.0.1:6379> SADD users kaiba
(integer) 0 # すでにいるので追加されなかった
127.0.0.1:6379> SREM users kaiba
(integer) 1
127.0.0.1:6379> SREM users NONE
(integer) 0
127.0.0.1:6379> SREM users jiro
(integer) 1

也许对于管理Bingo中奖者的目的来说,不计算Double Bingo的人可能是个不错的选择。不了解这一点可能会需要在其他数据结构上花费更多的努力。

已排序的集合

这是根据分数值进行排序的集合。

127.0.0.1:6379> ZADD ranking 80 kaiba
(integer) 1
127.0.0.1:6379> ZADD ranking 100 dekisugi
(integer) 1
127.0.0.1:6379> ZADD ranking 10 nobita
(integer) 1
127.0.0.1:6379> ZRANK ranking nobita
(integer) 0
127.0.0.1:6379> ZRANK ranking kaiba
(integer) 1
127.0.0.1:6379> ZRANK ranking dekisugi
(integer) 2

看起来是按照分数升序排序的。
因为是分数,所以感觉上应该按降序排列…

127.0.0.1:6379> ZREVRANK ranking dekisugi
(integer) 0
127.0.0.1:6379> ZREVRANK ranking nobita
(integer) 2

你还可以按照正确的顺序来取。

127.0.0.1:6379> ZRANGE ranking 0 2
1) "nobita"
2) "kaiba"
3) "dekisugi"
127.0.0.1:6379> ZREVRANGE ranking 0 2
1) "dekisugi"
2) "kaiba"
3) "nobita"

在列表中也可以获取。
这不是排行榜吗…!

哈希

这是一个键值对形式的数据结构。
嗯,实际上 Redis 是一个键值对形式的数据存储系统,可能会让人感到困惑,但是它可以存储以下类型的数据。

{
  "id": 1,
  "name": "kaiba",
  "tweet": "Hello!"
}
127.0.0.1:6379> HSET tweet1 name kaiba
(integer) 1
127.0.0.1:6379> HSET tweet1 id 1
(integer) 1
127.0.0.1:6379> HSET tweet1 tweet Hello!
(integer) 1
127.0.0.1:6379> HGET tweet1 tweet
"Hello!"
127.0.0.1:6379> HGET tweet1 name
"kaiba"

以前,如果想要做这件事,通常需要将其转换为字符串并输入JSON中,但是将其作为键值对对象而不是字符串插入感觉很好。

适合的事情 de

我觉得Redis适合用于以下情况。

    • シンプルな KVS としてキャッシュに

 

    • SQL だとどうしても重たくなりがちなランキングに

 

    キュー構造を表現したい

不利的事情 de

    • Value 間に関係を持たせる

 

    • 不正なデータが入らないようにする(制約)

 

    Value で検索したい

总结

我以前只在缓存中使用过它,但后来发现它可以表示多种数据结构。
特别是排行榜,我觉得它虽然简单但很强大。
简单易懂也是很好的。

bannerAds