Linux系統(tǒng)Redis筆記教學(xué)內(nèi)容_第1頁(yè)
Linux系統(tǒng)Redis筆記教學(xué)內(nèi)容_第2頁(yè)
Linux系統(tǒng)Redis筆記教學(xué)內(nèi)容_第3頁(yè)
Linux系統(tǒng)Redis筆記教學(xué)內(nèi)容_第4頁(yè)
Linux系統(tǒng)Redis筆記教學(xué)內(nèi)容_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1課程安排

1.介紹

2.安裝啟動(dòng)及關(guān)閉

3Jedis使用

4.Redis各種數(shù)據(jù)類型的操作

5.Redis持久化方案

6.主從復(fù)制(了解)

2課程目標(biāo)

掌握Redis的安裝

掌握redis常用數(shù)據(jù)結(jié)構(gòu)(string/hash/list/sortedset)的存取數(shù)據(jù)方法

掌握J(rèn)edis的用法

3redis介紹

3.1什么是NoSQL

NoSQL,泛指非關(guān)系型的數(shù)據(jù)庫(kù),NoSQL即Not-OnlySQL,它可以作為關(guān)系型數(shù)據(jù)庫(kù)的良好

補(bǔ)充。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,非關(guān)系型的數(shù)據(jù)庫(kù)現(xiàn)在成了一個(gè)極其熱門的新領(lǐng)域,

非關(guān)系數(shù)據(jù)庫(kù)產(chǎn)品的發(fā)展非常迅速。而傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)在應(yīng)付web2.0網(wǎng)站,特別是超大

規(guī)模和高并發(fā)的SNS類型的web2.0純動(dòng)態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的

問題,例如:

1、Highperformance-對(duì)數(shù)據(jù)庫(kù)高并發(fā)讀寫的需求

web2.0網(wǎng)站要根據(jù)用戶個(gè)性化信息來實(shí)時(shí)生成動(dòng)態(tài)頁(yè)面和提供動(dòng)態(tài)信息,所以基本上無法

使用動(dòng)態(tài)頁(yè)面靜態(tài)化技術(shù),因此數(shù)據(jù)庫(kù)并發(fā)負(fù)載非常高,往往要達(dá)到每秒上萬次讀寫請(qǐng)求。

關(guān)系數(shù)據(jù)庫(kù)應(yīng)付上萬次SQL查詢還勉強(qiáng)頂?shù)米?,但是?yīng)付上萬次SQL寫數(shù)據(jù)請(qǐng)求,硬盤10

就已經(jīng)無法承受了。其實(shí)對(duì)于普通的BBS網(wǎng)站,往往也存在對(duì)高并發(fā)寫請(qǐng)求的需求,例如

網(wǎng)站的實(shí)時(shí)統(tǒng)計(jì)在線用戶狀態(tài),記錄熱門帖子的點(diǎn)擊次數(shù),投票計(jì)數(shù)等,因此這是一個(gè)相

當(dāng)普遍的需求。

2、HugeStorage-對(duì)海量數(shù)據(jù)的高效率存儲(chǔ)和訪問的需求

類似Facebook,twitter,Friendfeed這樣的SNS網(wǎng)站,每天用戶產(chǎn)生海量的用戶動(dòng)態(tài),以

Friendfeed為例,一個(gè)月就達(dá)到了2.5億條用戶動(dòng)態(tài),對(duì)于關(guān)系數(shù)據(jù)庫(kù)來說,在一張2.5億

條記錄的表里面進(jìn)行SQL查詢,效率是極其低下乃至不可忍受的。再例如大型web網(wǎng)站的

用戶登錄系統(tǒng),例如騰訊,盛大,動(dòng)輒數(shù)以億計(jì)的帳號(hào),關(guān)系數(shù)據(jù)庫(kù)也很難應(yīng)付。

3、HighScalability&&HighAvailability-對(duì)數(shù)據(jù)庫(kù)的高可擴(kuò)展性和高可用性的需求

在基于web的架構(gòu)當(dāng)中,數(shù)據(jù)庫(kù)是最難進(jìn)行橫向擴(kuò)展的,當(dāng)一個(gè)應(yīng)用系統(tǒng)的用戶量和訪問

量與日俱增的時(shí)候,你的數(shù)據(jù)庫(kù)卻沒有辦法像webserver和appserver那樣簡(jiǎn)單的通過添加

更多的硬件和服務(wù)節(jié)點(diǎn)來擴(kuò)展性能和負(fù)載能力。對(duì)于很多需要提供24小時(shí)不間斷服務(wù)的網(wǎng)

站來說,對(duì)數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行升級(jí)和擴(kuò)展是非常痛苦的事情,往往需要停機(jī)維護(hù)和數(shù)據(jù)遷移,

為什么數(shù)據(jù)庫(kù)不能通過不斷的添加服務(wù)器節(jié)點(diǎn)來實(shí)現(xiàn)擴(kuò)展呢?

NoSQL數(shù)據(jù)庫(kù)的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重?cái)?shù)據(jù)種類帶來的挑戰(zhàn),尤其是大數(shù)

據(jù)應(yīng)用難題。

一些主流的NOSQL產(chǎn)品:

.■R■ed■is

■需rassandra

CouchDB

relaxmongoDB

S^Lmembase*riak

NoSQL數(shù)據(jù)庫(kù)的四大分類如下:

鍵值(Key-Value)存儲(chǔ)數(shù)據(jù)庫(kù)

相關(guān)產(chǎn)品:TokyoCabinet/Tyrant、Redis、Voldemort、BerkeleyDB

典型應(yīng)用:內(nèi)容緩存,主要用于處理大量數(shù)據(jù)的高訪問負(fù)載。

數(shù)據(jù)模型:一系列鍵值對(duì)

