さまざまなアプリケーションや使用シナリオのRedisを説明し
Redisの
まず、なぜ使用
-
アプリケーションサーバーを解決するためのCPUとメモリの圧力
-
Ioは、読み取り操作を減らすIOの圧力を減らすために
-
スケーラビリティ、リレーショナルデータベースは、テーブルの構造を変更することは困難である、強力ではありません
第二に、利点:
-
無関係データベースのNoSQL、データ構造は、単純なテーブルを拡張することは比較的容易です
-
NoSQLの読み出し速度、大規模データの高速処理
第三に、アプリケーションのシナリオ:
-
高い同時読み取りおよび書き込みデータ
-
大量のデータの読み込みと書き込み
-
高いスケーラビリティ必要なデータ
第四に、不快感のシーン:
-
トランザクションのサポートが必要(非リレーショナルデータベース)
-
SQLベースの構造化照会ストレージ、複雑な関係
五、Redisの構造:
Redisのは、オープンソースのキーと値のデータベース、サポート文字列、リスト、セット、ZSETとハッシュデータ型です。これらのデータの操作は、永続的なデータの効率を確保するために定期的redus原子です。
第六に、使用シナリオ:
-
リレーショナル・データベースはキャッシュを行います
-
高頻度アクセスデータキャッシュ、データベースのIOを減らします
-
分散型アーキテクチャ、共有セッションを行います
-
具体的なデータは永続することができます。
-
ランキングを格納することができZSET型を使用します
-
n個のデータストレージをソートするために、最新の自然な時間のリストを使用して
七、Redisの下のLinux:
-
Redisのディレクトリ:USR / local / binに
-
Linuxの一般的なコマンドの下でのRedis:
-
Redisのベンチマーク:パフォーマンステストツール
-
Redisのサーバー:Redisのサーバの起動
-
Redisの-CLI:Redisのクライアント起動し、オペレータ
八、Redisの基礎
-
ポート:6379
-
16デフォルトのデータベース、インデックスは0から始まります
-
スレッド化:Redisのマルチプレクサは、シングルスレッド+ IOです:レディ状態で説明したファイルを確認してください
Memchached:マルチスレッドロック+
-
Redisのデータ型:文字列セットリストのハッシュZSET
九、Redisのコマンド:
-
キー操作
キー* | 現在のすべてのキーバンクを参照してください。 |
<キー>が存在します | キーが存在するかどうかを判定 |
デル<キー> | キーを削除します。 |
有効期限は、<キー> <二> | S秒でキーの有効期限を設定します |
TTL <キー> | -1期限切れ期間を示すが、-2、すでに有効期限が切れている秒数をチェック |
移動<キー> <DB> | 次のキーは、別のライブラリに移動します |
DBSIZE | 鍵データベースの数を表示 |
flushdb | 空の現在のライブラリ |
flushall | すべてのライブラリを殺すために渡し |
-
文字列型:文字列が安全バイナリであり、任意のデータソースを含むことができ、最大512メートル
取得<キー> | 対応するキーをチェック |
セット<キー> <値> | ペアを追加 |
追加<キー> <値> | 元の値の末尾に追加指定された値 |
<キー>はstrlen | 価値の長さを取得します。 |
setnx <キー> <値> | キーは、キー値の設定に存在しない場合には |
INCR <キー> | それが空の場合、いずれかで番号を格納されたキー、値は1 |
DECR <キー> | それが空の場合、デジタルマイナス1に格納されたキーは、その値は-1 |
incrby / decrby <キー> <步长> | 増減でキー数値 |
文字列バッチ処理:
MSET <キー1> <をvalue1> <キー2>、<値2> | 一方、キーと値のペアの複数 |
mgetは<キー1> <キー2> | 同時に、より多くの価値を得ます |
msetnx <キー1> <をvalue1> <キー2>、<値2> | 与えられたキーが存在しない場合 |
getrange <キー> <ストップ> <スタート> | 同様のsunstring |
setrange <キー> <ストップ> <スタート> | 元の値に類似sunstringを上書き |
SETEX <キー> <値> <満了します> | 有効期限を与え、同時にキーを設定します |
GETSET <キー> <値> | TMは、古い値を取得すると同時に、新しい値を設定しました |
-
リスト:リスト
1、機能:
マルチタッチ値
Redisのリストには、左または右から挿入され、文字列の単純なリストです
下の層が二重にリンクされたリストで、下付きクエリのパフォーマンスによって、両端の高パフォーマンスの操作は非常に低いです
lpush / rpush <キー> <をvalue1> <値2> .. | 左右の複数の値を挿入します |
LPOP / RPOP <キー> | 左または右の値から排出された、光の死のキー値 |
rpoplpush <キー1> <キー2> | キー1 KEY2の右から左に値を吐き出します |
LRANGE <キー> <インデックス> | 左から右にインデックス添字に応じて要素を取得します |
LINDEX <キー> <インデックス> | 左から右にインデックス添字に応じて要素を取得します |
llen <キー>を取得リストの長さ | リストの長さを取得します。 |
linsert <キー> <値> <NEWVALUE>の前に | NEWVALUE前にキー値を挿入 |
-
同様の設定順不同リストを何もデータがリストに繰り返されないことを確保するために、底がハッシュテーブルにNULL値である:セット
サッド<キー> <値1>、<値2> | キーに複数の要素は、重複を無視します |
<キー> smembers | 設定値のすべてを削除します |
sismember <キー> <値> | この値には1 0を持っていないだろう、キー値のセットがあるか否かを判断します |
SCARD <キー> | セット内の要素の数を返します。 |
SREM <キー> <をvalue1> <値2> | コレクション内の要素を削除するには |
SPOP <キー> | 設定値のランダムな排出 |
srandmember <key> <n> | 随机从集合中取出n个值,不会从集合中删除 |
smove <key1> <key2> <value> | 将key1中的value 移动到key2 中 |
sinter <key1> <key2> | 返回两个集合的交集元素 |
sunion <key1> <key2> | 返回两个集合的并集 |
-
hash:键值对集合,类似map<String,Object>
hset <key> <filed> <value> | 给key 集合中的file 键赋值value |
hget <key1> <field> | 从key1 集合file取出value |
hmset <key1> <field1> <value1> <field2> <value2> | 批量设置hash的值 |
hexists <key> <field> | 查看key中的field 是否存在 |
hkeys <key> | 列出key中所有的filed |
hvals <key> | 列出该hash集合中所有的value |
-
zset:与set集合非常相似,每个成员都关联了score,可以用来排序
zadd<key><score1><value1><score2><value2> | 将一个或多个元素以及score加入zset |
zrange<key><start><stop> withscore | 返回下标在区间内的集合,带有score |
zrangebyscore <ket> <min> <max>[withscore] [limit offset count] | 返回key中 score介于min和max中的成员,升序排列 |
zrevrangerbyscore <key> <min> <max> [withscore] [limit offset count] | 降序 |
zincrby <key> <increment> <value> | 在key集合中的value上增加increment |
zrem <key> <value> | 删除key集合下的指定元素 |
zcount <key> <min><max> | 统计 区间内的元素个数 |
zcord <key> | 获取集合中的元素个数 |
zrank <key><value> | 查询value在key中的排名,从0开始 |
十、redis持久化:
-
两种方式:rdb(redis database)和aof(append of file)
-
RDB:在指定时间间隔内,将内存中的数据作为一个快照文件(snapshot)写入到磁盘,读取的时候也是直接读取snapshot文件到内存中
①持久化过程:redis单独创建(fork)一个进程来持久化,会先将数据写入临时文件中,待上次持久化结束后,会将该临时文件替换上次持久化文件,比aof高效,但是最后一次数据可能会丢失
②Fork:在linux中,fork()会产生一个跟主进程一样的子进程,出于效率考虑,主进程和子进程会公用一段物理内存,当发生改变的时候,才会把主进程“”写时复制”一份给子进程
③Redis备份的文件:在redis.conf中设置,dbfilename默认为:dump.rdb
④ Rdb保存策略:
-
-
900s 1 file change
-
300s 10file change
-
60s 10000file change
-
⑤Rdb的备份:
-
-
config get dir 得到备份的文件夹
-
复制备份文件
-
⑥Rdb恢复:
-
-
关闭redis
-
将备份文件复制到工作目录下
-
启动redis,自动加载
-
-
AOF : 以日志形式记录每个写操作,启动时通过日志恢复操作
-
开启AOF:默认不开启,进入redis.conf找到appendonly yes打开
-
修复AOF:redis-check-aof –fix appendonly.aof
-
同步频率:每秒记录一次,如果宕机该秒记可能失效
-
Rewrite:bgrewriteaof 因为日志是追加方式,文件会越来越大,当超过了设置的阈值时,日志文件会压缩,保留仅可以恢复的日志
-
-
RDB和AOF对比
-
节省磁盘空间
-
恢复速度快
-
RDB优点:
-
-
-
ROD缺点:
-
-
-
数据太大时,比较消耗性能
-
一段时间保存一次快照,宕机时最后一次可能没有保存
-
c) AOF优点:
i. 备份机制更加稳健
ii. 可读的日志文件,通过aof恢复更加稳健,可以处理失误
d) AOF缺点:
i. 比RDB更占磁盘
ii. 备份速度较慢
-
-
iii每次都同步日志,有性能压力
-
-
RDB和AOF哪个好
-
官方推荐都启用
-
对数据不敏感,单独用RDB
-
不建议单独使用AOF
-
若作为纯缓存使用,可以都不开启
-
十一、Redis事务:输入multi,输入的命令都会依次进入到队列中,但不会执行,直到输入exec,redis会将之前命令队列中的命令依次执行,通过discard可以放弃组队。
-
主要作用:序列化操作,串联多个命令防止别的命令插队
-
悲观锁:每次拿到数据的时候都会上锁,或者等待别人处理完再去拿锁,传统的关系型数据库里边很多用到了这种锁机制,比如行锁、表锁、读锁、写锁
-
乐观锁:每次拿数据的时候总认为别人不会修改数据,所以不会上锁。但是更新的时候回去判断别人有没有更改数据,使用版本号机制。乐观锁适用于多读的应用类型,可以提高吞吐量。
-
Redis使用乐观锁:redis就是利用check-and-set机制实现事务
-
三大特性:
-
单独的隔离操作:事务中的所有命令都会序列化,按顺序执行。不会被其他客户端打断
-
没有隔离级别概念:队列中的命令没有提交之前不会被执行,事务外不能查看事务内的更新
-
不能保证原子性:跳过错误,依旧执行,没有回滚
-
十二、Redis订阅/发布:
是进程中的一种消息通信模式,发送者pub发送消息,订阅者sub接收消息 剩下的略。。。
十三、Redis主从复制:
-
是什么:主从复制就是主机数据更新后根据配置和策略,自动同步到备份机的master/slaver机制,master写为主,slave读为主
-
用处:
-
读写分离,性能拓展。
-
容灾快速恢复
-
-
配置服务器(配从不配主):
-
拷贝多个redis.conf文件
-
开启daemonize yes
-
Pid文件名字
-
指定端口
-
Log文件名字
-
Dump.rdb名字
-
Appendonly 关掉或者换名字
-
十四、Jedis:
-
所需jar包:
-
common-pool-1.6jar包
-
jedis-2.1
-
-
获取jedis对象:Jedis jedis = new Jedis(“ip” ,端口号);
十五、集群分布:
实现对redis的水平拓展,启动n’的redis节点,将整个数据分布在这n个节点中
-
配置conf文件:
-
拷贝多个redis.conf文件
-
开启daemonize yes
-
Pid文件名字
-
指定端口
-
Log文件名字
-
Dump.rdb名字
-
Appendonly 关掉或者换名字
-
-
配置cluster文件:
-
cluster-enable yes 打开集群模式
-
cluster-config-file xxx.conf 设置生成的节点配置文件名
-
cluster-node-timeout 15000设置节点失联时间,超多该时间(毫秒),集群自动进入主从切换
-
-