詳解JavaEE 使用 Redis 數(shù)據(jù)庫(kù)進(jìn)行內(nèi)容緩存和高訪問(wèn)負(fù)載
NoSQL(Not Only SQL),泛指非關(guān)系型數(shù)據(jù)庫(kù),是為了處理高并發(fā)讀寫、海量數(shù)據(jù)的高效率存儲(chǔ)和訪問(wèn)、高擴(kuò)展性和高可用性而產(chǎn)生的。
分類 | 相關(guān)產(chǎn)品 | 典型應(yīng)用 | 數(shù)據(jù)模型 | 優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|---|---|---|---|
鍵值對(duì)(Key-Value)存儲(chǔ) | Redis、Voldemort、Berkeley DB | 內(nèi)容緩存、處理高訪問(wèn)負(fù)載 | 一系列鍵值對(duì) | 快速查詢 | 存儲(chǔ)的數(shù)據(jù)缺少結(jié)構(gòu)化 |
列存儲(chǔ)數(shù)據(jù)庫(kù) | Cassandra、HBase、Riak | 分布式文件系統(tǒng) | 以列簇式存儲(chǔ),將同一列數(shù)據(jù)存在一起 | 查詢速度快,可擴(kuò)展性強(qiáng),更容易進(jìn)行分布式擴(kuò)展 | 功能相對(duì)局限 |
文檔型數(shù)據(jù)庫(kù) | MongoDB、CouchDB | Web應(yīng)用 | 一系列鍵值對(duì) | 數(shù)據(jù)結(jié)構(gòu)要求不嚴(yán)格 | 查詢性能不高,缺乏統(tǒng)一的查詢語(yǔ)法 |
圖形數(shù)據(jù)庫(kù) | Neo4j、InfoGrid | 社交網(wǎng)絡(luò),推薦系統(tǒng),專注于構(gòu)建關(guān)系圖譜 | 圖結(jié)構(gòu) | 利用圖結(jié)構(gòu)相關(guān)算法 | 需要對(duì)整個(gè)圖做計(jì)算才能得出結(jié)果,不容易做分布式的集群方案 |
本篇將主要闡述如何使用 Redis(https://github.com/antirez/redis)數(shù)據(jù)庫(kù)進(jìn)行內(nèi)容緩存和高訪問(wèn)負(fù)載,redis 使用 C 語(yǔ)言開發(fā)的一個(gè)開源的高性能的鍵值對(duì)數(shù)據(jù)庫(kù),通過(guò)提供多種鍵值數(shù)據(jù)類型來(lái)適應(yīng)不同場(chǎng)景下的存儲(chǔ)需求,目前 Redis 支持的鍵值數(shù)據(jù)類型有很多種,比如字符串類型、列表類型、有序集合類型、散列類型、集合類型。Redis 官方也給我們提供了一些測(cè)試數(shù)據(jù),有 50 個(gè)并發(fā)程序來(lái)執(zhí)行 10 萬(wàn)次請(qǐng)求,Redis 讀的速度達(dá)到了 11 萬(wàn)次/秒,寫的速度達(dá)到了 8.1 萬(wàn)次/秒。
Redis 最廣泛的應(yīng)用場(chǎng)景就是使用它作為緩存(新聞或商品內(nèi)容、聊天式的在線好友列表),除此還有任務(wù)隊(duì)列(秒殺、搶購(gòu))、網(wǎng)站訪問(wèn)統(tǒng)計(jì)、數(shù)據(jù)過(guò)期處理(可以精確到毫秒)、應(yīng)用排行榜、分布式集群架構(gòu)中的 session 分離等。
1.Linux下安裝Redis數(shù)據(jù)庫(kù)
$ scp ~/Downloads/redis-4.0.1.tar.gz root@192.168.2.10:/usr/local //上傳安裝包 $ ssh root@192.168.2.10 //SSH連接 # yum -y install gcc gcc-c++ autoconf automake //gcc、gcc-c++的庫(kù)文件 # cd /usr/local # tar -zxvf redis-4.0.1.tar.gz //解壓縮 # cd redis-4.0.1 //切換到該目錄下 # make //編譯,將.c文件編譯為.o文件 # make PREFIX=/usr/local/redis install //指定路徑安裝 # cd /usr/local # ls //如果存在redis文件夾,則安裝成功
其中 /usr/local/redis/bin/ 下包含:
redis-benchmark //性能測(cè)試的一個(gè)工具 redis-check-aof //aof文件修復(fù)的一個(gè)工具 redis-check-aof --fix appendonlly.aof redis-check-dump //rdb文件檢查的一個(gè)工具,rdb文件為Redis默認(rèn)數(shù)據(jù)庫(kù)文件 redis-check-rdb //rdb文件修復(fù)的一個(gè)工具 redis-check-rdb --fix dump.rdb redis-cli //命令行的一個(gè)客戶端 redis-sentinel -> redis-server redis-server //redis服務(wù)器啟動(dòng)的命令
接下來(lái)繼續(xù)我們的命令:
# cd redis-4.0.1 # cp redis.conf /usr/local/redis # cd /usr/local/redis # vim redis.conf //編輯Redis的配置文件
具體配置步驟:
1)綁定你的授權(quán)ip地址:修改69行的 bind 127.0.0.1 為 bind [host](綁定到所有網(wǎng)絡(luò): 注釋掉69行的 bind 127.0.0.1)
2)關(guān)閉保護(hù)模式:將88行的 protected-mode yes 修改為 daemonize no
3)配置后臺(tái)啟動(dòng):將136行的 daemonize no 修改為 daemonize yes
4)配置 Redis 持久化: RDB方式(默認(rèn)支持,不需要配置)和AOF方式(將509行的appendonly no 修改為 appendonly yes,538-540為同步策略的設(shè)置,開啟 appendfsync always,注釋 appendfsync everysec,always為沒(méi)修改一次就同步,everysec為每一秒同步,no為不同步,為了安全此處選擇 always)。
編輯完成后退出 vim,之后還需要開放 Redis 的 6379 端口:
# vim /etc/sysconfig/iptables //打開Linux防火墻的設(shè)置 //增加代碼 -A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT //退出 vim,執(zhí)行防火墻重啟命令 # service iptables restart # ./bin/redis-server ./redis.conf //啟動(dòng)redis服務(wù)器,可以通過(guò) ps -ef | grep -i redis 查看啟動(dòng)是否成功
還有一些其他 Redis 命令如下:
# ./bin/redis-cli shutdown //停止redis服務(wù)器 # ./bin/redis-cli //打開redis命令行客戶端
2.Redis的數(shù)據(jù)結(jié)構(gòu)
需要知道的是,Redis 的 Key 設(shè)置不要過(guò)長(zhǎng)也不要過(guò)短,要有統(tǒng)一的命名規(guī)范。先看一下 keys 的操作:
$ ssh root@192.168.2.10 //SSH連接 # /usr/local/redis/bin/redis-cli > keys * //顯示所有的key > keys my? //顯示以my開頭的所有key > del my1 my2 my3 //刪除my1、my2、my3 > exists my1 //檢查是否存在,存在返回1,不存在返回0 > get my1 //獲取key的value值 > rename my1 my2 //重命名my1為my2 > expire my1 1000 //設(shè)置key過(guò)期時(shí)間,單位秒 > ttl my1 //剩余超時(shí)時(shí)間,沒(méi)有設(shè)置則返回-1 > type my1 //獲取key對(duì)應(yīng)value的類型
1.存儲(chǔ)字符串 String
二進(jìn)制是安全的,存入和獲取的數(shù)據(jù)相同;Value 最多可以容納的數(shù)據(jù)長(zhǎng)度是 521 M。存儲(chǔ) String 常用的命令:
> set name zhangsan //賦值 set [key][value] > get name //取值 get [key] > getset name lisi //取值并賦值 > del name //刪除 del [key] > incr num //數(shù)值遞增1,如果沒(méi)有就默認(rèn)創(chuàng)建0并遞增1 incr [key] > decr num //數(shù)值遞減1,如果沒(méi)有就默認(rèn)創(chuàng)建0并遞減1 > incrby num2 5 //數(shù)值遞增指定值,如果沒(méi)有就默認(rèn)創(chuàng)建0 incrby [key][指定值] > decrby num2 5 //數(shù)值遞減指定值,如果沒(méi)有就默認(rèn)創(chuàng)建0 decrby [key][指定值] > append num3 5 //插入指定內(nèi)容,如果有則追加內(nèi)容,如果沒(méi)有則新創(chuàng)建 append [key][插入值]
2.存儲(chǔ)哈希 Hash
存儲(chǔ) Hash 可以看成是 String Key 和 String Value 的 Map 容器,適合存儲(chǔ) 值-對(duì)象 的信息,例如用戶名、密碼、年齡等等,每一個(gè) Hash 可以存儲(chǔ) 4294967295 個(gè)鍵值對(duì)。存儲(chǔ) Hash 常用的命令:
> hset myhash username tom //賦值單個(gè)屬性 hset [key][Hash鍵值對(duì)] > hmset myhash username tom2 rose age 20 //賦值多個(gè)屬性 hmset [key][Hash鍵值對(duì)1] rose [Hash鍵值對(duì)2] > hget myhash username //獲取單個(gè)屬性 hget [key][key2] > hmget myhash username age //獲取多個(gè)屬性 hget [key][key2][key3] > hgetall myhash //獲取全部值 > hdel myhash username age //刪除多個(gè)屬性 > del myhash //刪除整個(gè)集合 > hincrby myhash age 5 //增加屬性值 > hexists myhash username //判斷某個(gè)屬性中的key是否存在,存在返回1,不存在返回0 > hlen myhash //獲取屬性個(gè)數(shù) hlen [key1] > hkeys myhash //獲取所有屬性名稱 hkeys [key1]
3.存儲(chǔ)字符串列表 List
在 Redis 中,List(ArrayList 使用數(shù)組方式,LinkedList 使用雙向鏈表方式)順序是按照插入順序排序的一個(gè)字符串鏈表,和數(shù)據(jù)結(jié)構(gòu)中的普通鏈表是一樣的,可以在它的頭部和尾部添加新的元素,在插入的時(shí)候,如果該 key 不存在,那么 Redis 就會(huì)為這個(gè)鍵創(chuàng)建一個(gè)新的鏈表,相反,如果鏈表中所有元素都被移除了,那么該鍵也會(huì)被從數(shù)據(jù)庫(kù)中刪除。存儲(chǔ) List 常用的命令:
> lpush mylist a b c //從雙向鏈表的頭部開始添加,如果mylist不存在則創(chuàng)建 lpush [key][value1][value2].. > lpushx mylist d //從雙向鏈表的頭部開始添加,如果mylist不存在則不插入 > rpush mylist 1 2 3 //從雙向鏈表的尾部開始添加 > lrange mylist 0 5 //查看鏈表 lrange [key][開始位置][結(jié)束位置] > lpop mylist //彈出雙向鏈表的頭部元素,彈出后,雙向鏈表中就沒(méi)有這個(gè)元素了 > rpop mylist //彈出雙向鏈表的尾部元素 > rpoplpush mylist1 mylist2 //將mylist1里面頭部元素彈出插入mylist2頭部 > llen mylist //獲取元素個(gè)數(shù) llen [key] > lrem mylist 1 2 //從頭到尾刪除1個(gè)2 lrem [key][刪除的個(gè)數(shù)][刪除的元素] > lrem mylist -1 2 //從尾到頭刪除1個(gè)2 > lrem mylist 0 2 //從尾到頭刪除所有2 > lset mylist 3 k //第三個(gè)value值設(shè)置為k > linsert mylist before b 11 //第一個(gè)b之前插入11 > linsert mylist after b 22 //第一個(gè)b之后插入22
rpoplpush 命令在消息發(fā)布系統(tǒng)中的使用場(chǎng)景:
4.存儲(chǔ)字符串集合 Set
和 List 類型不同的是,Set 集合中不允許出現(xiàn)重復(fù)的元素,無(wú)序的,Set 可以包含的最大元素?cái)?shù)量是 4294967295。存儲(chǔ) Set 常用的命令:
> sadd myset a b c //向Set中添加了三個(gè)值 sadd [key][Set集合值] > srem myset a b //刪除指定元素 > smembers myset //查看Set中元素 smembers [key] > sismember myset c //判斷Set中是否存在c,存在返回1,不存在返回0 > sdiff myset myset2 //返回兩個(gè)Set集合的差集運(yùn)算 > sdiffstore my my1 my2 //將兩個(gè)Set集合的差集存儲(chǔ)到另一個(gè)集合(my)中 > sinter myset myset2 //返回兩個(gè)Set集合的交集運(yùn)算 > sunion myset myset2 //返回兩個(gè)Set集合的并集運(yùn)算 > scard myset //返回Set集合成員數(shù)量 > srandmember myset //隨機(jī)返回Set中一個(gè)成員
5.存儲(chǔ)有序字符串集合 SortedSet
SortedSet 中的成員在集合中的位置是有序的。存儲(chǔ) SortedSet 常用的命令:
> zadd mysort 65 aa 85 bb 95 cc //有序添加元素 zadd [key][姓名 分?jǐn)?shù)][姓名 分?jǐn)?shù)]... > zscore mysort aa //獲得分?jǐn)?shù) > zcard mysort //返回集合成員數(shù)量 > zrem mysort tom cc //刪除元素 > zrange mysort 0 -1 //范圍查詢,-1表示最后,顯示姓名 > zrange mysort 0 -1 withscores //范圍查詢,姓名分?jǐn)?shù)都會(huì)顯示 > zrevrange mysort 0 -1 withscores //范圍查詢,由大到小排序顯示 > zremrangebyrank mysort 0 2 //按照排序的范圍進(jìn)行刪除,0~2位置 > zremrangebyscore mysort 70 90 //按照分?jǐn)?shù)進(jìn)行刪除,70~90 > zrangebyscore mysort 0 90 //按照分?jǐn)?shù)查0~90之間的 > zrangebyscore mysort 0 90 withscores limit 0 2 //按照分?jǐn)?shù)查0~90之間的,由大到小排序,只顯示前2個(gè) > zcount mysort 60 100 //獲取60~100之間的個(gè)數(shù)
SortedSet 可以應(yīng)用于游戲的積分排行榜、構(gòu)建索引數(shù)據(jù)。
3.Redis的多數(shù)據(jù)庫(kù)和事務(wù)
一個(gè) Redis 實(shí)例最多可以提供16個(gè)數(shù)據(jù)庫(kù)(0-15),默認(rèn)連接第 0 號(hào)數(shù)據(jù)庫(kù),也可以通過(guò)select 選擇數(shù)據(jù)庫(kù):
> select 1 //選擇1號(hào)數(shù)據(jù)庫(kù) > move myset 2 //移動(dòng)myset到2號(hào)數(shù)據(jù)庫(kù)
支持事務(wù)(所有命令都將串行化執(zhí)行)的操作:
> multi //開啟事務(wù) > exec //提交事務(wù) > discard //回滾事務(wù)
4.使用Jedis操作Redis數(shù)據(jù)庫(kù)
Jedis(https://github.com/xetorthio/jedis)是 Redis 官方首選的 Java 客戶端開發(fā)包,
需要添加 Maven 依賴:
<!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> <type>jar</type> <scope>compile</scope> </dependency>
普通方式操作 Redis:
Jedis jedis = null; try { jedis = new Jedis("123.57.73.52",6379); jedis.set("name", "zhangsan"); //保存數(shù)據(jù) String value = jedis.get("name"); //獲取數(shù)據(jù) System.out.println(value); } catch (Exception e) { e.printStackTrace(); } finally { jedis.close(); //釋放資源 }
使用 Jedis 連接池操作 Redis:
//獲得連接池的配置對(duì)象 JedisPoolConfig config = new JedisPoolConfig(); //設(shè)置最大連接數(shù), 默認(rèn)8個(gè) config.setMaxTotal(8); //設(shè)置最大空閑連接數(shù), 默認(rèn)8個(gè) config.setMaxIdle(8); //獲得連接池 JedisPool jedisPool = new JedisPool(config, "123.57.73.52",6379); //獲得核心對(duì)象 Jedis jedis = null; try { jedis = jedisPool.getResource(); jedis.set("name2", "lisi"); //保存數(shù)據(jù) String value = jedis.get("name2"); //獲取數(shù)據(jù) System.out.println(value); } catch (Exception e) { e.printStackTrace(); } finally { jedis.close(); //釋放資源 }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot集成swagger、knife4j及常用注解的使用
這篇文章主要介紹了springboot集成swagger、knife4j及常用注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Java實(shí)現(xiàn)可視化走迷宮小游戲的示例代碼
這篇文章主要介紹了Java如何實(shí)現(xiàn)可視化走迷宮小游戲。本程序適用于java程序員鞏固類與對(duì)象、文件讀取、事件響應(yīng)、awt包中各種工具的相關(guān)概念以及對(duì)邏輯能力的鍛煉,需要的可以參考一下2022-11-11mybatis?獲取更新(update)記錄的id之<selectKey>用法說(shuō)明
這篇文章主要介紹了mybatis?獲取更新(update)記錄的id之<selectKey>用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05解決springboot URL帶有斜杠的轉(zhuǎn)義字符百分之2F導(dǎo)致的400錯(cuò)誤
這篇文章主要介紹了解決springboot URL帶有斜杠的轉(zhuǎn)義字符百分之2F導(dǎo)致的400錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java多態(tài)實(shí)現(xiàn)原理詳細(xì)梳理總結(jié)
這篇文章主要介紹了Java多態(tài)實(shí)現(xiàn)原理詳細(xì)梳理總結(jié),多態(tài)是繼封裝、繼承之后,面向?qū)ο蟮牡谌筇匦裕疚闹豢偨Y(jié)了多態(tài)的實(shí)現(xiàn)原理,需要的朋友可以參考一下2022-06-06