優(yōu)勢(shì):快速查詢

劣勢(shì):存儲(chǔ)的數(shù)據(jù)缺少結(jié)構(gòu)化

列存儲(chǔ)數(shù)據(jù)庫(kù)

相關(guān)產(chǎn)品:Cassandra,HBase,Riak

典型應(yīng)用:分布式的文件系統(tǒng)

數(shù)據(jù)模型:以列簇式存儲(chǔ),將同一列數(shù)據(jù)存在一起

優(yōu)勢(shì):查找速度快,可擴(kuò)展性強(qiáng),更容易進(jìn)行分布式擴(kuò)展

劣勢(shì):功能相對(duì)局限

文檔型數(shù)據(jù)庫(kù)

相關(guān)產(chǎn)品:CouchDB、MongoDB

典型應(yīng)用:Web應(yīng)用(與Key-Value類似,Value是結(jié)構(gòu)化的)

數(shù)據(jù)模型:一系列鍵值對(duì)

優(yōu)勢(shì):數(shù)據(jù)結(jié)構(gòu)要求不嚴(yán)格

劣勢(shì):查詢性能不高,而且缺乏統(tǒng)一的查詢語(yǔ)法

圖形(Graph)數(shù)據(jù)庫(kù)

相關(guān)數(shù)據(jù)庫(kù):

Neo4JsInfoGrid.InfiniteGraph

典型應(yīng)用:社交網(wǎng)絡(luò)

數(shù)據(jù)模型:圖結(jié)構(gòu)

優(yōu)勢(shì):利用圖結(jié)構(gòu)相關(guān)算法。

劣勢(shì):需要對(duì)整個(gè)圖做計(jì)算才能得出結(jié)果,不容易做分布式的集群方案。

3.2redis歷史發(fā)展

2008年,意大利的一家創(chuàng)業(yè)公司Merzia推出了一款基于MySQL的網(wǎng)站實(shí)時(shí)統(tǒng)計(jì)系統(tǒng)

LLOOGG,然而沒過多久該公司的創(chuàng)始人SalvatoreSanfilippo便對(duì)MySQL的性能感到失望,

于是他決定親自為L(zhǎng)LOOGG量身定做一個(gè)數(shù)據(jù)庫(kù),并于2009年開發(fā)完成,這個(gè)數(shù)據(jù)庫(kù)就是

不過并不滿足只將用于這一款產(chǎn)品,而是希望更

RedisoSalvatoreSanfilippoRedisLLOOGG

多的人使用它,于是在同一年SalvatoreSanfilippo將Redis開源發(fā)布,并開始和Redis的另

一名主要的代碼貢獻(xiàn)者PieterNoordhuis一起繼續(xù)著Redis的開發(fā),直到今天。

SalvatoreSanfilippo自己也沒有想到,短短的幾年時(shí)間,Redis就擁有了龐大的用戶群體。

HackerNews在2012年發(fā)布了一份數(shù)據(jù)庫(kù)的使用情況調(diào)查,結(jié)果顯示有近12%的公司在使

用國(guó)內(nèi)如新浪微博、街旁網(wǎng)、知乎網(wǎng),國(guó)外如、等都

RedisoGitHubStackOverflowsFlickr

是Redis的用戶。

VMware公司從2010年開始贊助Redis的開發(fā),SalvatoreSanfilippo和PieterNoordhuis也

分別在3月和5月加入VMware,全職開發(fā)Redis。

3.3什么是redis

Redis是用C語(yǔ)言開發(fā)的一個(gè)開源的高性能鍵值對(duì)(key-value)數(shù)據(jù)庫(kù)。它通過提供多種鍵

值數(shù)據(jù)類型來適應(yīng)不同場(chǎng)景下的存儲(chǔ)需求,目前為止Redis支持的鍵值數(shù)據(jù)類型如

下:

字符串類型

散列類型

列表類型

集合類型

有序集合類型。

3.4redis的應(yīng)用場(chǎng)景

緩存(數(shù)據(jù)查詢、短連接、新聞內(nèi)容、商品內(nèi)容等等)。(最多使用)

分布式集群架構(gòu)中的session分離。

聊天室的在線好友列表。

任務(wù)隊(duì)列。(秒殺、搶購(gòu)、12306等等)

應(yīng)用排行榜。

網(wǎng)站訪問統(tǒng)計(jì)。

數(shù)據(jù)過期處理(可以精確到毫秒)

客戶,訂單,訂單明細(xì),地址模型來對(duì)比下關(guān)系型數(shù)據(jù)和非關(guān)系型數(shù)據(jù)庫(kù)

CAP:C強(qiáng)一致性A高可用P分布式容錯(cuò)性

CA傳統(tǒng)Oracle數(shù)據(jù)庫(kù)

AP大多數(shù)網(wǎng)站架構(gòu)的選擇

CPRedis、Mongodb

BASE:

基本可用

軟狀態(tài)

最終一致

4測(cè)試環(huán)境

redis需要安裝在linux服務(wù)器上運(yùn)行測(cè)試,本教程使用linux虛擬機(jī)

5安裝運(yùn)行redis

5.1redis安裝環(huán)境

redis是C語(yǔ)言開發(fā),建議在linux上運(yùn)行,本教程使用Centos6.4作為安裝環(huán)境。

安裝redis需要先將官網(wǎng)下載的源碼進(jìn)行編譯,編譯依賴gcc環(huán)境,如果沒有g(shù)cc

環(huán)境,需要安裝gcc:yuminstallgcc-c++

5.2redis安裝

版本說明

本教程使用redis3.0版本。3.0版本主要增加了redis集群功能。

源碼下載

從官網(wǎng)下載

http://download.redis.io/releases/redis-3.0.0.tar.gz

將redis-3.0.0.tar.gz拷貝到/usr/local下

