尝试接触 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 で検索したい
总结
我以前只在缓存中使用过它,但后来发现它可以表示多种数据结构。
特别是排行榜,我觉得它虽然简单但很强大。
简单易懂也是很好的。