日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

超详细的redis总结

發(fā)布時(shí)間:2025/3/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 超详细的redis总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

NOSQL簡(jiǎn)介

非關(guān)系型數(shù)據(jù)庫(kù)特點(diǎn)

Redis簡(jiǎn)介

redis安裝

redis數(shù)據(jù)類型

String類型

Hash類型(相當(dāng)于map)(取變量名、設(shè)置map中的key?value)

List類型(就像java中的queue)(有的公司利用redis的list做mq)

set(無(wú)序)類型和zset(有序)類型(像java中的list)

zset集合

redis高級(jí)命令

redis的安全性

redis持久化機(jī)制


NOSQL簡(jiǎn)介

? ? NoSQL,泛指非關(guān)系型的數(shù)據(jù)庫(kù),NoSQL數(shù)據(jù)庫(kù)的四大分類:

? ? 鍵值(key-value)存儲(chǔ)數(shù)據(jù)庫(kù):這一類數(shù)據(jù)庫(kù)主要會(huì)使用到一個(gè)哈希表,這個(gè)表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù)。如Redis,Voldemort,Oracle?BDB。

? ? 列存儲(chǔ)數(shù)據(jù)庫(kù):這部分?jǐn)?shù)據(jù)庫(kù)通常是用來(lái)應(yīng)對(duì)分布式存儲(chǔ)的海量數(shù)據(jù)。鍵仍然存在,但是它們的特點(diǎn)是指向了多個(gè)列。如HBase,Riak

? ? 文檔型數(shù)據(jù)庫(kù):該類型的數(shù)據(jù)模型是版本化的文檔,半結(jié)構(gòu)化的文檔以特定的格式存儲(chǔ),比如JSON。文檔型數(shù)據(jù)庫(kù)可以看做是鍵值數(shù)據(jù)庫(kù)的升級(jí)版,允許之間嵌套鍵值。而且文檔型數(shù)據(jù)庫(kù)比鍵值數(shù)據(jù)庫(kù)的查詢效率更高。如:CouchDB,MongoDB

? ? 圖形(Graph)數(shù)據(jù)庫(kù):圖形結(jié)構(gòu)的數(shù)據(jù)庫(kù)同其他行列以及剛性結(jié)構(gòu)的SQL數(shù)據(jù)庫(kù)不同,它是使用靈活的圖形模型,并且能夠擴(kuò)展到多個(gè)服務(wù)器上。NoSQL數(shù)據(jù)庫(kù)沒有標(biāo)準(zhǔn)的查詢語(yǔ)言(SQL),因此進(jìn)行數(shù)據(jù)庫(kù)查詢需要制定數(shù)據(jù)模型。許多NoSQL數(shù)據(jù)庫(kù)都有REST式的數(shù)據(jù)結(jié)構(gòu)或者查詢API。如:Neo4J,InfoGrid,Infinite Graph

非關(guān)系型數(shù)據(jù)庫(kù)特點(diǎn)

1.數(shù)據(jù)模型比較簡(jiǎn)單

2.需要靈活性更強(qiáng)的應(yīng)用系統(tǒng)

3.對(duì)數(shù)據(jù)庫(kù)性能要求較高

4.不需要高度的數(shù)據(jù)一致性

5.對(duì)于給定key,比較容易映射復(fù)雜值的環(huán)境

Redis簡(jiǎn)介

? ? 是以key-value形式存儲(chǔ),和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)不一樣,不一定遵循傳統(tǒng)數(shù)據(jù)庫(kù)的一些要求(非關(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處理非常簡(jiǎn)單);無(wú)法做到太復(fù)雜的關(guān)系數(shù)據(jù)庫(kù)模型

? ? 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è)簡(jiǎn)單地字符串,數(shù)值等等。

? ? set和get方法:

?? ?設(shè)置值:set name xxx?(說(shuō)明:設(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)行指定長(zhǎng)度的遞增和遞減

? ? append [name]?方法(append?name 123:name追加123并返回長(zhǎng)度):字符串追加方法

? ? strlen [name]方法(strlen?name:返回字符串長(zhǎng)度):獲取字符串的長(zhǎng)度

?

Hash類型(相當(dāng)于map)(取變量名、設(shè)置map中的key?value)

? ? Hash類型是String類型的field和value的映射表,或者說(shuō)一個(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ì)的說(shuō),List類型是一個(gè)雙端鏈表的結(jié)構(gòu),我們可以通過相關(guān)操作進(jìn)行集合的頭部或者尾部添加刪除元素,list的設(shè)計(jì)非常簡(jiǎn)單精巧,既可以作為棧,又可以作為隊(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(無(wú)序)類型和zset(有序)類型(像java中的list)

? ? set集合是string類型的無(wú)序集合,set是通過hashtable實(shí)現(xiàn)的,對(duì)集合我們可以取交集、并集、差集。

? ? sadd方法:向名稱為key的set中添加元素

形如:sadd?set1?aaa

?? ?小結(jié):set集合不允許重復(fù)元素(再加重復(fù)的無(wú)效果);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ù)庫(kù) 數(shù)據(jù)庫(kù)為0到15(一共16個(gè)數(shù)據(jù)庫(kù)) 默認(rèn)進(jìn)入的是0數(shù)據(jù)庫(kù)

move [key] [數(shù)據(jù)庫(kù)下標(biāo)] 將當(dāng)前數(shù)據(jù)庫(kù)中的key轉(zhuǎn)移到其他數(shù)據(jù)庫(kù)中

randomkey 隨機(jī)返回?cái)?shù)據(jù)庫(kù)里的一個(gè)key

rename 重命名key

echo 打印命令

dbsize 查看數(shù)據(jù)庫(kù)的key數(shù)量

info 獲取數(shù)據(jù)庫(kù)信息

config get 實(shí)時(shí)傳儲(chǔ)收到的請(qǐng)求(返回相關(guān)的配置信息)

config get * 返回所有配置(相當(dāng)于redis.config的縮影)

flushdb 清空當(dāng)前數(shù)據(jù)庫(kù),flushall 清空所有數(shù)據(jù)庫(kù)

redis的安全性

? ? 因?yàn)閞edis速度相當(dāng)快,所以在一臺(tái)比較好的服務(wù)器下,一個(gè)外部用戶在一秒內(nèi)可以進(jìn)行15W次的密碼嘗試,這意味著你需要設(shè)定非常強(qiáng)大的密碼來(lái)防止暴力破解。

? ? 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í)候都要輸入密碼,還有種簡(jiǎn)單的方式:

直接授權(quán)登錄:redis-cli -a password

redis持久化機(jī)制

? ? redis是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫(kù),也就是說(shuō)redis需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到硬盤來(lái)保證持久化。

? ? 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总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。