解壓源碼

tar-xzvfredis-3.0.0.tar.gz-C/usr/local/software

進(jìn)入解壓后的目錄進(jìn)行編譯

cd/usr/local/software/redis-3.0.0

安裝到指定目錄,如/usr/local/redis

makeinstallPREFIX=/usr/local/redis

安裝目錄bin下的文件列表

-rwxrwxrwx.1rootroot41693584月1601:09redis-benchmark

-rwxrwxrwx.1rootroot164634月1601:09redis-check-aof

-rwxrwxrwx.1rootroot376954月1601:09redis-check-dump

-rwxrwxrwx.1rootroot42581284月1601:09redis-cli

-rw-r——r——.1rootroot415094月2818:19redis.conf

1rwxrwxrwx.1rootroot124月1601:09redis-sentinel->redis-server

-rwxrwxrwx.1rootroot56879614月1601:09redis-server

文件名說明

redis-seiverRedis服務(wù)器

redis-cliRedis命令行客戶端

redis-benchmarkRedis性能測(cè)試工具

ledis-check-aofAOF文件修復(fù)工具

ledis-clieck-dmupRDB文件檢查工具

redis3.0新增的redis-sentinel是redis集群管理工具可實(shí)現(xiàn)高可用。

即置文件目錄:

Yoot@server01bin]#cd../conf

root@server01conf]#11

總用量44

;rw-r--r—.1rootroot414034月1618:02redis.conf

5.3redis啟動(dòng)

5.3.1前端模式啟動(dòng)

直接運(yùn)行bin/redis-server將以前端模式啟動(dòng),前端模式啟動(dòng)的缺點(diǎn)是ssh命令窗口關(guān)閉

則redis-server程序結(jié)束,不推薦使用此方法。如下圖:

GENERAL##*################*######—#######

*BydefaultRedisdoesnotrunasadaemon,use'yes'ifyouneedit.

*NotethatRediswillwriteapidfilein/var/run/redis.pidwhendaemonized.

daemonizeno

?whenrunningdaemonized,Rediswritesapidfilein/var/run/redis.pidby

*default.Youcanspecifyacustompidfilelocationhere.

aidfile/var/run/redis.pid

#Acceptconnectionsonthespecifiedport,defaultis6379.

*ifport0isspecifiedRediswillnotlistenonaTCPsocket,

port6379

./conf/red1s.conf"938L.41403Cwritten

[rootOserverOlbin]#./redis-server

2583:c17Apr17:29:28.541#warning:noconfigfilespecified,usingthedefaultconfig.Inordertospecifyaconfigfileuse./redis-s

er/path/to/redis.conf

2583:M17Apr17:29:28.545.Increasedmaximumnumberofopenfilesto10032(itwasoriginallysetto1024).

2583:M17Apr17:29:28.590#warning:32bitinstancedetectedbutnomemorylimitset.setting3GBmaxmemorylimitwith'noeviction'po

/now.

Redis3.0.0(00000000/0)32bit

Runninginstandalonemode

Port:6379

PID:2583

http://redis.io

2583:M17Apr17:29:28.599#Serverstarted,Redisversion3.0.0

2583:M17Apr17:29:28.600#WARNINGovercommit_memoryissettoO'Backgroundsavemayfailunderlowmemorycondition.Tofixthi:

dd,vm.overcommir.memory-1'to/etc/sysctl.confandthenrebootorrunthecommandsysctlvtn.overcommit_memory-l'forthis_j:nral

2583:M17Apr17:29:28.601#WARNING:TheTCPbacklogsettingof511cannotbeenforcedbecause/proc/sys/net/core/soaiaxconn

□wervalueof128.

2583:M17Apr17:29:28.601?Theserverisnowreadytoacceptconnectionsonport6379

5.3.2后端模式啟動(dòng)

修改redis.conf配置文件,daemonizeyes以后端模式啟動(dòng)。

redis.conf是redis的配置文件,redis.conf在redis源碼目錄。

把redis-3.0.0/redis.conf復(fù)制到/usr/local/redis/bin目錄下

cp/usr/local/software/redis-3.0.0/redis.conf

/usr/local/redis/bin

修改redis.conf配置文件,daemonizeyes以后端模式啟動(dòng)。

執(zhí)行如下命令啟動(dòng)redis:

cd/usr/local/redis

[root@localhostbin]#./redis-serverredis.conf

redis默認(rèn)使用6379端口。

[root@server01redis]#psauxIgrepredis

root51100.50.1355521724?Ssl19:040:00./bin/redis-server?:6379

也可更改redis.conf文件,修改端口號(hào):

#Acceptconnectionsonthespecifiedport,defaultis6379.

#Ifport0isspecifiedRediswillnotlistenonaTCPsocket.

port6379

5.4redis停止

強(qiáng)行終止Redis進(jìn)程可能會(huì)導(dǎo)致redis持久化數(shù)據(jù)丟失。正確停止Redis的方

式應(yīng)該是向Redis發(fā)送SHUTDOWN命令,方法為:

cd/usr/local/redis

./bin/redis-clishutdown

5.5redis客戶端

在redis的安裝目錄中有redis的客戶端,即redis-cli(RedisCommandLineInterface),

它是Redis自帶的基于命令行的Redis客戶端。

5.5.1連接「edis月艮務(wù)端

執(zhí)行bin/redis-cli連接redis服務(wù)端:

[root@server01bin]#./redis-cli

couldnotconnecttoRedisat:6379:Connectionrefused

從上圖得知redis-cli默認(rèn)連接本機(jī)的redis,本機(jī)的redis沒有啟動(dòng)則報(bào)上圖中的錯(cuò)誤。

[root@combin]#./redis-serverredis.conf

[root@combin]#./redis-cli

