Redisに関する基礎知識

基本知識

Redis にはデフォルトで 16 のデータベースがあり、0 番目のデータベースがデフォルトで使用されます。select を
使用してデータベースを切り替えることができます。

データベースのサイズを表示するには、

DBサイズ

データベース内のすべてのキーを表示し、get メソッドを通じてすべての値を取得します

キー *

現在のデータベースをクリアする

フラッシュデータベース

データベースの内容をすべてクリアします

フラッシュオール

Redis はシングルスレッドです。
Redis はメモリ操作に基づいています。CPU は Redis のパフォーマンスのボトルネックではありません。Redis のボトルネックは、マシンのメモリとネットワーク帯域幅に基づいています。

Redis シングルスレッドはまだそれほど高速ですか?
1. Redis は C 言語で書かれており、公式データは 100,000+QPS であり、これはキー値 Memecache に劣りません。
2. マルチスレッドの CPU コンテキスト切り替えは、必ずしもシングルスレッドよりも効率的であるとは限りません。Redis はすべてのデータをメモリに置き、読み取りと書き込みの速度が非常に速いため、シングルスレッド操作を使用するのが最も効率的です。メモリ システムの場合、CPU を使用しないコンテキスト スイッチングが最も効率的であり、複数の読み取りと書き込みが 1 つの CPU で実行されます。これがメモリのベスト プラクティス ソリューションです。

Redis キー

127.0.0.1:6379> set name tuker 设置当前key的值为tuker
OK
127.0.0.1:6379> keys * 展示所有的key的值
1) "name"
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists age
(integer) 1
127.0.0.1:6379> exists anme
(integer) 0
127.0.0.1:6379> move name 1
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> set name tucker
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> get name
"tucker"
127.0.0.1:6379> expire name 10 设置key的过期时间
(integer) 1
127.0.0.1:6379> ttl
(error) ERR wrong number of arguments for 'ttl' command
127.0.0.1:6379> ttl name 查看当前key的剩余时间
(integer) -2
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> type name 查看当前key的类型
string
127.0.0.1:6379> type age
string

文字列(文字列)

set key value #设置某个key的值为value
setnx key value #如果某个key不存在,则设置某个key的值为value

リスト

すべてのリスト コマンドは l で始まります。

############################################
127.0.0.1:6379> lpush list one #将一个值或者多个值插入到列表的头部 (左)
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1
1) "three"
2) "two"
127.0.0.1:6379> rpush list right #将一个值或者多个值放在列表的头部(右)
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"


############################################
127.0.0.1:6379> lpop list # 移除list的第一个元素(左)
"three"
127.0.0.1:6379> rpop list # 移除list的第一个元素(右)
"right"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"

############################################
127.0.0.1:6379> lindex list 1 #通过下表获得list中的某一个值
"one"
127.0.0.1:6379> lindex list 0
"two"

############################################
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> llen list # 返回列表的长度
(integer) 3

############################################
移除指定的值:
取关 uid
127.0.0.1:6379> lrange list 0 -1 
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one # 移除list集合中指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1 # 
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 1 three 
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrem list 2 three 
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"

############################################
trim 修剪: 
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpush mylist "hello3"
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2 # 通过下标截取指定长度,这个list已经被改变了,只剩下截取的元素了
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
############################################
rpoplpush # 移除列表的最后一个元素,并将其添加到一个新的元素

127.0.0.1:6379> rpush mylist "hello"
(integer) 1 
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist # 移除列表的最后一个元素,将器移动到一个新的列表中
"hello2"
127.0.0.1:6379> lrange mylist 0 -1 # 查看原来的列表
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange myotherlist 0 -1 # 查看新的列表中确实有该值
1) "hello2"
############################################
lset 将列表中指定下标的值替换为另外一个值,更新操作
127.0.0.1:6379> exists list   # 检查这个列表是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item # 如果不存在,我们更新会报错
(error) ERR no such key
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 item # 如果存在,我们会更新下标的值
OK
127.0.0.1:6379> lrange list 0 0
1) "item"
127.0.0.1:6379> lrange list 0 0
1) "item"
127.0.0.1:6379> lset list 1 other # 如果不存在,会报错
(error) ERR index out of range
############################################
linsert 将某个值插入到某个元素的前面或者后面

127.0.0.1:6379> rpush mylist hello
(integer) 1
127.0.0.1:6379> rpush mylist world
(integer) 2
127.0.0.1:6379> linsert mylist before world other
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> linsert mylist after world new
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"

まとめ

  • リストは実際にはリンクされたリストであり、後のノード、左、右のノードが値を挿入できるようになります。
  • キーが存在しない場合は、新しいリンク リストを作成します
  • キーが存在する場合はコンテンツを追加します
  • すべての値が削除された場合、空のリンク リストは存在しないことを意味します
  • 両側で値を挿入または変更するのが最も効率的です。中間要素は相対的に効率が低い

設定

セット内の値を繰り返すことはできません

