超详细的redis总结
目錄
NOSQL簡介
非關(guān)系型數(shù)據(jù)庫特點(diǎn)
Redis簡介
redis安裝
redis數(shù)據(jù)類型
String類型
Hash類型(相當(dāng)于map)(取變量名、設(shè)置map中的key?value)
List類型(就像java中的queue)(有的公司利用redis的list做mq)
set(無序)類型和zset(有序)類型(像java中的list)
zset集合
redis高級(jí)命令
redis的安全性
redis持久化機(jī)制
NOSQL簡介
? ? NoSQL,泛指非關(guān)系型的數(shù)據(jù)庫,NoSQL數(shù)據(jù)庫的四大分類:
? ? 鍵值(key-value)存儲(chǔ)數(shù)據(jù)庫:這一類數(shù)據(jù)庫主要會(huì)使用到一個(gè)哈希表,這個(gè)表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù)。如Redis,Voldemort,Oracle?BDB。
? ? 列存儲(chǔ)數(shù)據(jù)庫:這部分?jǐn)?shù)據(jù)庫通常是用來應(yīng)對(duì)分布式存儲(chǔ)的海量數(shù)據(jù)。鍵仍然存在,但是它們的特點(diǎn)是指向了多個(gè)列。如HBase,Riak
? ? 文檔型數(shù)據(jù)庫:該類型的數(shù)據(jù)模型是版本化的文檔,半結(jié)構(gòu)化的文檔以特定的格式存儲(chǔ),比如JSON。文檔型數(shù)據(jù)庫可以看做是鍵值數(shù)據(jù)庫的升級(jí)版,允許之間嵌套鍵值。而且文檔型數(shù)據(jù)庫比鍵值數(shù)據(jù)庫的查詢效率更高。如:CouchDB,MongoDB
? ? 圖形(Graph)數(shù)據(jù)庫:圖形結(jié)構(gòu)的數(shù)據(jù)庫同其他行列以及剛性結(jié)構(gòu)的SQL數(shù)據(jù)庫不同,它是使用靈活的圖形模型,并且能夠擴(kuò)展到多個(gè)服務(wù)器上。NoSQL數(shù)據(jù)庫沒有標(biāo)準(zhǔn)的查詢語言(SQL),因此進(jìn)行數(shù)據(jù)庫查詢需要制定數(shù)據(jù)模型。許多NoSQL數(shù)據(jù)庫都有REST式的數(shù)據(jù)結(jié)構(gòu)或者查詢API。如:Neo4J,InfoGrid,Infinite Graph
非關(guān)系型數(shù)據(jù)庫特點(diǎn)
1.數(shù)據(jù)模型比較簡單
2.需要靈活性更強(qiáng)的應(yīng)用系統(tǒng)
3.對(duì)數(shù)據(jù)庫性能要求較高
4.不需要高度的數(shù)據(jù)一致性
5.對(duì)于給定key,比較容易映射復(fù)雜值的環(huán)境
Redis簡介
? ? 是以key-value形式存儲(chǔ),和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫不一樣,不一定遵循傳統(tǒng)數(shù)據(jù)庫的一些要求(非關(guān)系型的、分布式的、開源的。水平可擴(kuò)展的)
? ? 優(yōu)點(diǎn):對(duì)數(shù)據(jù)高并發(fā)讀寫(數(shù)據(jù)寫入內(nèi)存);對(duì)海量數(shù)據(jù)的高效率存儲(chǔ)和訪問;對(duì)數(shù)據(jù)的可擴(kuò)展性和高可用性。
? ? 缺點(diǎn):redis(ACID處理非常簡單);無法做到太復(fù)雜的關(guān)系數(shù)據(jù)庫模型
? ? Redis的鍵可以包含:(string)字符串,哈希,(list)鏈表,(set)集合,(zset)有序集合。這些數(shù)據(jù)集合都支持push/pop,add/remove及取交集和并集以及更豐富的操作,redis支持各種不同的方式排序,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中,它也可以周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加到文件里。
? ? 單線程單進(jìn)程,
數(shù)據(jù)持久化的方法:
RDB:定期將數(shù)據(jù)從內(nèi)存刷到硬盤上。
AOF:只要進(jìn)行DML操作(寫操作),就將這個(gè)操作寫到日志里。
redis安裝
下載地址http://redis.io/download安裝步驟:
1 首先需要安裝gcc,把下載好的redis-3.2.1-rc2.tar.gz 放到linux /usr/local文件夾下
2 進(jìn)行解壓 tar -zxvf redis-3.2.1-rc2.tar.gz
3 進(jìn)入到redis-3.2.1目錄下,進(jìn)行編譯 make
4 進(jìn)入到src下進(jìn)行安裝 make install??驗(yàn)證(ll查看src下的目錄,有redis-server 、redis-cil即可)
5 建立倆個(gè)文件夾存放redis命令和配置文件
mkdir -p /usr/local/redis/etc
mkdir -p /usr/local/redis/bin
6 把redis-3.2.1下的redis.conf 移動(dòng)到/usr/local/redis/etc下,
???cp redis.conf /usr/local/redis/etc/
7 把redis-3.2.1/src里的mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-check-dump、redis-cli、redis-server
文件移動(dòng)到bin下,命令:
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin
8 啟動(dòng)時(shí)并指定配置文件:./redis-server /usr/local/redis/etc/redis.conf(注意要使用后臺(tái)啟動(dòng),所以修改redis.conf里的 daemonize 改為yes)
9 驗(yàn)證啟動(dòng)是否成功: ps -ef | grep redis 查看是否有redis服務(wù) 或者 查看端口:netstat -tunpl | grep 6379
進(jìn)入redis客戶端 ./redis-cli 退出客戶端quit 退出redis服務(wù):
(1)pkill redis-server 、
(2)kill 進(jìn)程號(hào)、????????????????????????????
(3)/usr/local/redis/bin/redis-cli shutdown
使用:keys * ;set name value; get name
redis數(shù)據(jù)類型
redis一共分為五種基本數(shù)據(jù)類型:(string)字符串,哈希,(list)鏈表,(set)集合,(zset)有序集合
String類型
? ? String類型是包含很多種類型的特殊類型,并且是二進(jìn)制安全的。比如序列化的對(duì)象進(jìn)行存儲(chǔ),比如一張圖片進(jìn)行二進(jìn)制存儲(chǔ),比如一個(gè)簡單地字符串,數(shù)值等等。
? ? set和get方法:
?? ?設(shè)置值:set name xxx?(說明:設(shè)置name多次會(huì)覆蓋)。
?? ?取值:get name 。
?? ?刪除值:del name。
?? ?使用setnx(not?exist):name如果不存在進(jìn)行設(shè)置,存在就不需要進(jìn)行設(shè)置了,返回0。
?? ?使用setex(expired):setex?color 10?red?設(shè)置color的有效期為10秒,10秒后返回nil(在redis里nil表示空)
?? ?使用setrange?替換字符串:set?email 12345@qq.com?;setrange?email 10?ww(10表示從第幾位開始替換,后面跟上替換的字符串)
? ? 使用一次性設(shè)置多個(gè)和獲取多個(gè)值的mset、mget方法:
mset?key1 val1 key2 val2 key3 val3 ;對(duì)應(yīng)的mget key1 key2 key3方法
? ? 對(duì)應(yīng)的也有msetnx和mget方法。
? ? 一次性設(shè)置和取值的getset方法:
set?key4?val4 ;getset?key4?val44?返回舊值并設(shè)置新值得方法。
? ? incr和decr方法(incr?age:age+1并直接打印):對(duì)某一個(gè)值進(jìn)行遞增和遞減。
? ? incrby和decrby方法(incrby?age 3:age+3并直接打印):對(duì)某個(gè)值進(jìn)行指定長度的遞增和遞減
? ? append [name]?方法(append?name 123:name追加123并返回長度):字符串追加方法
? ? strlen [name]方法(strlen?name:返回字符串長度):獲取字符串的長度
?
Hash類型(相當(dāng)于map)(取變量名、設(shè)置map中的key?value)
? ? Hash類型是String類型的field和value的映射表,或者說一個(gè)String集合。特別適合存儲(chǔ)對(duì)象,相比較而言,每一個(gè)對(duì)象類型存儲(chǔ)在Hash類型里要比存儲(chǔ)在String類型里占用更少的內(nèi)存空間,并方便存取整個(gè)對(duì)象。
? ? 形如hset?myhash?field1?hello(含義是hset是hash集合,myhash是集合名字,field1是字段名hello為其值)使用hmset?myhash?sex?man?addr?beijing批量設(shè)置,也可以使用hmget進(jìn)行批量獲取多個(gè)鍵值對(duì)。
? ? hget?myhash?field1?取值(只能取到hash的某個(gè)字段,不能取整個(gè)hash)。
? ? 同樣也有hsetnx,和setnx大同小異。
? ? hincrby和hdecrby集合遞增和遞減。
? ? hexists?是否存在key,如果存在返回,不存在返回0.
? ? hlen?返回hash集合里的所有的鍵數(shù)值。
? ? hdel:刪除指定的hash的field。
? ? hkeys?返回hash里所有的字段。
? ? hvals?返回hash的所有value。
? ? hgetall?返回hash里所有的key和value。
?
List類型(就像java中的queue)(有的公司利用redis的list做mq)
? ? List類型是一個(gè)鏈表結(jié)構(gòu)的集合,其主要功能有push、pop、獲取元素等。更詳細(xì)的說,List類型是一個(gè)雙端鏈表的結(jié)構(gòu),我們可以通過相關(guān)操作進(jìn)行集合的頭部或者尾部添加刪除元素,list的設(shè)計(jì)非常簡單精巧,既可以作為棧,又可以作為隊(duì)列。滿足絕大多數(shù)需求。
?? ?lpush方法:從頭部加入元素(棧)?先進(jìn)后出
形如:lpush list1 "hello"; lpush list1 "world";lrange?list 0 -1(表示從頭取到末尾,從0位置到-1位置)。
? ? rpush方法:從尾部加入元素(隊(duì)列)?先進(jìn)先出
形如:rpush list2 "beijing"; rpush list2 "sss";?lrange?list2 0 -1?從頭取到尾
? ? linsert方法:在集合中間插入元素
形如:linsert list3 before [集合的元素] [插入的元素]
? ? lset方法:將指定下標(biāo)的元素替換掉
形如:lset?list4 0 "aaa"?
? ? lrem方法:刪除元素,返回刪除的個(gè)數(shù)
形如:lrem?list4 2 "aaa" (移除2個(gè)aaa)
? ? ltrim方法:保留指定key的值范圍內(nèi)的數(shù)據(jù)
形如:ltrim?list5 2 3?保留?第2-3個(gè)元素
? ? lpop方法:從list頭部刪除元素,并返回刪除的元素
形如:lpop?list6?
? ? rpop方法:從list尾部刪除元素,并返回刪除的元素
形如:rpop?list6
? ? rpoplpush方法:第一步從尾部刪除元素,第二步從頭部加入元素
形如:rpoplpush?list8?list8
? ? lindex方法:返回名稱為key的list中index位置的元素
形如:lindex?list8 1
? ? llen方法:返回元素個(gè)數(shù)
形如:llen?list8
?
set(無序)類型和zset(有序)類型(像java中的list)
? ? set集合是string類型的無序集合,set是通過hashtable實(shí)現(xiàn)的,對(duì)集合我們可以取交集、并集、差集。
? ? sadd方法:向名稱為key的set中添加元素
形如:sadd?set1?aaa
?? ?小結(jié):set集合不允許重復(fù)元素(再加重復(fù)的無效果);smembers查看set集合的元素。
形如:smembers?set1
? ? srem方法:刪除set集合元素
? ? spop方法:隨機(jī)返回刪除的key
? ? sdiff方法:返回兩個(gè)集合的不同元素(哪個(gè)集合在前面就以哪個(gè)集合為標(biāo)準(zhǔn))
? ? sdiffstore方法:將返回的不同元素存儲(chǔ)到另一個(gè)集合里
形如:sdiffstore?set3?set1?set2
小結(jié):這里是把set1和set2的不同元素(以set1為準(zhǔn))存儲(chǔ)到set3集合里
? ? sinter方法:返回集合的交集
? ? sinterstroe方法:返回交集結(jié)果,存入set3中
形如:sinterstroe?set3?set1?set2
? ? sunion方法:取并集
? ? sunionstore方法:取得并集,存入set3中
形如:sunionstore?set3?set1?set2
? ? smove方法:從一個(gè)set集合移動(dòng)到另一個(gè)set集合里
形如:smove?set1?set2?a?將set1中的a移動(dòng)到set2,相當(dāng)于剪切復(fù)制
? ? scard方法:查看集合里元素個(gè)數(shù)
? ? sismember方法:判斷某元素是否為集合中的元素
返回1代表是集合中的元素,0代表不是
? ? srandmember方法:隨機(jī)返回一個(gè)元素
形如:srandmember?set1?
zset集合
? ? zadd向有序集合中添加一個(gè)元素,該元素如果存在,則更新順序。
形如:zadd?zset1 6?six (6是序號(hào),six是值)
? ? zrange?zset1 0 -1?withscores?查看集合中的值(withscores表示同時(shí)顯示元素標(biāo)號(hào))
? ? zrem刪除名稱為key的zset中的元素member
形如:zrem?zset1?one?刪除zset1中的one
? ? zincrby?以指定值去自動(dòng)遞增或者減少,用法和之前的incrby類似
? ? zrangebyscore?找到指定區(qū)間范圍的數(shù)據(jù)進(jìn)行返回
? ? zremrangebyrank?刪除1到1(只刪除索引1)
? ? zremrangebyscore?刪除指定序號(hào)
? ? zrank?返回排序索引?從小到大排序(升序排序之后再找索引)
注意?一個(gè)是順序號(hào)?一個(gè)是索引?zrank返回的是索引
? ? zrevrank?返回排序索引?從大到小排序(降序排序之后再找索引)
形如:zrank?set1?four?(升序排序之后再找索引)
? ? zrangebyscore?zset1 2 3?withscore?找到指定區(qū)間范圍的數(shù)據(jù)進(jìn)行返回
? ? zcard?返回集合里所有元素的個(gè)數(shù)
? ? zcount?返回集合中score在給定區(qū)間中的數(shù)量
形如:zcount?zset1 1 4
? ? zremrangebyrank?zset [from] [to]?刪除索引?根據(jù)索引刪除
? ? zremrangebyscore?zset [from] [to]?刪除指定序號(hào)
redis高級(jí)命令
返回滿足的所有鍵 keys * (可以模糊匹配,只能用*)
exists 是否存在指定的key
expire 設(shè)置某個(gè)key的過期時(shí)間,使用ttl查看剩余時(shí)間
persist 取消過期時(shí)間
select 選擇數(shù)據(jù)庫 數(shù)據(jù)庫為0到15(一共16個(gè)數(shù)據(jù)庫) 默認(rèn)進(jìn)入的是0數(shù)據(jù)庫
move [key] [數(shù)據(jù)庫下標(biāo)] 將當(dāng)前數(shù)據(jù)庫中的key轉(zhuǎn)移到其他數(shù)據(jù)庫中
randomkey 隨機(jī)返回?cái)?shù)據(jù)庫里的一個(gè)key
rename 重命名key
echo 打印命令
dbsize 查看數(shù)據(jù)庫的key數(shù)量
info 獲取數(shù)據(jù)庫信息
config get 實(shí)時(shí)傳儲(chǔ)收到的請(qǐng)求(返回相關(guān)的配置信息)
config get * 返回所有配置(相當(dāng)于redis.config的縮影)
flushdb 清空當(dāng)前數(shù)據(jù)庫,flushall 清空所有數(shù)據(jù)庫
redis的安全性
? ? 因?yàn)閞edis速度相當(dāng)快,所以在一臺(tái)比較好的服務(wù)器下,一個(gè)外部用戶在一秒內(nèi)可以進(jìn)行15W次的密碼嘗試,這意味著你需要設(shè)定非常強(qiáng)大的密碼來防止暴力破解。
? ? vi編輯redis.conf文件,找到下面進(jìn)行保存修改
? ? #requirepass footbared
? ? requirepass ****
重啟服務(wù)器 pkill redis-server
? ? 再次進(jìn)入127.0.0.1:6379>keys *
? ? (error) NOAUTH Authentication required.
? ? 會(huì)發(fā)現(xiàn)沒有權(quán)限進(jìn)行查詢127.0.0.1:6379>auth password
? ? OK輸入密碼則成功進(jìn)入
每次進(jìn)入的時(shí)候都要輸入密碼,還有種簡單的方式:
直接授權(quán)登錄:redis-cli -a password
redis持久化機(jī)制
? ? redis是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫,也就是說redis需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到硬盤來保證持久化。
? ? redis持久化的兩種方式:redis.conf中的配置
? ? 1.snapshptting(快照)默認(rèn)方式,將內(nèi)存中以快照的方式寫入到二進(jìn)制文件中。默認(rèn)為dump.rdb,可以通過配置設(shè)置自動(dòng)做快照持久化的方式。我們可以配置redis在n秒內(nèi)如果超過m個(gè)key則修改就自動(dòng)做快照。
? ? snapshotting設(shè)置:
? ? save 900 1 #900秒內(nèi)如果超過1個(gè)key被修改,則發(fā)起快照保存
? ? save 300 10 #300秒內(nèi)如果超過10個(gè)key被修改,則發(fā)起快照保存
? ? save 60 10000
? ? 2.append-only?file(縮寫aof)的方式(有點(diǎn)類似于oracle日志),由于快照方式是在一定時(shí)間間隔做一次,所以可能發(fā)生redis以外down的情況就會(huì)丟失最后一次快照后的所有修改的數(shù)據(jù)、aof比快照方式有更好的持久化性,是由于在使用aof時(shí),redis會(huì)將每一個(gè)收到的寫命令都通過write函數(shù)追加到命令中,當(dāng)redis重新啟動(dòng)appendonly.aof。aof不是立即寫到硬盤上,可以通過配置文件修改強(qiáng)制寫到硬盤中。
? ? aof設(shè)置:
? ? appendonly yes //啟動(dòng)aof持久化方式有三種修改方式:
? ? #appendfsync?always //收到寫命令就立刻寫入到磁盤,效率最慢,但是保證完全的持久化
? ? #appendfsync?everysec //每秒鐘寫入磁盤一次,在性能和持久化方面做了很好的折中
? ? #appendfsync?no //完全依賴os?性能最好,持久化沒保證
開啟aof之后,rdb就失效了。
?
總結(jié)
以上是生活随笔為你收集整理的超详细的redis总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java使用sigar监控服务器
- 下一篇: springcloud都有什么组件?这个