:6379>

指定連接redis服務(wù)的ip和端口:

[root@server01bin]#./redis-cli-h-p6379

:6379>

552向redis服務(wù)端發(fā)送命令

redis-cli連上redis服務(wù)后,可以在命令行發(fā)送命令。

Ping

Redis提供了PING命令來測(cè)試客戶端與Redis的連接是否正常,如果連接正常會(huì)收到回

復(fù)PONG

[root@serverOlbin]#./redis-cli-h-p6379

:6379>ping

PONG

set/get

使用set和get可以向redis設(shè)置數(shù)據(jù)、獲取數(shù)據(jù)。

:6379>setnamezhangsan

OK

:6379>getname

"zhanasan',

del

刪除指定key的內(nèi)容。

例如:delname

Keys*

查看當(dāng)前庫(kù)中所有的key值

5.6redis多數(shù)據(jù)庫(kù)

5.6.1redis實(shí)例

一個(gè)redis進(jìn)程就是一個(gè)redis實(shí)例,一臺(tái)服務(wù)器可以同時(shí)有多個(gè)redis實(shí)例,不同的

redis實(shí)例提供不同的服務(wù)端口對(duì)外提供服務(wù),每個(gè)redis實(shí)例之間互相影響。每個(gè)redis

實(shí)例都包括自己的數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)中可以存儲(chǔ)自己的數(shù)據(jù)。

5.6.2多數(shù)據(jù)庫(kù)測(cè)試

一個(gè)Redis實(shí)例可以包括多個(gè)數(shù)據(jù)庫(kù),客戶端可以指定連接某個(gè)redis實(shí)例的哪個(gè)數(shù)據(jù)

庫(kù),就好比一個(gè)mysql中創(chuàng)建多個(gè)數(shù)據(jù)庫(kù),客戶端連接時(shí)指定連接哪個(gè)數(shù)據(jù)庫(kù)。

一個(gè)redis實(shí)例最多可提供16個(gè)數(shù)據(jù)庫(kù),下標(biāo)從0到15,客戶端默認(rèn)連接第0號(hào)數(shù)據(jù)

邑-螞一涯耳利巴控?fù)襁B接哪個(gè)數(shù)據(jù)庫(kù),如下連接1號(hào)庫(kù):

192'168^10^3:6379>select1

OK

:6379[1]>|

在1號(hào)庫(kù)中查詢上節(jié)設(shè)置的數(shù)據(jù),結(jié)果查詢不到:

:6379[1]>getname

(nil)一__

重新選擇第0號(hào)數(shù)據(jù)庫(kù),查詢數(shù)據(jù):

:6379[1]>select0

OK

:6379>getname

"zhanasan"

如果選擇一個(gè)不存在數(shù)據(jù)庫(kù)則會(huì)報(bào)錯(cuò):

:6379>select16

(error)ERRinvalidDBindex

注意:redis不支持修改數(shù)據(jù)庫(kù)的名稱,只能通過select。、select1…選擇數(shù)據(jù)庫(kù)。

5.6.3注意問題

在0號(hào)數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù),在1號(hào)數(shù)據(jù)庫(kù)執(zhí)行清空數(shù)據(jù)命令卻把0號(hào)數(shù)據(jù)庫(kù)的數(shù)據(jù)給清

空了:

:6379[1]>select0

OK

:6379>setnamezhangsan

OK

:6379>getname

"zhangsan"

:6379>select1

OK

:6379[1]>getname

(nil)

:6379[1]>flushall

OK

:6379[1]>select0

OK

:6379>getname

(nil)

建議:不同的應(yīng)用系統(tǒng)要使用不同的redis實(shí)例而不是使用同一個(gè)redis實(shí)例下的不同

數(shù)據(jù)庫(kù)。

6jedis

6.1jedis介紹

Redis不僅是使用命令來操作,現(xiàn)在基本上主流的語(yǔ)言都有客戶端支持,比如java、C、

C#、C++、php、Node.js、Go等。

在官方網(wǎng)站里列一些Java的客戶端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官

方推薦使用Jedis和Redisson。在企業(yè)中用的最多的就是Jedis,下面我們就重點(diǎn)學(xué)習(xí)下

JediSo

Jedis同樣也是托管在github上,地址:https:〃/xetorthio/jedis

6.2通過jedis連接redis單機(jī)

6.2.1jar包

jar包如下:

Qcommons-pool2-2.3.jar

■jedis_2,7.0.jar

6.2.2單實(shí)例連接

通過創(chuàng)建單實(shí)例jedis對(duì)象連接redis服務(wù),如下代碼:

//單實(shí)例連接redis

@Test

