redis缓存数据库技术
redis :
概念 :
redis是一款高性能的NOSQL系列的非關(guān)系型數(shù)據(jù)庫
關(guān)系型數(shù)據(jù)庫 : Mysql , oracle
非關(guān)系型的數(shù)據(jù)庫 : redis , hbase ,
- 數(shù)據(jù)之間沒有關(guān)聯(lián)關(guān)系
- 數(shù)據(jù)是存儲(chǔ)在內(nèi)存中的
- 可以獨(dú)立部署到不同機(jī)器上
注意:
經(jīng)常查詢一些不需要發(fā)生變換的
- 緩存思想解決這個(gè)問題 : 讓用戶的響應(yīng)更快一些
- 從緩存中獲取數(shù)據(jù) :
- 有數(shù)據(jù) :
- 直接返回
- 沒有數(shù)據(jù) :
- 1.從數(shù)據(jù)庫中查詢
- 2.將數(shù)據(jù)放入緩存中
- 3.返回?cái)?shù)據(jù)
- 有數(shù)據(jù) :
- 從緩存中獲取數(shù)據(jù) :
使用java直接開辟一個(gè)緩存空間也是可以完成這項(xiàng)工作的 , 但是 , 如果是后期部署分布式項(xiàng)目 , 要在好幾臺(tái)機(jī)器上分別部署 , 使用java直接開辟就不行了 , 因?yàn)閖ava緩存是存在于java虛擬機(jī)中 , 只能在當(dāng)前電腦使用 ,而且內(nèi)存較小 , 這個(gè)時(shí)候就要使用到非關(guān)系型數(shù)據(jù)庫了
1.1.什么是NOSQL
NoSQL(NoSQL = Not Only SQL),意即“不僅僅是SQL”,是一項(xiàng)全新的數(shù)據(jù)庫理念,泛指非關(guān)系型的數(shù)據(jù)庫。
隨著互聯(lián)網(wǎng)web2.0網(wǎng)站(用戶可以發(fā)布自己的內(nèi)容 比如小視頻網(wǎng)站 )的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫在應(yīng)付web2.0網(wǎng)站,特別是超大規(guī)模和高并發(fā)的SNS類型的web2.0純動(dòng)態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問題,而非關(guān)系型的數(shù)據(jù)庫則由于其本身的特點(diǎn)得到了非常迅速的發(fā)展。NoSQL數(shù)據(jù)庫的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重?cái)?shù)據(jù)種類帶來的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題。
1.1.1. NOSQL和關(guān)系型數(shù)據(jù)庫比較
優(yōu)點(diǎn):
1)成本:nosql數(shù)據(jù)庫簡單易部署,基本都是開源軟件,不需要像使用oracle那樣花費(fèi)大量成本購買使用,相比關(guān)系型數(shù)據(jù)庫價(jià)格便宜。
2)查詢速度:nosql數(shù)據(jù)庫將數(shù)據(jù)存儲(chǔ)于緩存之中,關(guān)系型數(shù)據(jù)庫將數(shù)據(jù)存儲(chǔ)在硬盤中,自然查詢速度遠(yuǎn)不及nosql數(shù)據(jù)庫。
3)存儲(chǔ)數(shù)據(jù)的格式:nosql的存儲(chǔ)格式是key,value形式、文檔形式、圖片形式等等,所以可以存儲(chǔ)基礎(chǔ)類型以及對(duì)象或者是集合等各種格式,而數(shù)據(jù)庫則只支持基礎(chǔ)類型。
4)擴(kuò)展性:關(guān)系型數(shù)據(jù)庫有類似join這樣的多表查詢機(jī)制的限制導(dǎo)致擴(kuò)展很艱難。
? 缺點(diǎn):
? 1)維護(hù)的工具和資料有限,因?yàn)閚osql是屬于新的技術(shù),不能和關(guān)系型數(shù)據(jù)庫10幾年的技術(shù)同日而語。
? 2)不提供對(duì)sql的支持,如果不支持sql這樣的工業(yè)標(biāo)準(zhǔn),將產(chǎn)生一定用戶的學(xué)習(xí)和使用成本。
? 3)不提供關(guān)系型數(shù)據(jù)庫對(duì)事務(wù)的處理。
1.1.2. 非關(guān)系型數(shù)據(jù)庫的優(yōu)勢:
1)性能NOSQL是基于鍵值對(duì)的,可以想象成表中的主鍵和值的對(duì)應(yīng)關(guān)系,而且不需要經(jīng)過SQL層的解析,所以性能非常高。
2)可擴(kuò)展性同樣也是因?yàn)榛阪I值對(duì),數(shù)據(jù)之間沒有耦合性,所以非常容易水平擴(kuò)展。
1.1.3. 關(guān)系型數(shù)據(jù)庫的優(yōu)勢:
1)復(fù)雜查詢可以用SQL語句方便的在一個(gè)表以及多個(gè)表之間做非常復(fù)雜的數(shù)據(jù)查詢。
2)事務(wù)支持使得對(duì)于安全性能很高的數(shù)據(jù)訪問要求得以實(shí)現(xiàn)。對(duì)于這兩類數(shù)據(jù)庫,對(duì)方的優(yōu)勢就是自己的弱勢,反之亦然。
1.1.4. 總結(jié)
關(guān)系型數(shù)據(jù)庫與NoSQL數(shù)據(jù)庫并非對(duì)立而是互補(bǔ)的關(guān)系,即通常情況下使用關(guān)系型數(shù)據(jù)庫,在適合使用NoSQL的時(shí)候使用NoSQL數(shù)據(jù)庫,
讓NoSQL數(shù)據(jù)庫對(duì)關(guān)系型數(shù)據(jù)庫的不足進(jìn)行彌補(bǔ)。
一般會(huì)將數(shù)據(jù)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中,在nosql數(shù)據(jù)庫中備份存儲(chǔ)關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)
1.2.主流的NOSQL產(chǎn)品
? 鍵值(Key-Value)存儲(chǔ)數(shù)據(jù)庫
相關(guān)產(chǎn)品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型應(yīng)用: 內(nèi)容緩存,主要用于處理大量數(shù)據(jù)的高訪問負(fù)載。
數(shù)據(jù)模型: 一系列鍵值對(duì)
優(yōu)勢: 快速查詢
劣勢: 存儲(chǔ)的數(shù)據(jù)缺少結(jié)構(gòu)化
? 列存儲(chǔ)數(shù)據(jù)庫
相關(guān)產(chǎn)品:Cassandra, HBase, Riak
典型應(yīng)用:分布式的文件系統(tǒng)
數(shù)據(jù)模型:以列簇式存儲(chǔ),將同一列數(shù)據(jù)存在一起
優(yōu)勢:查找速度快,可擴(kuò)展性強(qiáng),更容易進(jìn)行分布式擴(kuò)展
劣勢:功能相對(duì)局限
? 文檔型數(shù)據(jù)庫
相關(guān)產(chǎn)品:CouchDB、MongoDB
典型應(yīng)用:Web應(yīng)用(與Key-Value類似,Value是結(jié)構(gòu)化的)
數(shù)據(jù)模型: 一系列鍵值對(duì)
優(yōu)勢:數(shù)據(jù)結(jié)構(gòu)要求不嚴(yán)格
劣勢: 查詢性能不高,而且缺乏統(tǒng)一的查詢語法
? 圖形(Graph)數(shù)據(jù)庫
相關(guān)數(shù)據(jù)庫:Neo4J、InfoGrid、Infinite Graph
典型應(yīng)用:社交網(wǎng)絡(luò)
數(shù)據(jù)模型:圖結(jié)構(gòu)
優(yōu)勢:利用圖結(jié)構(gòu)相關(guān)算法。
劣勢:需要對(duì)整個(gè)圖做計(jì)算才能得出結(jié)果,不容易做分布式的集群方案。
1.3 什么是Redis
Redis是用C語言開發(fā)的一個(gè)開源的高性能鍵值對(duì)(key-value)數(shù)據(jù)庫,官方提供測試數(shù)據(jù),50個(gè)并發(fā)執(zhí)行100000個(gè)請(qǐng)求,讀的速度是110000次/s,寫的速度是81000次/s ,且Redis通過提供多種鍵值數(shù)據(jù)類型來適應(yīng)不同場景下的存儲(chǔ)需求,目前為止Redis支持的鍵值數(shù)據(jù)類型如下:
1) 字符串類型 string
2) 哈希類型 hash
3) 列表類型 list
4) 集合類型 set
5) 有序集合類型 sortedset
1.3.1 redis的應(yīng)用場景
? 緩存(數(shù)據(jù)查詢、短連接、新聞內(nèi)容、商品內(nèi)容等等)
? 聊天室的在線好友列表
? 任務(wù)隊(duì)列。(秒殺、搶購、12306等等)
? 應(yīng)用排行榜
? 網(wǎng)站訪問統(tǒng)計(jì)
? 數(shù)據(jù)過期處理(可以精確到毫秒)
? 分布式集群架構(gòu)中的session分離
下載安裝:(windows)
官網(wǎng)地址 : https://redis.io
中文網(wǎng) : http://www.redis.net.cn/
3.解壓直接可以使用 :
- redis.windows.conf : 配置文件
- redis-cli.exe : redis客戶端
- redis-server.exe : redis的服務(wù)器端
linux下安裝:
**下載地址:**http://redis.io/download,下載最新穩(wěn)定版本。
wget http://download.redis.io/releases/redis-6.0.8.tar.gz tar xzf redis-6.0.8.tar.gzcd redis-6.0.8make執(zhí)行完 *make* 命令后,redis-6.0.8 的 *src* 目錄下會(huì)出現(xiàn)編譯后的 redis 服務(wù)程序 redis-server,還有用于測試的客戶端程序 redis-cli:
下面啟動(dòng) redis 服務(wù):
# cd src# ./redis-server注意這種方式啟動(dòng) redis 使用的是默認(rèn)配置。也可以通過啟動(dòng)參數(shù)告訴 redis 使用指定配置文件使用下面命令啟動(dòng)。
# cd src# ./redis-server ../redis.confredis.conf 是一個(gè)默認(rèn)的配置文件。我們可以根據(jù)需要使用自己的配置文件。
啟動(dòng) redis 服務(wù)進(jìn)程后,就可以使用測試客戶端程序 redis-cli 和 redis 服務(wù)交互了。 比如:
# cd src# ./redis-cli redis> set foo bar OK redis> get foo "bar"使用:
編輯redis.windows.conf文件,我看網(wǎng)上有的教程說編輯里邊maxheap ** ,但是3.x版本以后,修改的是 maxmemory ****, bytes是字節(jié),請(qǐng)自行換算,我這里改成maxmemory 1024000000**。
其實(shí)這個(gè)地方可以不用設(shè)置,他描述上已經(jīng)說了,redis會(huì)自動(dòng)設(shè)置的。
設(shè)置redis的密碼:找到**# requirepass foobared** 改為 requirepass 我的密碼 ,本機(jī)測試可不設(shè)置。
保存后打開redis的解壓目錄,shift+鼠標(biāo)左鍵找到菜單上:在此處打開命令行窗口 或 自行運(yùn)行cmd命令到此目錄
也可在目錄下新建一個(gè)start.bat文件 , 里邊寫 redis-server.exe redis.windows.conf , 打開雙擊start.bat文件即可
命令如下:
redis-server.exe redis.windows.conf --maxmemory 200M其中–maxmemory 200M是選填的,如果你配置文件redis.windows.conf中配置,這個(gè)就可以省去,如果沒配置,這個(gè)可以加也可以不加,你開心就好。
當(dāng)出現(xiàn)此界面的時(shí)候,說明啟動(dòng)成功,監(jiān)聽端口6379,然后讓我們測試一下效果吧
重新打開一個(gè)DOS界面,效果如下:
如果你設(shè)置了redis的密碼,則需要在set之前執(zhí)行auth 密碼 命令,否則會(huì)提示(error) NOAUTH Authentication required.
最后說一下將redis加到Windows服務(wù)中。首先還是要啟動(dòng)redis服務(wù)器端,然后在運(yùn)行redis客戶端,然后通過Windows的service-install命令,輸入
redis-server --service-install redis.windows.conf --loglevel verbose以后就可以使用win的服務(wù)啟動(dòng),而不需要每次都要打開一個(gè)DOS界面啟動(dòng)了。
1、安裝redis服務(wù)
redis-install.bat
echo install redis-server23 D:\redis\redis-server.exe --service-install D:\redis\redis.windows.conf --loglevel verbose2、卸載redis服務(wù)
redis-uninstall.bat
echo uninstall redis-serverD:\redis\redis-server.exe --service-uninstall3、啟動(dòng)redis服務(wù)
start-redis.bat
echo start redis-serverD:\redis\redis-server.exe D:\redis\redis.windows.conf命令操作 :
1.數(shù)據(jù)結(jié)構(gòu)操作
redis的數(shù)據(jù)結(jié)構(gòu) :
- redis存儲(chǔ)的是key : value格式的數(shù)據(jù) , 其中key都是字符串 , value有5中不同的數(shù)據(jù)結(jié)構(gòu)
- 1 字符串類型 string
- 2 哈希類型 hash : map格式
- 3 列表類型 list : linkedlist 格式
- 4 集合類型 set :
- 5 有序集合類型 sortedset
(1)字符串類型 String
① 存儲(chǔ) : set key value
② 獲取 : get key
③ 刪除 : del key
(2) 哈希類型 hash
① 存儲(chǔ) : hset key field value
② 獲取 : hget key field
③ 刪除 : hdel key field
④ 獲取map集合中的所有的鍵值對(duì)
hgetall key : 獲取所有的 field 和值
(3)列表類型 : list (允許有重復(fù)元素)
list : 可以添加一個(gè)元素到列表的頭部 (左邊) 或者尾部 (右邊)
1.添加
① lpush key value : 從列表的左邊加入數(shù)據(jù)
② rpush key value : 從列表的右邊加入數(shù)據(jù)
2.獲取:
③ lrange key start end : 范圍獲取
3.刪除 :
④ lpop key : 刪除列表最左邊的元素 , 并將這個(gè)元素返回
⑤ rpop key : 刪除列表最右邊的元素 , 并將這個(gè)元素返回
(4)集合類型 : set (不允許有重復(fù)元素)
添加重復(fù)元素是不會(huì)成功的
1.存儲(chǔ) :
① sadd key value
2.獲取 :
② smembers key : 獲取set集合中所有的元素
3.刪除 :
③ srem key value : 刪除集合中的某個(gè)元素
(5)有序集合類型 sortedset
不允許重復(fù)元素 , 每一個(gè)元素會(huì)關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù) , 來對(duì)元素進(jìn)行排序
1.存儲(chǔ) :
① zadd key score value
- XX: 僅僅更新存在的成員,不添加新成員。
- NX: 不更新存在的成員。只添加新成員。
- CH: 修改返回值為發(fā)生變化的成員總數(shù),原始是返回新添加成員的總數(shù) (CH 是 changed 的意思)。更改的元素是新添加的成員,已經(jīng)存在的成員更新分?jǐn)?shù)。 所以在命令中指定的成員有相同的分?jǐn)?shù)將不被計(jì)算在內(nèi)。注:在通常情況下,ZADD返回值只計(jì)算新添加成員的數(shù)量。
- INCR: 當(dāng)ZADD指定這個(gè)選項(xiàng)時(shí),成員的操作就等同ZINCRBY命令,對(duì)成員的分?jǐn)?shù)進(jìn)行遞增操作
2.獲取 :
② zrange key start end
zrange key start end withscores //獲取包括分?jǐn)?shù)在內(nèi)的所有元素
3.刪除 :
③ zrem key value
(6)通用命令 :
1.keys * : 查詢所有的鍵
2.type key : 查詢鍵的類型 (這兩個(gè)查詢后就可以使用對(duì)應(yīng)的方法來對(duì)數(shù)據(jù)進(jìn)行操作)
3.del key ; 刪除對(duì)應(yīng)的鍵
持久化操作 :
redis是一個(gè)內(nèi)存數(shù)據(jù)庫 , 當(dāng)redis服務(wù)器重啟 , 或者電腦重啟的時(shí)候 , 這些數(shù)據(jù)就會(huì)丟失 ,
我們可以將redis內(nèi)存中的數(shù)據(jù)持久化保存到硬盤的文件中 , 當(dāng)redis服務(wù)器重新啟動(dòng)的時(shí)候 , 將數(shù)據(jù)重新加載進(jìn)內(nèi)存
redis持久化操作 , 并不能保證數(shù)據(jù)的安全性 , 只能保證大部分?jǐn)?shù)據(jù)的安全 , 會(huì)造成數(shù)據(jù)的丟失
1.RDB : (默認(rèn)方式 , 性能高 , 推薦)
- 默認(rèn)方式 , 不需要進(jìn)行配置 , 默認(rèn)使用就是這種機(jī)制
- 在一定的間隔時(shí)間中 , 檢測key的變化情況 , 然后去持久化數(shù)據(jù)
- 對(duì)性能影響較小 (推薦使用)
- 持久化會(huì)將數(shù)據(jù)存放在根目錄下的一個(gè)以 rdb為后綴 的文件中
- 重新啟動(dòng)redis服務(wù)器 , 就會(huì)加載這個(gè)文件
配置 :
在redis的根目錄下 , 找到 redis.windows.conf文件 : 找到這三行 這是基本的配置屬性
- - after 900 sec (15 min) if at least 1 key changed - 15分鐘內(nèi)至少有1個(gè)key改變 , 就會(huì)持久化save 900 1- after 300 sec (5 min) if at least 10 keys changed - 5分鐘內(nèi)至少有10個(gè)key改變 , 就會(huì)持久化save 300 10- after 60 sec if at least 10000 keys changed - 一分鐘內(nèi)至少有10000個(gè)key改變 , 就會(huì)持久化save 60 10000
2.AOF : (需要設(shè)置 , 性能低 , 不推薦)
- 日志記錄的方式 , 可以記錄每一條命令的操作 , 可以每一次命令操作后 , 來持久化數(shù)據(jù)
- 每修改保存一條數(shù)據(jù) , 就持久化一次
- 對(duì)性能影響較大 (不推薦使用)
- 持久化會(huì)將數(shù)據(jù)存放在根目錄下的一個(gè)以 appendonly.aof 為后綴 的文件中
配置 :
首先在 redis.windows.conf文件中找到
這里默認(rèn)值是no , 也就是說 , 默認(rèn)AOF是關(guān)閉的 , 如果想要使用 , 就要把這個(gè)值改為 yes
appendonly no (關(guān)閉AOF) --> appendonly yes (開啟AOF)
同時(shí) : 還要設(shè)置下邊的三個(gè)屬性之一
# appendfsync always : 每一次操作都進(jìn)行持久化 appendfsync everysec : 每隔一秒執(zhí)行一次持久化 # appendfsync no : 不進(jìn)行持久化Java操作Redis : (Jedis工具)
jedis : 一款java操作redis數(shù)據(jù)庫的工具
1.使用步驟 :
1.下載相關(guān)的jar包
<!--jedis使用的包--> <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.1.0</version></dependency> <!--連接池工具--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.11.1</version></dependency>2.使用 :
//只有簡單的三步 @Test public void test1(){//1.獲取連接 (IP地址 , 端口號(hào))Jedis jedis = new Jedis("localhost" , 6379);//2.操作jedis.set("username" , "sichen");//3.關(guān)閉連接jedis.close(); }**注意 : **在使用的時(shí)候要打開redis的服務(wù)器 , 不然就會(huì)鏈接錯(cuò)誤
2.Jedis操作各種redis中的數(shù)據(jù)結(jié)構(gòu)
(1)字符串類型 (String)
- set
- get
(2)哈希類型 hash : map格式
-
hset
-
hget
-
hgetall
- jedis.hset("key", "username" , "sichen"); jedis.hset("key","password" ,"acpl159357"); System.out.println(jedis.hgetAll("key")); //輸出{password=acpl159357, username=sichen} System.out.println(jedis.hgetAll("key").values()); //輸出[acpl159357, sichen] //--------------------------------------------------- //獲取hash的所有map中的數(shù)據(jù) Map<String, String> key = jedis.hgetAll("key"); //keySet的方法獲取所有key的Set集合[password, username] Set<String> strings = key.keySet(); System.out.println(strings); for (String s : strings) {//獲取valueString s1 = key.get(s);System.out.println(s +":"+s1); } //輸出 : //password:acpl159357 //username:sichen
(3) 列表類型 list : linkedlist格式 支持重復(fù)元素
-
lpush / rpush 添加
-
lpop / rpop 刪除
-
lrange key start end
- Jedis jedis = new Jedis(); jedis.del("username"); jedis.lpush("username", "a", "b", "c"); jedis.rpush("username", "a", "b", "c"); System.out.println(jedis.lrange("username", 0, -1)); //輸出 : [c, b, a, a, b, c] System.out.println(jedis.lpop("username")); //輸出 : c System.out.println(jedis.rpop("username")); //輸出 : c System.out.println(jedis.lrange("username", 0, -1)); //輸出 : [b, a, a, b] jedis.close();
(4) 集合類型 set : 不允許有重復(fù)元素
-
sadd
-
smembers : 獲取所有元素 :
- Jedis jedis = new Jedis(); //set 存儲(chǔ) jedis.sadd("mySet" , "java" , "php" ,"c++"); //set 獲取 Set<String> mySet = jedis.smembers("mySet"); System.out.println(mySet); jedis.close();
(5) 有序集合類型 : 不允許有重復(fù)元素 , 并且元素有順序
-
zadd
-
zrange
- Jedis jedis = new Jedis(); jedis.zadd("username",30,"思?jí)m"); jedis.zadd("username" , 20 , "塵"); System.out.println(jedis.zrange("username", 0, -1)); //輸出 : [塵, 思?jí)m] 值越小越靠前 jedis.close();
-
可以用來做排行榜
(6) setex() 方法存儲(chǔ)可以指定過期時(shí)間的key 和 value
jedis.setex("username" , 60 ,"sichen");- 可以用來存儲(chǔ)注冊(cè)時(shí)的驗(yàn)證碼
Jedis連接池 : (JedisPool)
jedis連接池是官方就提供的 ,
JedisPool : 直接拿來用即可
使用 :
1.創(chuàng)建JedisPool連接池對(duì)象
2.調(diào)用方法 getResource() 方法來獲取Jedis連接
//0.創(chuàng)建一個(gè)配置對(duì)象 JedisPoolConfig config = new JedisPoolConfig(); //最大連接數(shù) config.setMaxTotal(100); //最大空閑連接 config.setMaxIdle(10); //1.創(chuàng)建連接池對(duì)象 , 這里邊有很多參數(shù) , 使用默認(rèn)的即可 JedisPool jedisPool = new JedisPool(config , "127.0.0.1", 6379); //2.獲取連接 Jedis jedis = jedisPool.getResource(); //3.使用 jedis.set("sichen" , "愛你"); //4.關(guān)閉 (歸還到連接池中) jedis.close();JedisPoolConfig詳細(xì)配置
#最大活動(dòng)對(duì)象數(shù) redis.pool.maxTotal=1000 #最大能夠保持idel狀態(tài)的對(duì)象數(shù) redis.pool.maxIdle=100 #最小能夠保持idel狀態(tài)的對(duì)象數(shù) redis.pool.minIdle=50 #當(dāng)池內(nèi)沒有返回對(duì)象時(shí),最大等待時(shí)間 redis.pool.maxWaitMillis=10000 #當(dāng)調(diào)用borrow Object方法時(shí),是否進(jìn)行有效性檢查 redis.pool.testOnBorrow=true #當(dāng)調(diào)用return Object方法時(shí),是否進(jìn)行有效性檢查 redis.pool.testOnReturn=true #“空閑鏈接”檢測線程,檢測的周期,毫秒數(shù)。如果為負(fù)值,表示不運(yùn)行“檢測線程”。默認(rèn)為-1. redis.pool.timeBetweenEvictionRunsMillis=30000 #向調(diào)用者輸出“鏈接”對(duì)象時(shí),是否檢測它的空閑超時(shí); redis.pool.testWhileIdle=true # 對(duì)于“空閑鏈接”檢測線程而言,每次檢測的鏈接資源的個(gè)數(shù)。默認(rèn)為3. redis.pool.numTestsPerEvictionRun=50 #redis服務(wù)器的IP redis.ip=xxxxxx #redis服務(wù)器的Port redis1.port=6379工具類 : JedisPoolUtils
JedisPoolUtils.java
package cn.sichen.util;import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig;import java.io.IOException; import java.io.InputStream; import java.util.Properties;/*** JedisPool工具類* 加載配置文件 , 配置連接池的參數(shù)* 提供獲取連接的方法*/ public class JedisPoolUtils {//創(chuàng)建JedisPool連接池對(duì)象private static JedisPool jedisPool;static {//讀取配置文件InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");//創(chuàng)建一個(gè)properties對(duì)象Properties properties = new Properties();try {properties.load(is);} catch (IOException e) {e.printStackTrace();}//獲取數(shù)據(jù) , 設(shè)置到JedisPoolConfig中JedisPoolConfig config = new JedisPoolConfig();//這里獲取的是一個(gè)字符串 , 但是需要的是一個(gè)int類型的數(shù)字config.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal")));config.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));//初始化JedisPooljedisPool = new JedisPool(config , properties.getProperty("host") , Integer.parseInt(properties.getProperty("port")));}/*** 獲取連接的方法*/public static Jedis getJedis(){return jedisPool.getResource();}/*** 獲取連接池的方法 , 用來在監(jiān)聽器中關(guān)閉這個(gè)連接池*/public static JedisPool getJedisPool(){return jedisPool;}}案例 : Ajax請(qǐng)求加載數(shù)據(jù) , 并緩存
注意 : 我們一般使用redis緩存 , 一些不經(jīng)常發(fā)生變化的數(shù)據(jù) ,
- 數(shù)據(jù)庫一旦發(fā)生改變 , 則需要更新緩存
- 數(shù)據(jù)庫的表執(zhí)行 , 增刪改的相關(guān)操作 , 需要將redis緩存數(shù)據(jù)清除 , 再重新存入
1.提供一個(gè)index.jsp頁面 , 頁面有一個(gè)省份下拉列表
2.當(dāng)頁面加載完成之后 , 發(fā)送ajax請(qǐng)求 , 加載所有省份
- FindProvinceServlet.java
- index.html
使用redis緩存
在service層中判斷緩存中是否有數(shù)據(jù)
package cn.sichen.service.impl; import cn.sichen.dao.ProvinceDao; import cn.sichen.dao.impl.ProvinceDaoImpl; import cn.sichen.domain.Province; import cn.sichen.service.ProvinceService; import cn.sichen.util.JedisPoolUtils; import com.fasterxml.jackson.databind.ObjectMapper; import redis.clients.jedis.Jedis; import java.util.List; public class ProvinceServiceImpl implements ProvinceService {private ProvinceDao dao = new ProvinceDaoImpl();@Overridepublic List<Province> findAll() {return dao.findAll();}/** 使用redis緩存* */@Overridepublic String findAllJson() {//1.先從redis中查詢數(shù)據(jù)Jedis jedis = JedisPoolUtils.getJedis();String province_json = jedis.get("province");//2.判斷province_json數(shù)據(jù)是否為nullif (province_json == null || province_json.length() == 0) {System.out.println("沒有數(shù)據(jù) , 將從數(shù)據(jù)庫中查詢...");try {//緩存中沒有數(shù)據(jù)//2.1從數(shù)據(jù)庫中查詢數(shù)據(jù)List<Province> list = dao.findAll();//2.2將list序列化為jsonObjectMapper mapper = new ObjectMapper();province_json = mapper.writeValueAsString(list);//2.3將json數(shù)據(jù)存入Redis中jedis.set("province", province_json);} catch (Exception e) {e.printStackTrace();}} else {System.out.println("有數(shù)據(jù) , 將從Redis中查詢...");}return province_json;} }然后在servlet中直接調(diào)用service查詢即可
//1.調(diào)用service查詢即可 ProvinceService service = new ProvinceServiceImpl(); String allJson = service.findAllJson();//3.響應(yīng)結(jié)果 response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(allJson); //2.1從數(shù)據(jù)庫中查詢數(shù)據(jù)List<Province> list = dao.findAll();//2.2將list序列化為jsonObjectMapper mapper = new ObjectMapper();province_json = mapper.writeValueAsString(list);//2.3將json數(shù)據(jù)存入Redis中jedis.set("province", province_json);} catch (Exception e) {e.printStackTrace();}} else {System.out.println("有數(shù)據(jù) , 將從Redis中查詢...");}return province_json; }}
然后在servlet中直接調(diào)用service查詢即可 ```java //1.調(diào)用service查詢即可 ProvinceService service = new ProvinceServiceImpl(); String allJson = service.findAllJson();//3.響應(yīng)結(jié)果 response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(allJson);總結(jié)
以上是生活随笔為你收集整理的redis缓存数据库技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习之非极大值抑制(Non-maxi
- 下一篇: 传智播客数据绑定和数据库开发基础(第四季