我与狗子的日常3
Redis 進(jìn)階之路
Redis安裝
redis簡介:
?????? redis是NOSQL(not only sql,非關(guān)系型數(shù)據(jù)庫)的一種,NoSQL是以Key-Value的形式存儲數(shù)據(jù),當(dāng)前主流的分布式緩存技術(shù)有Redis, memcached,ssdb,mongodb 等。可以把redis理解為緩存技術(shù),因?yàn)樗臄?shù)據(jù)都是緩存在內(nèi)存中,也可以理解為數(shù)據(jù)庫,因?yàn)閞edis可以周期性的將數(shù)據(jù)寫入磁盤或者把操作追加到記錄文件中。
redis與其他key-value的緩存產(chǎn)品相比有以下三個(gè)特點(diǎn):
?????? 1.Redis支撐數(shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。
?????? 2.Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時(shí)還提供list set zset hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
?????? 3.Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
?
優(yōu)點(diǎn):
性能極高?– Redis能讀的速度是110000次/s,寫的速度是81000次/s。
豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作
原子 – Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個(gè)操作是原子性的。多個(gè)操作也支持事務(wù),即原子性,通過MULTI和EXEC指令包起來
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性
Linux 下安裝redis
編譯源程序:
[root@localhost ftpuser]# tar zxvf redis-3.2.0.tar.gz
[root@localhost ftpuser]# cd redis-3.2.0
[root@localhost redis-3.2.0]# make
[root@localhost redis-3.2.0]# cd src && make install
創(chuàng)建目錄存放redis命令和配置文件
[root@localhost redis-3.2.0]# mkdir -p /usr/local/redis/bin
[root@localhost redis-3.2.0]# mkdir -p /usr/local/redis/etc
移動文件:
[root@localhost redis-3.2.0]# mv redis.conf /usr/local/redis/etc
[root@localhost redis-3.2.0]# cd src
[root@localhost src]# mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel redis-trib.rb /usr/local/redis/bin
啟動redis:
[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
驗(yàn)證是否啟動成功:
[root@localhost ~]# ps -ef | grep redis
#或者
[root@localhost ~]# netstat -tunpl | grep 6379
Redis客戶端連接:
[root@localhost ~]# /usr/local/redis/bin/redis-cli -h 192.168.2.128 -p 6379
192.168.2.128:6379> info
# Server
redis_version:3.2.0
redis_git_sha1:00000000
?
停止redis:
[root@localhost ~]# /usr/local/redis/bin/redis-cli shutdown
#或者
[root@localhost ~]# pkill redis-server
redis數(shù)據(jù)結(jié)構(gòu)(內(nèi)存模型)及常用命令
redis數(shù)據(jù)類型:
redis支持的數(shù)據(jù)類型有五種:String、List、Hash、Set和Sorted Set.
Redis 數(shù)據(jù)類型內(nèi)存結(jié)構(gòu)分析:
?????? Redis內(nèi)部使用一個(gè)RedisObject對象來表示所有的key和value,redisObject主要的信息包括數(shù)據(jù)類型type 編碼方式encoding 數(shù)據(jù)指針ptr 虛擬內(nèi)存vm 等。type表示value的數(shù)據(jù)類型。
String:是最常用的一種數(shù)據(jù)類型,普通的key/value存儲都可以歸為此類。
string類型的值最大能存儲512MB
1. SET key value
設(shè)置指定 key 的值
2. GET key?
獲取指定 key 的值。
3. GETSET key value
將給定 key 的值設(shè)為 value ,并返回 key 的舊值(old value)。
4. SETEX key seconds value
將值 value 關(guān)聯(lián)到 key ,并將 key 的過期時(shí)間設(shè)為 seconds (以秒為單位)。
5.SETNX key value
只有在 key 不存在時(shí)設(shè)置 key 的值。
6. STRLEN key
返回 key 所儲存的字符串值的長度。
?
Hash:redis hash是一個(gè)鍵值對集合 string類型的field 和 value的映射表,hash特別適合用于存儲對象。
每個(gè) hash可以存儲232-1 個(gè)鍵值對(40多億)
1. HDEL key field1 [field2]?
刪除一個(gè)或多個(gè)哈希表字段
2. HEXISTS key field?
查看哈希表 key 中,指定的字段是否存在。
3. HGET key field?
獲取存儲在哈希表中指定字段的值。
4. HGETALL key?
獲取在哈希表中指定 key 的所有字段和值
5. HKEYS key?
獲取所有哈希表中的字段
6. HLEN key?
獲取哈希表中字段的數(shù)量
7. HMSET key field1 value1 [field2 value2 ]?
同時(shí)將多個(gè) field-value (域-值)對設(shè)置到哈希表 key 中。
8. HSET key field value?
將哈希表 key 中的字段 field 的值設(shè)為 value 。
9. HSETNX key field value?
只有在字段 field 不存在時(shí),設(shè)置哈希表字段的值。
10. HVALS key?
獲取哈希表中所有值
11. HSCAN key cursor [MATCH pattern] [COUNT count]?
迭代哈希表中的鍵值對。
?
List:Redis列表是簡單的字符串列表。按照插入順序排序。
插入數(shù)據(jù):Lpush 列表名 value
查詢數(shù)據(jù):lrange 列表 0 10
List 最多可存儲232-1 個(gè)元素
1. BLPOP key1 [key2 ] timeout?
移出并獲取列表的第一個(gè)元素, 如果列表沒有元素會阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
2. BRPOP key1 [key2 ] timeout?
移出并獲取列表的最后一個(gè)元素, 如果列表沒有元素會阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
3. LINDEX key index?
通過索引獲取列表中的元素
4. LLEN key?
獲取列表長度
5. LPOP key?
移出并獲取列表的第一個(gè)元素
6. LPUSH key value1 [value2]?
將一個(gè)或多個(gè)值插入到列表頭部
7. LSET key index value?
通過索引設(shè)置列表元素的值
8. LTRIM key start stop?
對一個(gè)列表進(jìn)行修剪(trim),就是說,讓列表只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間之內(nèi)的元素都將被刪除。
9. RPOP key?
移除并獲取列表最后一個(gè)元素
10. RPUSH key value1 [value2]?
在列表中添加一個(gè)或多個(gè)值
11. RPUSHX key value?
為已存在的列表添加值
Set:Redis的set是string 類型的無序集合 set集合是通過哈希表實(shí)現(xiàn)的,所以添加刪除查找的復(fù)雜度都是O(1)。
Sadd: 添加一個(gè)key到對應(yīng)的set集合,返回1表示成功,返回0表示元素已存在集合中。如果key對應(yīng)的集合不存在,則返回錯誤。
Set集合的最大成員是數(shù)為232-1 個(gè)元素。
?
1. SADD key member1 [member2]?
向集合添加一個(gè)或多個(gè)成員
2. SCARD key?
獲取集合的成員數(shù)
3. SDIFF key1 [key2]?
返回給定所有集合的差集
4. SDIFFSTORE destination key1 [key2]?
返回給定所有集合的差集并存儲在 destination 中
5. SINTER key1 [key2]?
返回給定所有集合的交集
6. SINTERSTORE destination key1 [key2]?
返回給定所有集合的交集并存儲在 destination 中
7. SISMEMBER key member?
判斷 member 元素是否是集合 key 的成員
8. SMEMBERS key?
返回集合中的所有成員
9. SMOVE source destination member?
將 member 元素從 source 集合移動到 destination 集合
10. SPOP key?
移除并返回集合中的一個(gè)隨機(jī)元素
11. SRANDMEMBER key [count]?
返回集合中一個(gè)或多個(gè)隨機(jī)數(shù)
?
?
?
ZSet:有序結(jié)合 Zset的每個(gè)元素都會關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù),redis正是通過分?jǐn)?shù)來為集合的成員進(jìn)行從小到大的排序,Zset的成員是唯一的,但分?jǐn)?shù)可以重復(fù)。
1. ZADD key score1 member1 [score2 member2]?
向有序集合添加一個(gè)或多個(gè)成員,或者更新已存在成員的分?jǐn)?shù)
2.ZCARD key?
獲取有序集合的成員數(shù)
3. ZCOUNT key min max?
計(jì)算在有序集合中指定區(qū)間分?jǐn)?shù)的成員數(shù)
4. ZRANK key member?
返回有序集合中指定成員的索引
5. ZSCORE key member?
返回有序集中,成員的分?jǐn)?shù)值
6. ZREVRANGEBYSCORE key max min [WITHSCORES]?
返回有序集中指定分?jǐn)?shù)區(qū)間內(nèi)的成員,分?jǐn)?shù)從高到低排序
Redis鍵
Redis鍵命令的基本語法如下:
Command key_name
1.del key:當(dāng)key存在時(shí),刪除key
2.dump key: 序列化key,并返回被序列化的值
3.exists key: 檢查key是否存在
4.expire key seconds:為key設(shè)置過期時(shí)間
5.keys pattern: 查找所有符合給定模式的key
6.move key db: 將當(dāng)前的數(shù)據(jù)庫的key移動到給定的數(shù)據(jù)db中
7.persist key:移除key的過期時(shí)間,key將持久保持
8.randomkey:從當(dāng)前數(shù)據(jù)庫隨機(jī)返回一個(gè)key
9.rename key newkey:修改key的名稱
10.renamenx key newkey: 僅當(dāng)newkey 不存在時(shí),將key改名為newkey
11.type key:返回key所存儲的的類型
Redis 事務(wù)
Redis事務(wù)可以一次執(zhí)行多個(gè)命令
批量操作再發(fā)送EXEC命令前被放入隊(duì)列緩存;
收到EXEC命令后進(jìn)入事務(wù)執(zhí)行,事務(wù)中任意命令執(zhí)行失敗,其余的命令依然被執(zhí)行;
在事務(wù)執(zhí)行過程中,其他客戶端提交的命令請求不會插入到事務(wù)執(zhí)行的命令序列中;
一個(gè)事務(wù)從開始到執(zhí)行的三個(gè)階段:
開始事務(wù)à命令入隊(duì)à執(zhí)行事務(wù)
原子性:
單個(gè)Redis命令的執(zhí)行是原子性的,但Redis在事務(wù)上沒有增加任何維持原子性的機(jī)制,所以Redis事務(wù)的執(zhí)行并不是原子性的。
Redis官網(wǎng)的說明:
It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.
?
Eg:
multi
set a aaa
set b bbb
set c ccc
exec
如果set b bbb 失敗了,則set a aaa 不會回滾,set c ccc 還會繼續(xù)執(zhí)行
?
Redis 事務(wù)命令:
DISCARD 取消事務(wù),放棄執(zhí)行事務(wù)塊內(nèi)的所有命令
EXEC 執(zhí)行所有事務(wù)塊內(nèi)的命令
MULTI 標(biāo)記一個(gè)事務(wù)塊的開始
UNWATCH 取消WATCH 命令對所有key的監(jiān)視
WATCH KEY[ KEY…..] 監(jiān)視一個(gè)或多個(gè)key,如果在事務(wù)執(zhí)行之前這些key被其他命令所改動,那么事務(wù)將被打斷。
?
Redis數(shù)據(jù)備份與恢復(fù)
Save 命令用于創(chuàng)建當(dāng)前數(shù)據(jù)庫的備份
語法: save
該命令將在redis安裝目錄中創(chuàng)建dump.rdb文件
恢復(fù)數(shù)據(jù)
只需將備份文件(dump.rdb)移動到安裝目錄并啟動服務(wù)即可,獲取redis目錄可以使用config命令? config get dir
Redis 管道技術(shù)
redis是一種基于客戶端-服務(wù)端模型以及請求/響應(yīng)協(xié)議的TCP服務(wù),遵循以下步驟:
客戶端向服務(wù)端發(fā)送一個(gè)查詢請求,并監(jiān)聽Socket返回,通常是以阻塞模式,等待服務(wù)端響應(yīng);
服務(wù)端處理命令,并將結(jié)果返回給客戶端。
略……
轉(zhuǎn)載于:https://www.cnblogs.com/zhaiyt/p/redis.html
總結(jié)
- 上一篇: 从Bold手环来谈谈无袖带血压计的技术
- 下一篇: 工业数据采集平台