Redis - 一款NoSQL數(shù)據(jù)庫(kù)
使用步驟:
- 導(dǎo)入commons-pool的jar包和Jedis的jar包
- 簡(jiǎn)單測(cè)試
public void test1() {
Jedis jedis = new Jedis("192.168.195.128", 6379);
String string = jedis.get("username");
System.out.println(string);
jedis.set("addr", "BeiJing北京");
System.out.println(jedis.get("addr"));
jedis.close();
}
- 封裝JedisPoolUtils
- JedisPoolUtils.java
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolUtils {
private static JedisPool pool = null;
static {
// 創(chuàng)建一個(gè)redis的連接池
Properties prop = new Properties();
try {
prop.load(JedisPoolUtils.class.getClassLoader().getResourceAsStream("redis.properties"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
JedisPoolConfig poolConfig = new JedisPoolConfig();
int maxIdle = new Integer(prop.getProperty("redis.maxIdle"));
int minIdle = new Integer(prop.getProperty("redis.minIdle"));
int maxTotal = new Integer(prop.getProperty("redis.maxTotal"));
poolConfig.setMaxIdle(maxIdle);// 最大閑置個(gè)數(shù)
poolConfig.setMinIdle(minIdle);// 最小閑置個(gè)數(shù)
poolConfig.setMaxTotal(maxTotal);// 最大連接數(shù)
String host = prop.getProperty("redis.host");
int port = new Integer(prop.getProperty("redis.port"));
pool = new JedisPool(poolConfig, host, port);
}
public static Jedis getJedis() {
return pool.getResource();
}
}
- redis.properties
redis.maxIdle=30
redis.minIdle=10
redis.maxTotal=100
redis.host=127.0.0.1
redis.port=6379
- 關(guān)于關(guān)系型數(shù)據(jù)庫(kù)和nosql數(shù)據(jù)庫(kù)
關(guān)系型數(shù)據(jù)庫(kù)是基于關(guān)系表的數(shù)據(jù)庫(kù),最終會(huì)將數(shù)據(jù)持久化到磁盤上,而nosql數(shù)據(jù)庫(kù)是基于特殊的結(jié)構(gòu)吹艇,并將數(shù)據(jù)存儲(chǔ)到內(nèi)存的數(shù)據(jù)庫(kù)。從性能上而言港粱,nosql數(shù)據(jù)庫(kù) 要優(yōu)于關(guān)系型數(shù)據(jù)庫(kù)简逮,從安全性上而言關(guān)系型數(shù)據(jù)庫(kù)要優(yōu)于nosql數(shù)據(jù)庫(kù),所以在實(shí)際開發(fā)中一個(gè)項(xiàng)目中nosql和關(guān)系型數(shù)據(jù)庫(kù)會(huì)一起使用蒜胖,達(dá)到性能和安全性的雙保證今缚。 - 關(guān)于Redis數(shù)據(jù)庫(kù)
redis是一種高級(jí)的key-value的存儲(chǔ)系統(tǒng)
其中的key是字符串類型算柳,盡可能滿足如下幾點(diǎn):
1)key不要太長(zhǎng),最好不要操作1024個(gè)字節(jié)荚斯,這不僅會(huì)消耗內(nèi)存還會(huì)降低查找 效率
2)key不要太短埠居,如果太短會(huì)降低key的可讀性
3)在項(xiàng)目中,key最好有一個(gè)統(tǒng)一的命名規(guī)范(根據(jù)企業(yè)的需求)
其中value支持五種數(shù)據(jù)類型:
1)字符串型 string
2)字符串列表 list
3)字符串集合 set
4)有序字符串集合 sorted set
5)哈希類型 hash
常用操作指令
1.存儲(chǔ)字符串string
字符串類型是Redis中最為基礎(chǔ)的數(shù)據(jù)存儲(chǔ)類型事期,它在Redis中是二進(jìn)制安全的滥壕,這 便意味著該類型可以接受任何格式的數(shù)據(jù),如JPEG圖像數(shù)據(jù)或Json對(duì)象描述信息等兽泣。 在Redis中字符串類型的Value最多可以容納的數(shù)據(jù)長(zhǎng)度是512M
1)set key value:設(shè)定key持有指定的字符串value绎橘,如果該key存在則進(jìn)行覆蓋 操作。總是返回”O(jiān)K”
2)get key:獲取key的value称鳞。如果與該key關(guān)聯(lián)的value不是String類型涮较,redis 將返回錯(cuò)誤信息,因?yàn)間et命令只能用于獲取String value冈止;如果該key不存在狂票,返 回null。
3)getset key value:先獲取該key的值熙暴,然后在設(shè)置該key的值闺属。
4)incr key:將指定的key的value原子性的遞增1.如果該key不存在,其初始值 為0周霉,在incr之后其值為1掂器。如果value的值不能轉(zhuǎn)成整型,如hello俱箱,該操作將執(zhí) 行失敗并返回相應(yīng)的錯(cuò)誤信息国瓮。
5)decr key:將指定的key的value原子性的遞減1.如果該key不存在,其初始值 為0狞谱,在incr之后其值為-1乃摹。如果value的值不能轉(zhuǎn)成整型,如hello芋簿,該操作將執(zhí) 行失敗并返回相應(yīng)的錯(cuò)誤信息峡懈。
6)incrby key increment:將指定的key的value原子性增加increment,如果該 key不存在与斤,器初始值為0,在incrby之后荚恶,該值為increment撩穿。如果該值不能轉(zhuǎn)成 整型,如hello則失敗并返回錯(cuò)誤信息
7)decrby key decrement:將指定的key的value原子性減少decrement谒撼,如果 該key不存在食寡,器初始值為0,在decrby之后廓潜,該值為decrement抵皱。如果該值不能 轉(zhuǎn)成整型,如hello則失敗并返回錯(cuò)誤信息
8)append key value:如果該key存在辩蛋,則在原有的value后追加該值呻畸;如果該 key 不存在,則重新創(chuàng)建一個(gè)key/value
2.存儲(chǔ)list類型
在Redis中悼院,List類型是按照插入順序排序的字符串鏈表伤为。和數(shù)據(jù)結(jié)構(gòu)中的普通鏈表 一樣,我們可以在其頭部(left)和尾部(right)添加新的元素据途。在插入時(shí)绞愚,如果該鍵并不 存在叙甸,Redis將為該鍵創(chuàng)建一個(gè)新的鏈表。與此相反位衩,如果鏈表中所有的元素均被移 除裆蒸,那么該鍵也將會(huì)被從數(shù)據(jù)庫(kù)中刪除。List中可以包含的最大元素?cái)?shù)量是 4294967295糖驴。
從元素插入和刪除的效率視角來看光戈,如果我們是在鏈表的兩頭插入或刪除元素,這將 會(huì)是非常高效的操作遂赠,即使鏈表中已經(jīng)存儲(chǔ)了百萬(wàn)條記錄久妆,該操作也可以在常量時(shí)間 內(nèi)完成。然而需要說明的是跷睦,如果元素插入或刪除操作是作用于鏈表中間筷弦,那將會(huì)是 非常低效的。相信對(duì)于有良好數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)的開發(fā)者而言抑诸,這一點(diǎn)并不難理解烂琴。
1)lpush key value1 value2...:在指定的key所關(guān)聯(lián)的list的頭部插入所有的 values,如果該key不存在蜕乡,該命令在插入的之前創(chuàng)建一個(gè)與該key關(guān)聯(lián)的空鏈 表奸绷,之后再向該鏈表的頭部插入數(shù)據(jù)。插入成功层玲,返回元素的個(gè)數(shù)号醉。
2)rpush key value1、value2…:在該list的尾部添加元素
3)lrange key start end:獲取鏈表中從start到end的元素的值辛块,start畔派、end可 為負(fù)數(shù),若為-1則表示鏈表尾部的元素润绵,-2則表示倒數(shù)第二個(gè)线椰,依次類推…
4)lpushx key value:僅當(dāng)參數(shù)中指定的key存在時(shí)(如果與key管理的list中沒 有值時(shí),則該key是不存在的)在指定的key所關(guān)聯(lián)的list的頭部插入value尘盼。
5)rpushx key value:在該list的尾部添加元素
6)lpop key:返回并彈出指定的key關(guān)聯(lián)的鏈表中的第一個(gè)元素憨愉,即頭部元素。
7)rpop key:從尾部彈出元素卿捎。
8)rpoplpush resource destination:將鏈表中的尾部元素彈出并添加到頭部
9)llen key:返回指定的key關(guān)聯(lián)的鏈表中的元素的數(shù)量配紫。
10)lset key index value:設(shè)置鏈表中的index的腳標(biāo)的元素值,0代表鏈表的頭元 素娇澎,-1代表鏈表的尾元素笨蚁。
11)lrem key count value:刪除count個(gè)值為value的元素,如果count大于0,從頭向尾遍歷并刪除count個(gè)值為value的元素括细,如果count小于0伪很,則從尾向頭遍歷并刪除。如果count等于0奋单,則刪除鏈表中所有等于value的元素锉试。
12)linsert key before|after pivot value:在pivot元素前或者后插入value這個(gè) 元素。
3.存儲(chǔ)set類型
在Redis中览濒,我們可以將Set類型看作為沒有排序的字符集合呆盖,和List類型一樣,我 們也可以在該類型的數(shù)據(jù)值上執(zhí)行添加贷笛、刪除或判斷某一元素是否存在等操作应又。需要 說明的是,這些操作的時(shí)間是常量時(shí)間乏苦。Set可包含的最大元素?cái)?shù)是4294967295株扛。
和List類型不同的是,Set集合中不允許出現(xiàn)重復(fù)的元素汇荐。和List類型相比洞就,Set類 型在功能上還存在著一個(gè)非常重要的特性,即在服務(wù)器端完成多個(gè)Sets之間的聚合計(jì) 算操作掀淘,如unions旬蟋、intersections和differences。由于這些操作均在服務(wù)端完成革娄, 因此效率極高倾贰,而且也節(jié)省了大量的網(wǎng)絡(luò)IO開銷
?1)sadd key value1、value2…:向set中添加數(shù)據(jù)稠腊,如果該key的值已有則不會(huì) 重復(fù)添加
?2)smembers key:獲取set中所有的成員
?3)scard key:獲取set中成員的數(shù)量
?4)sismember key member:判斷參數(shù)中指定的成員是否在該set中躁染,1表示存 在,0表示不存在或者該key本身就不存在
?5)srem key member1架忌、member2…:刪除set中指定的成員
?6)srandmember key:隨機(jī)返回set中的一個(gè)成員
?7)sdiff sdiff key1 key2:返回key1與key2中相差的成員,而且與key的順序有 關(guān)我衬。即返回差集叹放。
?8)sdiffstore destination key1 key2:將key1、key2相差的成員存儲(chǔ)在 destination上
?9)sinter key[key1,key2…]:返回交集挠羔。
?10)sinterstore destination key1 key2:將返回的交集存儲(chǔ)在destination上
?11)sunion key1井仰、key2:返回并集。
?12)sunionstore destination key1 key2:將返回的并集存儲(chǔ)在destination上
4.存儲(chǔ)sortedset
Sorted-Sets和Sets類型極為相似破加,它們都是字符串的集合俱恶,都不允許重復(fù)的成員出 現(xiàn)在一個(gè)Set中。它們之間的主要差別是Sorted-Sets中的每一個(gè)成員都會(huì)有一個(gè)分 數(shù)(score)與之關(guān)聯(lián),Redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序合是。然 而需要額外指出的是了罪,盡管Sorted-Sets中的成員必須是唯一的,但是分?jǐn)?shù)(score) 卻是可以重復(fù)的聪全。
在Sorted-Set中添加泊藕、刪除或更新一個(gè)成員都是非常快速的操作难礼,其時(shí)間復(fù)雜度為 集合中成員數(shù)量的對(duì)數(shù)娃圆。由于Sorted-Sets中的成員在集合中的位置是有序的,因此蛾茉, 即便是訪問位于集合中部的成員也仍然是非常高效的讼呢。事實(shí)上,Redis所具有的這一 特征在很多其它類型的數(shù)據(jù)庫(kù)中是很難實(shí)現(xiàn)的谦炬,換句話說悦屏,在該點(diǎn)上要想達(dá)到和Redis 同樣的高效,在其它數(shù)據(jù)庫(kù)中進(jìn)行建模是非常困難的吧寺。
例如:游戲排名窜管、微博熱點(diǎn)話題等使用場(chǎng)景。
?1)zadd key score member score2 member2 … :將所有成員以及該成員的 分?jǐn)?shù)存放到sorted-set中
?2)zcard key:獲取集合中的成員數(shù)量
?3)zcount key min max:獲取分?jǐn)?shù)在[min,max]之間的成員
?zincrby key increment member:設(shè)置指定成員的增加的分?jǐn)?shù)稚机。
?zrange key start end [withscores]:獲取集合中腳標(biāo)為start-end的成員幕帆,[withscores]參數(shù)表明返回的成員包含其分?jǐn)?shù)。
?zrangebyscore key min max [withscores] [limit offset count]:返回分?jǐn)?shù)在[min,max]的成員并按照分?jǐn)?shù)從低到高排序赖条。[withscores]:顯示分?jǐn)?shù)失乾;[limit offset count]:offset,表明從腳標(biāo)為offset的元素開始并返回count個(gè)成員纬乍。
?zrank key member:返回成員在集合中的位置碱茁。
?zrem key member[member…]:移除集合中指定的成員,可以指定多個(gè)成員仿贬。
?zscore key member:返回指定成員的分?jǐn)?shù)
5.存儲(chǔ)hash
Redis中的Hashes類型可以看成具有String Key和String Value的map容器纽竣。所 以該類型非常適合于存儲(chǔ)值對(duì)象的信息。如Username茧泪、Password和Age等蜓氨。如果 Hash中包含很少的字段,那么該類型的數(shù)據(jù)也將僅占用很少的磁盤空間队伟。每一個(gè)Hash 可以存儲(chǔ)4294967295個(gè)鍵值對(duì)穴吹。
?
?1)hset key field value:為指定的key設(shè)定field/value對(duì)(鍵值對(duì))。
?2)hgetall key:獲取key中的所有filed-vaule
?3)hget key field:返回指定的key中的field的值
?4)hmset key fields:設(shè)置key中的多個(gè)filed/value
?5)hmget key fileds:獲取key中的多個(gè)filed的值
?6)hexists key field:判斷指定的key中的filed是否存在
?7)hlen key:獲取key所包含的field的數(shù)量
?8)hincrby key field increment:設(shè)置key中filed的值增加increment嗜侮,如:age 增加20