############################################
127.0.0.1:6379> sadd myset "hello" # set 集合中添加元素
(integer) 1
127.0.0.1:6379> sadd myset "tucker"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> smembers myset # 查看指定set的所有值
1) "world"
2) "hello"
3) "tucker"
127.0.0.1:6379> SISMEMBER myset hello  # 判断set中的某一个值是否存在
(integer) 1
127.0.0.1:6379> SISMEMBER myset kuki
(integer) 0
127.0.0.1:6379> 
############################################
127.0.0.1:6379> scard myset # 获取set集合总的内容元素个数
(integer) 3
127.0.0.1:6379> sadd myset "world"
(integer) 0
127.0.0.1:6379> sadd myset "world2"
(integer) 1
127.0.0.1:6379> scard myset
(integer) 4
127.0.0.1:6379> srem myset hello # 移除set集合中的指定元素
(integer) 1
127.0.0.1:6379> scard myset
(integer) 3
127.0.0.1:6379> SISMEMBER myset hello
(integer) 0
############################################
127.0.0.1:6379> SRANDMEMBER myset  # 随机抽选出一个元素
"world2"
127.0.0.1:6379> SRANDMEMBER myset 2 # 随机抽选指定个数的元素
1) "world2"
2) "tucker"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "world2"
2) "tucker"
127.0.0.1:6379> SRANDMEMBER myset 
"world"
############################################
随机删除key
127.0.0.1:6379> spop myset # 随机移除元素
"world"
127.0.0.1:6379> spop myset
"tucker"
127.0.0.1:6379> SMEMBERS myset
1) "world2"

############################################
将一个指定的值移动到另外一个set集合中
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> sadd myset "tucker"
(integer) 1
127.0.0.1:6379> sadd myset2 "set2"
(integer) 1
127.0.0.1:6379> smove myset myset2 tucker #将一个指定的值从一个集合移动到另一个集合中
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
127.0.0.1:6379> smembers myset2
1) "tucker"
2) "set2"

############################################
微博中的共同关注(并集)
数字集合类:
- 差集
- 交集
- 并集
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> sdiff key1 key2 #差集
1) "b"
2) "a"
127.0.0.1:6379> sinter key1 key2 #交集 共同好友
1) "c"
127.0.0.1:6379> sunion key1 key2 #并集 
1) "b"
2) "c"
3) "e"
4) "a"
5) "d"

ハッシュ

ハッシュはマップ コレクション、キーマップであり、本質的には文字列と何ら変わりません。単純なキーと値です。

#####################################################
127.0.0.1:6379> hset myhash field1 tucker # set 一个具体的key-value
(integer) 1
127.0.0.1:6379> hget myhash field1 #获取一个key-value
"tucker"
127.0.0.1:6379> hmset myhash field1 hello field2 world #set 多个具体的值
OK
127.0.0.1:6379> hmget myhash field1 field2 # 获取多个具体的值
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash #获取所有的值
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field1 #删除指定的字段
(integer) 1
127.0.0.1:6379> hgetall myhash #获取所有的字段
1) "field2"
2) "world"
##########################################################
127.0.0.1:6379> hmset myhash field2 hello 
OK
127.0.0.1:6379> hmset myhash field3 tucker
OK
127.0.0.1:6379> hlen myhash #计算myhash的长度
(integer) 2
127.0.0.1:6379> hgetall myhash # 获取myhash中所有的元素
1) "field2"
2) "hello"
3) "field3"
4) "tucker"
127.0.0.1:6379> hlen myhash
(integer) 2
127.0.0.1:6379> HEXISTS myhash field1 # 判断myhash中的元素是否存在
(integer) 0
127.0.0.1:6379> HEXISTS myhash field2
(integer) 1
127.0.0.1:6379> HEXISTS myhash field3
(integer) 1
127.0.0.1:6379> hkeys myhash # myhash中所有的key
1) "field2"
2) "field3"
127.0.0.1:6379> hvals myhash #获取所有的值
1) "hello"
2) "tucker"
127.0.0.1:6379> hset myhash field3 5
(integer) 0
127.0.0.1:6379> HINCRBY myhash field3 1 #将值减1
(integer) 6
##########################################################
127.0.0.1:6379> hset myhash field3 5 # 指定增量
(integer) 1
127.0.0.1:6379> HINCRBY myhash field3 1 # 
(integer) 6
127.0.0.1:6379> HINCRBY myhash field3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash field4 hello # 如果不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 world # 如果存在则不能设置
(integer) 0

ユーザー名、年齢などのハッシュ変更されたデータの場合、ハッシュ構造はユーザー情報や頻繁に変更される情報の保存に適しています。
ハッシュはオブジェクトのストレージに適しており、文字列は文字列のストレージに適しています。

3 つの特殊なデータ型

地理空間 地理的位置

友人、近くにいる人の位置、タクシーの距離の計算?
RedisのGeoはRedis3.2バージョンで登場し、地理的位置情報、2地点間の距離、数マイル以内の人数を計算できる機能です。