publicvoidtest3edisSingle(){

:Jedisjedis=new3edis("192.168.32.250",6379);

jedis.set("name"/'bar");

Stringname=jedis.get("name");

System.out.println(name);

jedis.close();

)

622.1連接超時(shí)解決

由于linux防火墻默認(rèn)開啟,redis的服務(wù)端口6379并不在開放規(guī)則之內(nèi),所有需要將

此端口開放訪問或者關(guān)閉防火墻。

關(guān)閉防火墻命令:seviceiptablesstop

如果是修改防火墻規(guī)則,可以修改:/etc/sysconfig/iptables文件

6.2.3使用連接池連接

通過單實(shí)例連接redis不能對(duì)redis連接進(jìn)行共享,可以使用連接池對(duì)redis連接進(jìn)行共

享,提高資源利用率,使用jedisPool連接redis服務(wù),如下代碼:

〃創(chuàng)建連接池

JedisPoolpool=newJedisPool("192.168.32.250",6379);

〃獲取連接

3edisjedis=pool.getResource();

〃存入

jedis.set("key3"/'aaa");

〃取出

System.out.printin(jedis.get("key3"));

〃使用連接時(shí),連接使用完后一定要關(guān)閉,關(guān)閉后連接會(huì)自動(dòng)回到連接池供別人使用,如果

一直不關(guān)閉則連接被耗盡之后就會(huì)死機(jī)

jedis.close();

〃關(guān)閉武褊

pool.close();

詳細(xì)的連接池配置參數(shù)參考下節(jié)jedis和spring整合中applicationContext.xml的配置內(nèi)

容。

6.2.4jedis與spring整合

配置spring配置文件applicationContext.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springfram/schema/beans"

xmlns:xsi=H/2001/XMLSchema-instance"

xmlns:mvc="http://www.springframew/schema/mvc"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframew/schema/aop"

xmlns:tx="http://www.springframew/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframew/schema/beans/spring-beans-3.2.xsd

http://www.springframework.org/schema/mvc

http://www.springframew/schema/mvc/spring-mvc-3.2.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.2.xsd

http://www.springframework.org/schema/aop

http://www.springframework.Org/schema/aop/spring-aop-3.2.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.2.xsd*'>

<!--連接池配置-->

<beanid="jedisPooLConfig,,class="redis.cLients.jedis.JedisPooLConfig">

<!--最大連接數(shù)-->

<propertyname=n/naxTotc?LMvalue=n30*7>

<!--最大空閑連接數(shù)

<propertyname=nwaxIc/LeMvalue=H10,7>

<!--每次釋放連接的最大數(shù)目一)

<propertynav(\e=,'numTestsPerEvictionRunHvalue=H1024"/>

<!--釋放連接的掃描間隔(毫秒)一)

<propertynar(\e="timeBetMeenEvictionRunsMiLLis"\/al\Ae="30000,,/>

<!--連接最小空閑時(shí)間-->

<propertynar(\e="minEvictabLeIdLeTimeMiLLis,,\/alue="1800000"/>

<!一連接空閑多久后釋放,當(dāng)空閑時(shí)間》該值且空閑連接)最大空閑連接數(shù)時(shí)直接釋

放-->

<propertynar(\e=',softMinEvictabLeIdLeTimeMiLLis"\/alue=',10000"/>

<!--獲取連接時(shí)的最大等待毫秒數(shù),小于零:阻塞不確定的時(shí)間,默認(rèn)-1

<propertyname=,,zncrxh/aitMilLis"value=H1500,7>

<!--在獲取連接的時(shí)候檢查有效性,默認(rèn)false-->

<propertyname=,,testOnBorrok/Kvalue=ntrue"/>

<!--在空閑時(shí)檢查有效性,默認(rèn)false-->

<propertyname=,,testh//7iLeIdLeHvalue=Htri/e”/>

<!--連接耗盡時(shí)是否阻塞,false報(bào)異常,ture阻塞直到超時(shí),默認(rèn)true-->

<propertyname="bLock^henExhausted,,\/alue=,'faLse,,/>

</bean>

<!--redis單機(jī)通過連接池

<beanid="jedisPoo£"class=nredis.cLients.jedis.JedisPooL"destroy-

method=nctose,r>

<constructor-argname="poolConfig"ref="jedisPoolConfig"/>

<constructor-argname="host"value="50"/>

<constructor-argname="port"value=,,6379,,/>

</bean>

</beans>

測(cè)試代碼:

privateApplicationContextapplicationcontext;

0Before

publicvoidinit(){

applicationContext=newClassPathXmlApplicationContext(

"classpath:applicationcontext.xml");

)

@Test

publicvoidtest3edisPool(){

JedisPoolpool=(OedisPool)applicationcontext.getBean("jedisPool");

try(

Dedisjedis=pool.getResource();

jedis.set(?'name'1,"lisi");

Stringname=jedis.get("name");

System.out.printin(name);

}catch(Exceptionex){

ex.printStackTrace();

}finally{

if(jedis!=null){

〃關(guān)閉連接

jedis.close();

)

)

)

7數(shù)據(jù)類型--string

7.1redisstring介紹

redis中沒有使用C語(yǔ)言的字符串表示,而是自定義一個(gè)數(shù)據(jù)結(jié)構(gòu)叫SDS(simple

dynamicstring)即簡(jiǎn)單動(dòng)態(tài)字符串。

打開下載的redis源碼包,找到src下的sds.h文件查看sds源碼:

structsdshdr{

〃字符串長(zhǎng)度

unsignedintlen;

//buf數(shù)組中未使用的字節(jié)數(shù)量

unsignedintfree;

〃用于保存字符串

charbuf[];

);

c語(yǔ)言對(duì)字符串的存儲(chǔ)是使用字符數(shù)組,遇到‘'0’字符則認(rèn)為字符串結(jié)束,redis的字符

串可以存儲(chǔ)任何類型的數(shù)據(jù),因?yàn)槿魏晤愋蛿?shù)據(jù)都可以表示成二進(jìn)制,sds結(jié)構(gòu)中的

charbuf口就是存儲(chǔ)了二進(jìn)制數(shù)據(jù)。

redis的字符串是二進(jìn)制安全的,什么是二進(jìn)制安全?簡(jiǎn)單理解就是存入什么數(shù)據(jù)取出

的還是什么數(shù)據(jù)。redis中的sds不像c語(yǔ)言處理字符串那樣遇到字符則認(rèn)證字符串

結(jié)束,它不會(huì)對(duì)存儲(chǔ)進(jìn)去的二進(jìn)制數(shù)據(jù)進(jìn)行處理,存入什么數(shù)據(jù)取出還是什么數(shù)據(jù)。

7.2命令

7.2.1賦值

SETkeyvalue

:6379>settest123

OK

7.2.2取值

賦值與取值:

GETkey

:6379>gettest

"123"

當(dāng)鍵不存在時(shí)返回空結(jié)果。

GETSETkeyvalue

取值時(shí)同時(shí)對(duì)key進(jìn)行賦值操作。

7.2.3刪除

Delkey

:6379>deltest

(integer)1

7.2.4數(shù)值增減

遞增數(shù)字

INCRkey

當(dāng)存儲(chǔ)的字符串是整數(shù)時(shí),Redis提供了一個(gè)實(shí)用的命令I(lǐng)NCR,其作用是讓當(dāng)前鍵值遞

增,并返回遞增后的值。

:6379>incrnum

(integer)1

:6379>incrnum

(integer)2

:6379>incrnum

(integer)3

增加指定的整數(shù)

INCRBYkeyincrement

示例:

:6379>incrbynum2

(integer)5

:6379>incrbynum2

(integer)7

:6379>incrbynum2

(integer)9

遞減數(shù)值

DECRkey

7.2.5其它命令(自學(xué))

減少指定的整數(shù)

DECRBYkeydecrement

示例:

:6379>deernum

(integer)6

:6379>deernum

(integer)5

:6379>deerbynum3

(integer)2

:6379>deerbynum3

(integer)-1

向尾部追加值

APPENDkeyvalue

的作用是向鍵值的末尾追加如果鍵不存在則將該鍵的值設(shè)置為

APPENDvalueovalue,

即相當(dāng)于SETkeyvalue。返回值是追加后字符串的總長(zhǎng)度。

127.0.0,1:6379>setstrhello

OK

:6379>appendstr"world!"

(integer)12

:6379>getstr

"helloworld!*'

獲取字符串長(zhǎng)度

STRLENkey

STRLEN命令返回鍵值的長(zhǎng)度,如果鍵不存在則返回0。

:6379>strlenstr

(integer)0

:6379>setstrhello

OK

:6379>strlenstr

(integer)5

同時(shí)設(shè)置/獲取多個(gè)鍵值

MSETkeyvalue[keyvalue■■]■

MGETkey[key--]

:6379>msetklvlk2v2k3v3

OK

:6379>getkl

"vl"

:6379>mgetklk3

1)"vl"

