版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 蠶絲毯市場(chǎng)發(fā)展前景分析及供需格局研究預(yù)測(cè)報(bào)告
- 膠合板裁剪機(jī)市場(chǎng)發(fā)展前景分析及供需格局研究預(yù)測(cè)報(bào)告
- 背心式上衣項(xiàng)目運(yùn)營(yíng)指導(dǎo)方案
- 貼頸短項(xiàng)鏈商業(yè)機(jī)會(huì)挖掘與戰(zhàn)略布局策略研究報(bào)告
- 鳥籠項(xiàng)目運(yùn)營(yíng)指導(dǎo)方案
- 《馬路上》教學(xué)設(shè)計(jì)
- 不打人協(xié)議書
- 搬遷固定單價(jià)合同范本
- 2024合同編通則增補(bǔ)串講
- 23年中級(jí)經(jīng)濟(jì)師考試《工商管理》考試題庫(kù)(真題)
- 蛋白的分離純化
- 16開(19x26)獎(jiǎng)狀打印模版
- 大班健康《預(yù)防手足口病》課件
- 淺談三新背景下課堂教學(xué)方式的變革 論文
- 咽喉癌病歷書寫
- 數(shù)據(jù)中心運(yùn)維管理方案
- 2023年佛山市圖書館招考工作人員筆試參考題庫(kù)(共500題)答案詳解版
- “跨媒介敘事”理論研究
- 大型活動(dòng)安保服務(wù)投標(biāo)方案
- 非傳統(tǒng)安全研究與中國(guó)
- 河南省南陽(yáng)市宛城區(qū)2023-2024學(xué)年八年級(jí)上學(xué)期期中地理試題
評(píng)論
0/150
提交評(píng)論