GEOADD
GEODIST
GEOHASH
GEOPOS
GEORADIUS
GEORADIUSBYMEMBER

getadd
// 場所を追加

将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing
(integer) 1
127.0.0.1:6379> geoadd china:city 114.08 22.54 shenzhen
(integer) 1
127.0.0.1:6379> geoadd china:city 120.15 30.28 hangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 108.84 34.26 xian
(integer) 1

getpos
获取指定城市的经度和纬度
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city beijing chongqing
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "106.49999767541885376"
   2) "29.52999957900659211"

2 つの位置間の距離を計算します。GEODIST は、
指定された 2 つの位置間の距離を返します。

2 つの場所のうち 1 つが存在しない場合、コマンドは NULL を返します。

単位を指定するパラメータ単位は、次のいずれかの単位である必要があります。

mは単位がメートルであることを意味します。
km は単位がキロメートルであることを示します。
mi は単位がマイルであることを意味します。
ft は単位がフィートであることを示します。

127.0.0.1:6379> geodist china:city shenzhen chongqing
"1084873.5830"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"
127.0.0.1:6379> geodist china:city beijing chongqing
"1464070.8051"

近くにいる人を見つける: GEORADIUS は、
指定された緯度と経度を中心として取得し、クエリする特定の半径を見つけて、
指定された人数を取得します。

127.0.0.1:6379> georadius china:city 110 30 500 km
# 以 110 30 这个经纬度为中心寻找方圆500km内的城市
1) "chongqing"
2) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist
# 显示到城市的中心距离
1) 1) "chongqing"
   2) "341.9374"
2) 1) "xian"
   2) "486.2460"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord
1) 1) "chongqing"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) 1) "108.8399997353553772"
      2) "34.25999964418929977"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord
1) 1) "chongqing"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) 1) "108.8399997353553772"
      2) "34.25999964418929977"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 1
# 筛选城市数量为1
1) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"

GEORADIUSBYMEMBER は
、入力された経度と緯度を使用して、クエリの中心として使用される指定されたメンバーの中心点を決定します。

# 找出指定元素旁边的其他元素!
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"

GEOHASH は、
1 つ以上の位置要素の Geohash 表現を返します。

# 把城市的两个城市的经纬度转换成一维的base64字符串
127.0.0.1:6379> GEOHASH china:city beijing chongqing
1) "wx4fbxxfke0"
2) "wm5xzrybty0"

GEO の基本的な実装原理は、実際には Zset です。Zset コマンドを使用して GEO を操作できます

# 查看地图中的全部元素
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"

ハイパーログログ

ベースとは何ですか

コレクション内の固有の要素を指します

はじめに従来の Web ページの UV の方法
(複数回 Web サイトにアクセスした人も 1 人としてカウントされます) は、ユーザーの ID を保存し、標準的な判断としてセット内の要素の数をカウントします。大量のユーザーIDを宮殿に保存する場合はこの方法の方が面倒です!私たちの目的は、ユーザー ID を保存することではなく、カーディナリティを目的としています。

Redis Hyperloglogの利点
: 占有されるメモリは固定されています。2^64 の異なる要素のベースに必要なメモリは 12kB だけです。Hyperloglog が第一の選択肢です。

127.0.0.1:6379> PFADD mykey a b c d e f g h i j k
(integer) 1
127.0.0.1:6379> PFCOUNT mykey # 统计第一组中的元素数量
(integer) 11
127.0.0.1:6379> pfadd mykey i j z kv l
(integer) 1
127.0.0.1:6379> PFCOUNT mykey
(integer) 14
127.0.0.1:6379> pfadd mykey2 a b c d 
(integer) 1
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2 # 合并两组数据
OK
127.0.0.1:6379> PFCOUNT mykey3
(integer) 14

フォールト トレランスが許可されている場合は、Hyperloglog を使用する必要があります


ビットマップ

ビットストレージ
感染者数の統計: 0 1 0 1 0
ユーザー情報の統計、アクティブ、非アクティブ! ログイン済み、未ログイン! チェックイン、365 チェックイン!
ビットマップを使用して月曜日から日曜日までのチェックインを記録します

127.0.0.1:6379> setbit sigin 0 1
(integer) 0
127.0.0.1:6379> setbit sigin 1 0
(integer) 0
127.0.0.1:6379> setbit sigin 2 0
(integer) 0
127.0.0.1:6379> setbit sigin 3 1
(integer) 0
127.0.0.1:6379> setbit sigin 4 1
(integer) 0
127.0.0.1:6379> setbit sigin 5 1
(integer) 0
127.0.0.1:6379> setbit sigin 6 0
(integer) 0
# 查看某一个天是否有打卡
127.0.0.1:6379> getbit sigin 6
(integer) 0
127.0.0.1:6379> getbit sigin 1
(integer) 0
#统计操作, 统计打卡天数
127.0.0.1:6379> bitcount sigin
(integer) 4

おすすめ

転載: blog.csdn.net/sinat_28199083/article/details/130716734