2)"v3"

8數(shù)據(jù)類型—hash

8.1使用string的問題

假設(shè)有User對(duì)象以JSON序列化的形式存儲(chǔ)到Redis中,User對(duì)象有id,username,

password,age、name等屬性,存儲(chǔ)的過程如下:

保存、更新:

User對(duì)象json(string)redis

如果在業(yè)務(wù)上只是更新age屬性,其他的屬性并不做更新我應(yīng)該怎么做呢?如果仍然采

用上邊的方法在傳輸、處理時(shí)會(huì)造成資源浪費(fèi),下邊講的hash可以很好的解決這個(gè)問

題。

8.2redishash介紹

hash叫散列類型,它提供了字段和字段值的映射。字段值只能是字符串類型,不支持

散列類型、集合類型等其它類型。如下:

鍵字段字段值

8.3命令

8.3.1賦值

HSETkeyfieldvalue一次只能設(shè)置一個(gè)字段值

:6379>hsetuserusernamezhangsan

(integer)1

HMSETkeyfieldvalue[fieldvalue...]一次可以設(shè)置多個(gè)字段值

:6379>hmsetuserage20usernamelisi

OK

8.3.2取值

HGETkeyfield一次只能獲取一個(gè)字段值

:6379>hgetuserusername

"zhangsan”

HMGETkeyfield[field…1一次可以獲取多個(gè)字段值

:6379>hmgetuserageusername

1)"20"

2)“l(fā)isi”

HGETALLkey

:6379>hgetalluser

1)"age"

2)"20"

3)"username"

4),,lisin

HSET命令不區(qū)分插入和更新操作,當(dāng)執(zhí)行插入操作時(shí)HSET命令返回1,當(dāng)執(zhí)行更新操

作時(shí)返回0.

8.3.3刪除字段

可以刪除一個(gè)或多個(gè)字段,返回值是被刪除的字段個(gè)數(shù)

HDELkeyfield[field...]

:6379>hdeluserage

(integer)1

:6379>hdeluseragename

(integer)0

:6379>hdeluserageusername

(integer)1

8.3.4增加數(shù)字

HINCRBYkeyfieldincrement

:6379>hincrbyuserage2將用戶的年齡加2

(integer)22

:6379>hgetuserage獲取用戶的年齡

"22”

8.3.5其它命令(自學(xué))

判斷字段是否存在

HEXISTSkeyfield

:6379>hexistsuserage查看user中是否有age字段

(integer)1

:6379>hexistsusername查看user中是否有name字段

(integer)0

HSETNXkeyfieldvalue

當(dāng)字段不存在時(shí)賦值,類似HSET,區(qū)別在于如果字段已經(jīng)存在,該命令不執(zhí)行任何操

作。

:6379>hsetnxuserage30如果user中沒有age字段則設(shè)置age值為30,否則

不做任何操作

(integer)0

只獲取字段名或字段值

HKEYSkey

HVALSkey

:6379>hmsetuserage20namelisi

OK

:6379>hkeysuser

1)“age”

2)"name"

:6379>hvalsuser

1)“20”

2)"lisi"

獲取字段數(shù)量

HLENkey

:6379>hlenuser

(integer)2

9數(shù)據(jù)類型一list

9.1ArrayList與LinkedList的區(qū)別

ArrayList使用數(shù)組方式存儲(chǔ)數(shù)據(jù),所以根據(jù)索引查詢數(shù)據(jù)速度快,而新增或者刪除元素

時(shí)需要設(shè)計(jì)到位移操作,所以比較慢。

LinkedList使用雙向鏈接方式存儲(chǔ)數(shù)據(jù),每個(gè)元素都記錄前后元素的指針,所以插入、

