如果我,我就能理解Redis
首先
这只是我勉强整理出来的东西。
※我会明白
Redis的概述
-
- インメモリデータベース
ディスクではなく高速なメインメモリにデータを格納
高速かつ安定したパフォーマンスを提供
大容量のデータに不向き
部分的なデータ保存に向いている
定期的にディスクに書き込みデータを永続化する
別名データ構造サーバ
キーに紐づく値の一般的な関係はもちろん複雑なデータ構造も扱える
专业术语
-
- KVS
Key, Value Storeの頭文字
キーに紐づく値のこと
例)Name(key): “Taro”(value)
長いキーは推奨されていない
データ・タイプ
String:シンプルなデータ
例)Name: “Taro”
List:順番に並べた複数の要素
例)時系列的なデータ
Set:順不同の複数の要素(重複を許さない)
例)タグ,ソーシャルグラフ
Sorted Set:Setの特徴を持ちつつも個々の要素にスコアが付く
例)ランキング
Hashe:連想配列
例)わかりやすいラベルと値のセット
環境配置
本地使用
苹果电脑
# Mac
$ brew install redis
Ubuntu
# Ubuntu
$ sudo apt install redis
启动
# サーバーのスタート
$ redis-server
# 別ウインドウで下記コマンド入力によってサーバに入れる
$ redis-cli
停下来
# cliから抜ける
127.0.0.1:6379> exit
# サーバの停止
redis-serverは
Ctrl+Cで停止することができる
建议使用Docker。
version: '3'
services:
redis:
image: "redis:latest"
ports:
- "6379:6379"
volumes:
- "./data/redis:/data"
启动
# コンテナの立ち上げ
$ docker-compose up -d
# 立ち上上げたredisコンテナに入ってcliを叩く
$ docker-compose exec redis redis-cli
停下来
# cliから抜ける
127.0.0.1:6379> exit
# コンテナの停止
$ docker-compose down
操作数据库
选择数据库
默认情况下,已选中编号为0的数据库。
127.0.0.1:6379> select 数字
可以选择从0到15
数据存储
127.0.0.1:6379> bgsave
在执行命令后,将在本地生成一个dump.rdb文件,先前保存的数据将被写入该文件中。
String的操作
插入数据
-
- 形式
-
- set key value
- 例
127.0.0.1:6379> set name taro
OK
127.0.0.1:6379> set email taro@gmail.com
OK
127.0.0.1:6379> set age 20
OK
显示与键相关联的值
-
- 形式
-
- 単数:get キー名
-
- 複数:mget キー名1 キー名2
- 例
# 1つのみ表示
127.0.0.1:6379> get name
"taro"
# 複数の値を表示する場合はmgetを使ってkeyを羅列する
127.0.0.1:6379> mget name email age
1) "taro"
2) "taro@gmail.com"
3) "20"
整数值的减少和增加操作
如果值是整数,可以进行增加或减少操作。
-
- 形式
-
- 増加:incr キー名
-
- 減少:decr キー名
- 例
# 値の表示
127.0.0.1:6379> get age
"20"
# インクリメント
127.0.0.1:6379> incr age
(integer) 21
# デクリメント
127.0.0.1:6379> decr age
(integer) 20
您也可以将变化设置为大于等于1。
-
- 形式
-
- 増加数の指定:incrby 数字
-
- 減少数の指定:decrby 数字
- 例
# 値の表示
127.0.0.1:6379> get age
"20"
# 増加数の指定
127.0.0.1:6379> incrby age 10
(integer) 30
# 減少数の指定
127.0.0.1:6379> decrby age 10
(integer) 20
操作KEY
關鍵的顯示
-
- 形式
-
- すべてのkeyの取得:keys *
-
- 条件指定:keys 正規表現
-
- 使える正規表現
-
- ? ・・・任意の1文字
-
- * ・・・ 任意の文字列
-
- [ ] ・・・ 角カッコ内の文字のどれか1文字
- 例
# すべてのキーを取得
127.0.0.1:6379> keys *
1) "age"
2) "email"
3) "name"
# 条件指定,先頭がaまたはnのキーすべて
127.0.0.1:6379> keys [an]*
1) "age"
2) "name"
确认key的存在
-
- 形式
-
- exists キー
- 例
# キーnameは存在するため1が返ってくる
127.0.0.1:6379> exists name
(integer) 1
# キーimageは存在しないため0が返ってくる
127.0.0.1:6379> exists image
(integer) 0
修改 key 的名称
-
- 形式
-
- rename 元のキー名 新しいキー名
- 例
# ageからnenraiにキー名を変更
127.0.0.1:6379> rename age nenrai
OK
# 変更されたので元の名前では検索がマッチしません
127.0.0.1:6379> keys age
(empty array)
# 新しいキー名に変わっていることがわかります
127.0.0.1:6379> keys nenrai
1) "nenrai"
删除密钥
-
- 形式
-
- del キー名
- 例
127.0.0.1:6379> del nenrai
(integer) 1
127.0.0.1:6379> keys nenrai
(empty array)
暫時創建密鑰
-
- 形式
-
- expire キー名 秒数
- 例
# ageに20をセット
127.0.0.1:6379> set age 20
OK
# セットされていることの確認
127.0.0.1:6379> get age
"20"
# 有効期限を10秒にセット
127.0.0.1:6379> expire age 10
(integer) 1
# 5秒後,まだ値はある
127.0.0.1:6379> get age
"20"
# 10秒後値がキーが消えていることがわかる
127.0.0.1:6379> get age
(nil)
排序
- 形式
数字排序:sort by 数字的键名 [倒序 升序]
字符串排序:sort by 字符串的键名 按字母顺序 [倒序 升序]
也能适用于下文提到的Set和List。
- 例
127.0.0.1:6379> sort students alpha asc
1) "jiro"
2) "saburo"
3) "shiro"
4) "taro"
操作List
在列表中添加数据
-
- 形式
-
- 先頭に要素を追加:lpush キー名 値1 値2 値3...
-
- 末尾に要素を追加:rpush キー名 値1 値2 値3...
- 例
127.0.0.1:6379> rpush students taro
(integer) 1
# 複数同時に追加することも可能
127.0.0.1:6379> rpush students jiro saburolpop
(integer) 3
显示列表
-
- 形式
-
- 指定した要素の表示:lindex キー名 要素番号
-
- 指定した範囲の要素を表示lrange キー名 start stop
- 例
# 指定した要素の表示
127.0.0.1:6379> lindex students 1
"jiro"
# 先頭の0から2までの格納された値を表示
127.0.0.1:6379> lrange students 0 2
1) "taro"
2) "jiro"
3) "saburo"
# -1は末尾を表している
127.0.0.1:6379> lrange students 0 -1
1) "taro"
2) "jiro"
3) "saburo"
显示要素数量
- 形式
llen 键名的含义是什么?
127.0.0.1:6379> llen students
(integer) 4
删除列表中的数据
-
- 形式
-
- 先頭の要素削除:lpop キー名
-
- 末尾の要素削除:rpop キー名
-
- 指定した範囲以外削除:ltrim キー名 start stop
例
127.0.0.1:6379> lrange students 0 -1
1) "taro"
2) "jiro"
3) "saburo"
# 先頭の要素を削除
127.0.0.1:6379> lpop students
"taro"
127.0.0.1:6379> lrange students 0 -1
1) "jiro"
2) "saburo"
# 末尾の要素を削除
127.0.0.1:6379> rpop students
"saburo"
127.0.0.1:6379> lrange students 0 -1
1) "jiro"
# 指定した範囲以外を削除
127.0.0.1:6379> ltrim students 0 2
OK
127.0.0.1:6379> lrange students 0 -1
1) "taro"
2) "jiro"
3) "saburo"
操作Set
新加数据
- 形式
给定 sadd 命令的参数,其中包括一个键名和一个或多个值,我们需要将其用中文重新表达。
- 例
# 値の追加
127.0.0.1:6379> sadd classroom taro
(integer) 1
# 複数の値をセットすることができる
127.0.0.1:6379> sadd classroom jiro saburo
(integer) 2
显示数据列表
- 形式
获取集合的所有成员。
- 例
# Listと違い順不同で追加されていることがわかる
127.0.0.1:6379> smembers classroom
1) "jiro"
2) "saburo"
3) "taro"
删除数据
-
- 形式
-
- srem キー名 値
- 例
# jiroを削除
127.0.0.1:6379> srem classroom jiro
(integer) 1
# 消えていることがわかる
127.0.0.1:6379> smembers classroom
1) "saburo"
2) "taro"
聚集在一起
-
- 形式
-
- 和集合:sunion キー名1 キー名2
-
- 差集合:sdiff キー名1 キー名2
-
- 積集合:sinter キー名1 キー名2
-
- 和集合のSetを作成:sunionstore キー名 比較する集合1 比較する集合2
-
- 差集合のSetを作成:sdiffstore キー名 比較する集合1 比較する集合2
-
- 積集合のSetを作成:sinterstore キー名 比較する集合1 比較する集合2
- 例
# 2つのSetを作成
127.0.0.1:6379> smembers classroom
1) "saburo"
2) "taro"
127.0.0.1:6379> sadd classroom2 taro jiro shiro
(integer) 3
127.0.0.1:6379> smembers classroom2
1) "jiro"
2) "taro"
3) "shiro"
# 和集合
127.0.0.1:6379> sunion classroom classroom2
1) "jiro"
2) "taro"
3) "saburo"
4) "shiro"
# 差集合
127.0.0.1:6379> sdiff classroom classroom2
1) "saburo"
# 積集合
127.0.0.1:6379> sinter classroom classroom2
1) "taro"
# 和集合のSetを作成
127.0.0.1:6379> sunionstore unionclassroom classroom classroom2
(integer) 4
127.0.0.1:6379> smembers unionclassroom
1) "jiro"
2) "taro"
3) "saburo"
4) "shiro"
操作Sorted Set的方法
在排名数据中经常被使用的
新增数据
-
- 形式
-
- zadd キー名 ランク 値
-
- ソート時ランクが比較される
- 例
# 年齢をランクとしてセットしている
127.0.0.1:6379> zadd age 80 taro
(integer) 1
127.0.0.1:6379> zadd age 63 jiro
(integer) 1
127.0.0.1:6379> zadd age 49 saburo
(integer) 1
127.0.0.1:6379> zadd age 23 shiro
(integer) 1
显示数据
- 形式
按升序显示:用 zrange 命令查看键名从开始到结束的范围内的值。
按降序显示:用 zrevrange 命令查看键名从开始到结束的范围内的值。
# 先頭から末尾まで昇順に表示
127.0.0.1:6379> zrange age 0 -1
1) "shiro"
2) "saburo"
3) "jiro"
4) "taro"
# 範囲は自由に指定できる
127.0.0.1:6379> zrange age 1 2
1) "saburo"
2) "jiro"
# 先頭から末尾まで降順に表示
127.0.0.1:6379> zrevrange age 0 -1
1) "taro"
2) "jiro"
3) "saburo"
4) "shiro"
排名显示
- 形式
根据升序排名:zrank 键名 值
根据降序排名:zrevrank 键名 值
- 例
# 昇順時のランク
127.0.0.1:6379> zrank age taro
(integer) 3
# 降順時のランク
127.0.0.1:6379> zrevrank age taro
(integer) 0
刪除
- 形式
删除键名中的值。
- 例
# shiroを削除
127.0.0.1:6379> zrem age shiro
(integer) 1
# shiroがいなくなっている事がわかる
127.0.0.1:6379> zrange age 0 -1
1) "saburo"
2) "jiro"
3) "taro"
对Hash进行操作
Python中的字典
Ruby中的哈希
Bash中的关联数组
添加和更新哈希
- 形式
追加:使用hset命令将值添加到散列名和键名中
更新:使用hset命令更新散列名和键名的值
- 例
# 追加
127.0.0.1:6379> hset teammember name taro
(integer) 1
127.0.0.1:6379> hset teammember age 20
(integer) 1
127.0.0.1:6379> hset teammember sex man
(integer) 1
# ageを20から25に更新
127.0.0.1:6379> hset teammember age 25
(integer) 0
显示数值
- 形式
通过指定一个键进行显示:使用 hget 命令获取哈希表名称和键名
通过指定多个键进行显示:使用 hmget 命令获取哈希表名称和多个键名
显示所有的值:使用 hvals 命令获取哈希表名称
# 1つだけ表示
127.0.0.1:6379> hget teammember name
"taro"
# 複数表示
127.0.0.1:6379> hmget teammember name age sex
1) "taro"
2) "20"
3) "man"
# すべて表示
127.0.0.1:6379> hvals teammember
1) "taro"
2) "20"
3) "man"
请显示有多少个键。
-
- 形式
-
- hlen hash名
- 例
# teammemberは3つのキーで構成されている事がわかる
127.0.0.1:6379> hlen teammember
(integer) 3
展示钥匙列表
- 形式
哈希名称的hkeys
- 例
# teammemberを構成するキー一覧を表示
127.0.0.1:6379> hkeys teammember
1) "name"
2) "age"
3) "sex"
同时显示键和值
-
- 形式
-
- hgetall hash名
- 例
# 1~3はキー名,4~6は対応する値
127.0.0.1:6379> hgetall teammember
1) "name"
2) "taro"
3) "age"
4) "20"
5) "sex"
6) "man"
指定键并删除
- 形式
删除哈希表中的指定键值对。
- 例
# 性別の削除
127.0.0.1:6379> hdel teammember sex
(integer) 1
# 削除されていることがわかる
127.0.0.1:6379> hgetall teammember
1) "name"
2) "taro"
3) "age"
4) "25"
删除哈希
- 形式
删除哈希名称
- 例
127.0.0.1:6379> del teammember
(integer) 1
127.0.0.1:6379> hgetall teammember
(empty array)
对数据进行独占处理
同时进行多个处理
在处理期间不允许其他访问
- 注意
请注意无法回滚的情况
可能会导致数据不一致
- 形式
处理开始:多重处理
执行处理:执行
强制终止处理:丢弃
- 例
# 処理の開始
127.0.0.1:6379> multi
OK
# 処理を一つ一つキューに入れるイメージ
# 処理1
127.0.0.1:6379> incr score
QUEUED
#処理2
127.0.0.1:6379> incr pass
QUEUED
# 処理の実行
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 1