刪除數(shù)據(jù)時(shí)只是更改前后元素的指針指向即可,速度非???,然后通過下標(biāo)查詢?cè)?/p>

時(shí)需要從頭開始索引,所以比較慢,但是如果查詢前幾個(gè)元素或后幾個(gè)元素速度比較

快。

―?已有鏈接

一?刪除的鏈接

—?新增的鏈接

9.2redislist介紹

列表類型(list)可以存儲(chǔ)一個(gè)有序的字符串列表,常用的操作是向列表兩端添加元素,

或者獲得列表的某一個(gè)片段。

列表類型內(nèi)部是使用雙向鏈表(doublelinkedlist)實(shí)現(xiàn)的,所以向列表兩端添加元素

的時(shí)間復(fù)雜度為0(1),獲取越接近兩端的元素速度就越快。這意味著即使是一個(gè)有幾千

萬個(gè)元素的列表,獲取頭部或尾部的10條記錄也是極快的。

9.3命令

9.3.1向列表兩端增加元素。

LPUSHkeyvalue[value...]

RPUSHkeyvalue[value...]

向列表左邊增加元素

:6379>Ipushlkeyll23

(integer)3

向列表右邊增加元素

:6379>rpushIkeyl456

(integer)3

9.3.2查看列表

LRANGEkeystartstop

LRANGE命令是列表類型最常用的命令之一,獲取列表中的某一片段,將返回Start,

stop之間的所有元素(包含兩端的元素),索引從0開始。索弓I可以是負(fù)數(shù),如:

r代表最后邊的一個(gè)元素。

:6379>IrangeIkeyl0-1

:6379>IrangelkeylO2

1)"2"

2)ur

3/4”

933從列表兩端彈出元素

LPOPkey

RPOPkey

LPOP命令從列表左邊彈出一個(gè)元素,會(huì)分兩步完成,第一步是將列表左邊的元素從列

表中移除,第二步是返回被移除的元素值。

:6379>lpopIkeyl

"3"

:6379>rpopIkeyl

9.3.4獲取列表中元素的個(gè)數(shù)

LLENkey

:6379>lienIkeyl

(integer)2

9.3.5其它命令(自學(xué))

刪除列表中指定的值

LREMkeycountvalue

LREM命令會(huì)刪除列表中前count個(gè)值為value的元素,返回實(shí)際刪除的元素個(gè)數(shù)。根

據(jù)count值的不同,該命令的執(zhí)行方式會(huì)有所不同:

?當(dāng)count〉。時(shí),LREM會(huì)從列表左邊開始刪除。

?當(dāng)count<0時(shí),LREM會(huì)從列表后邊開始刪除。

?當(dāng)count=0時(shí),LREM刪除所有值為value的元素。

獲得/設(shè)置指定索引的元素值

LINDEXkeyindex

LSETkeyindexvalue

127.0.0.1:6379>lindexIkeyl2

:6379>lsetlkeyl22

OK

127.0.0.1:6379>IrangeIkeyl0-1

1)"6"

2)"5H

3)"2"

4)"2H

只保留列表指定片段,指定范圍和LRANGE一致

LTRIMkeystartstop

:6379>IrangeIkeyl0-1

1)"6n

2)“5”

3)“0”

4)"2n

:6379>ItrimIkeyl02

OK

:6379>IrangeIkeyl0-1

1)n6"

2)“5〃

3)n0n

向列表中插入元素

LINSERTkeyBEFORE/AFTERpivotvalue

該命令首先會(huì)在列表中從左到右查找值為Pivot的元素,然后根據(jù)第二個(gè)參數(shù)是BEFORE

還是AFTER來決定將value插入到該元素的前面還是后面。

:6379>Irange/keylO-1

1)"3"

2)"2n

3)"1"

:6379>linsert/keylafter34

(integer)4

:6379>Irange/keylO-1

1)"3"

2)"4n

3)"2"

4)"1"

將元素從一個(gè)列表轉(zhuǎn)移到另一個(gè)列表中

RPOPLPUSHsourcedestination

:6379>rpoplpushlistnewlist

:6379>Irangenewlist0-1

1)nr

:6379>Irangelist0-1

1)"3"

2)u4"

3)"2"

10數(shù)據(jù)類型一set

lO.lredisset介紹

在集合中的每個(gè)元素都是不同的,且沒有順序。

集合類型和列表類型的對(duì)比:

集合類型列表類型

存儲(chǔ)內(nèi)容至多2*T個(gè)字符串至多產(chǎn)-1個(gè)字符串

有序件否是

唯ft是否

集合類型的常用操作是向集合中加入或刪除元素、判斷某個(gè)元素是否存在等,由于集

合類型的Redis內(nèi)部是使用值為空的散列表實(shí)現(xiàn),所有這些操作的時(shí)間復(fù)雜度都為0(1)。

Redis還提供了多個(gè)集合之間的交集、并集、差集的運(yùn)算。

10.2命令

10.2.1增加/刪除元素

SADDkeymember[member...]

SREMkeymember[member...]

:6379>saddsetabc

(integer)3

:6379>saddseta

(integer)0

:6379>sremsetcd

(integer)1

10.2.2獲得集合中的所有元素

SMEMBERSkey

:6379>smembersset

1)"b"

2)"aH

判斷元素是否在集合中,無論集合中有多少元素都可以極速的返回結(jié)果。

SISMEMBERkeymember

:6379>sismemberseta

(integer)1

:6379>sismemberseth

(integer)0

10.3其它命令

10.3.1集合的差集運(yùn)算A-B

屬于A并且不屬于B的元素構(gòu)成的集合。

A^B

SDIFFkey[key...]

:6379>saddsetA123

(integer)3

:6379>saddsetB234

(integer)3

:6379>sdiffsetAsetB

1)"1"

:6379>sdiffsetBsetA

1)"4n

10.3.2集合的交集運(yùn)算APB

屬于A且屬于B的元素構(gòu)成的集合。

SINTERkey[key...]

127.0.0,1:6379>sintersetAsetB

1)"2"

2)"3"

10.3.3集合的并集運(yùn)算AUB

屬于A或者屬于B的元素構(gòu)成的集合

A\JB

SUNIONkey[key...]

:6379>sunionsetAsetB

1)nr

2)“2"

3)n3u

4)“4"

10.3.4其它命令(自學(xué))

獲得集合中元素的個(gè)數(shù)

SCARDkey

:6379>smemberssetA

1)"1"

2)"2"

3)"3"

:6379>seardsetA

(integer)3

從集合中彈出一個(gè)元素

SPOPkey

:6379>spopsetA

注意:由于集合是無序的,所有SPOP命令會(huì)從集合中隨機(jī)選擇一個(gè)元素彈出

11數(shù)據(jù)類型--sortedset

ll.lredissortedset介紹

在集合類型的基礎(chǔ)上有序集合類型為集合中的每個(gè)元素都關(guān)聯(lián)一個(gè)分?jǐn)?shù),這使得我們

不僅可以完成插入、刪除和判斷元素是否存在在集合中,還能夠獲得分?jǐn)?shù)最高或最低

的前N個(gè)元素、獲取指定分?jǐn)?shù)范圍內(nèi)的元素等與分?jǐn)?shù)有關(guān)的操作。

在某些方面有序集合和列表類型有些相似。

1、二者都是有序的。

2、二者都可以獲得某一范圍的元素。

但是,二者有著很大區(qū)別:

1、列表類型是通過鏈表實(shí)現(xiàn)的,獲取靠近兩端的數(shù)據(jù)速度極快,而當(dāng)元素增多后,訪

問中間數(shù)據(jù)的速度會(huì)變慢。

2、有序集合類型使用散列表實(shí)現(xiàn),所有即使讀取位于中間部分的數(shù)據(jù)也很快。

3、列表中不能簡(jiǎn)單的調(diào)整某個(gè)元素的位置,但是有序集合可以(通過更改分?jǐn)?shù)實(shí)現(xiàn))

4、有序集合要比列表類型更耗內(nèi)存。

11.2命令

11.2.1增加元素

向有序集合中加入一個(gè)元素和該元素的分?jǐn)?shù),如果該元素已經(jīng)存在則會(huì)用新的分?jǐn)?shù)替

換原有的分?jǐn)?shù)。返回值是新加入到集合中的元素個(gè)數(shù),不包含之前已經(jīng)存在的元素。

ZADDkeyscoremember[scoremember...]

:6379>zaddscoreboard80zhangsan89lisi94wangwu

(integer)3

:6379>zaddscoreboard97lisi

(integer)0

獲取元素的分?jǐn)?shù)

ZSCOREkeymember

:6379>zscorescoreboardlisi

1122刪除元素

ZREMkeymember[member...]

移除有序集key中的一個(gè)或多個(gè)成員,不存在的成員將被忽略。

當(dāng)key存在但不是有序集類型時(shí),返回一個(gè)錯(cuò)誤。

:6379>zremscoreboardlisi

(integer)1

11.2.3獲得排名在某個(gè)范圍的元素列表

獲得排名在某個(gè)范圍的元素列表

ZRANGEkeystartstop/W/177SC。/?的照元素分?jǐn)?shù)從小至IJ大的順序返回索弓|從start到stop

之間的所有元素(包含兩端的元素)

:6379>zrangescoreboard02

1)"zhangsan"

2)"wangwu"

3)"lisi,l

ZREVRANGEkeystartstop/W/丁HSCORES/照元素分?jǐn)?shù)從大到小的順序返回索弓|從start到

stop之間的所有元素(包含兩端的元素)

:6379>zrevrangescoreboard02

1)'*lisi"

2)"wangwu"

3)"zhangsan"

如果需要獲得元素的分?jǐn)?shù)的可以在命令尾部加上WITHSCORES參數(shù)

:6379>zrangescoreboard01WITHSCORES

1)"zhangsan"

2)"80"

3)"wangwu"

4)"94"

11.2.4其它命令(自學(xué))

獲得指定分?jǐn)?shù)范圍的元素

ZRANGEBYSCOREkeyminmax[WITHSCORES][LIMIToffsetcount]

:6379>ZRANGEBYSCOREscoreboard9097WITHSCORES

1)"wangwu"

2)“94”

3)"lisi"

4)"97"

:6379>ZRANGEBYSCOREscoreboard70100limit12

1)"wangwu"

2)“l(fā)isi”

增加某個(gè)元素的分?jǐn)?shù),返回值是更改后的分?jǐn)?shù)。

ZINCRBYkeyincrementmember

給lisi加4分

:6379>ZINCRBYscoreboard4lisi

"101”

獲得集合中元素的數(shù)量

ZCARDkey

:6379>ZCARDscoreboard

(integer)3

獲得指定分?jǐn)?shù)范圍內(nèi)的元素個(gè)數(shù)

ZCOUNTkeyminmax

:6379>ZCOUNTscoreboard8090

(integer)1

按照排名范圍刪除元素

ZREMRANGEBYRANKkeystartstop

:6379>ZREMRANGEBYRANKscoreboard01

(integer)2

:6379>ZRANGEscoreboard0-1

1)"lisin

ZREMRANGEBYSCOREkeyminmax

按照分?jǐn)?shù)范圍刪除元素

:6379>zaddscoreboard84zhangsan

(integer)1

:6379>ZREMRANGEBYSCOREscoreboard80100

(integer)1

獲取元素的排名

ZRANKkey

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論