Java - 通過Jedis操作Redis數(shù)據(jù)庫(kù)

Redis - 一款NoSQL數(shù)據(jù)庫(kù)
使用步驟:

  1. 導(dǎo)入commons-pool的jar包和Jedis的jar包
  2. 簡(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();
    }
  1. 封裝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
  1. 關(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á)到性能和安全性的雙保證今缚。
  2. 關(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

string

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。
set & get操作

3)getset key value:先獲取該key的值熙暴,然后在設(shè)置該key的值闺属。

getset操作

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ò)誤信息

incrby & decrby

8)append key value:如果該key存在辩蛋,則在原有的value后追加該值呻畸;如果該 key 不存在,則重新創(chuàng)建一個(gè)key/value
追加append值

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)并不難理解烂琴。


list

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è)线椰,依次類推…

lpush & lrange

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的尾部添加元素
lpushx & rpushx

6)lpop key:返回并彈出指定的key關(guān)聯(lián)的鏈表中的第一個(gè)元素憨愉,即頭部元素。
7)rpop key:從尾部彈出元素卿捎。
lpop

8)rpoplpush resource destination:將鏈表中的尾部元素彈出并添加到頭部
lpoplpush

9)llen key:返回指定的key關(guān)聯(lián)的鏈表中的元素的數(shù)量配紫。
llen

10)lset key index value:設(shè)置鏈表中的index的腳標(biāo)的元素值,0代表鏈表的頭元 素娇澎,-1代表鏈表的尾元素笨蚁。
10.png

11)lrem key count value:刪除count個(gè)值為value的元素,如果count大于0,從頭向尾遍歷并刪除count個(gè)值為value的元素括细,如果count小于0伪很,則從尾向頭遍歷并刪除。如果count等于0奋单,則刪除鏈表中所有等于value的元素锉试。

11.png

12)linsert key before|after pivot value:在pivot元素前或者后插入value這個(gè) 元素。

12.png

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開銷


set

?1)sadd key value1、value2…:向set中添加數(shù)據(jù)稠腊,如果該key的值已有則不會(huì) 重復(fù)添加
?2)smembers key:獲取set中所有的成員
?3)scard key:獲取set中成員的數(shù)量


3.png

?4)sismember key member:判斷參數(shù)中指定的成員是否在該set中躁染,1表示存 在,0表示不存在或者該key本身就不存在

?5)srem key member1架忌、member2…:刪除set中指定的成員


5.png

?6)srandmember key:隨機(jī)返回set中的一個(gè)成員


6.png

?7)sdiff sdiff key1 key2:返回key1與key2中相差的成員,而且與key的順序有 關(guān)我衬。即返回差集叹放。


7.png

?8)sdiffstore destination key1 key2:將key1、key2相差的成員存儲(chǔ)在 destination上


8.png

?9)sinter key[key1,key2…]:返回交集挠羔。

?10)sinterstore destination key1 key2:將返回的交集存儲(chǔ)在destination上


10.png

?11)sunion key1井仰、key2:返回并集。


11.png

?12)sunionstore destination key1 key2:將返回的并集存儲(chǔ)在destination上


12.png

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)景。


0.png

?1)zadd key score member score2 member2 … :將所有成員以及該成員的 分?jǐn)?shù)存放到sorted-set中

?2)zcard key:獲取集合中的成員數(shù)量

2.png

?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ì)穴吹。


5.png

?

?1)hset key field value:為指定的key設(shè)定field/value對(duì)(鍵值對(duì))。

?2)hgetall key:獲取key中的所有filed-vaule

2.png

?3)hget key field:返回指定的key中的field的值

3.png

?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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末港令,一起剝皮案震驚了整個(gè)濱河市啥容,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌顷霹,老刑警劉巖咪惠,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異泼返,居然都是意外死亡硝逢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門绅喉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渠鸽,“玉大人,你說我怎么就攤上這事柴罐』崭浚” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵革屠,是天一觀的道長(zhǎng)凿试。 經(jīng)常有香客問我,道長(zhǎng)似芝,這世上最難降的妖魔是什么那婉? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮党瓮,結(jié)果婚禮上详炬,老公的妹妹穿的比我還像新娘。我一直安慰自己寞奸,他們只是感情好呛谜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枪萄,像睡著了一般隐岛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓷翻,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天聚凹,我揣著相機(jī)與錄音,去河邊找鬼齐帚。 笑死元践,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的童谒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼沪羔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼饥伊!你這毒婦竟也來了象浑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤琅豆,失蹤者是張志新(化名)和其女友劉穎愉豺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茫因,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚪拦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冻押。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驰贷。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖洛巢,靈堂內(nèi)的尸體忽然破棺而出括袒,到底是詐尸還是另有隱情,我是刑警寧澤稿茉,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布锹锰,位于F島的核電站,受9級(jí)特大地震影響漓库,放射性物質(zhì)發(fā)生泄漏恃慧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一渺蒿、第九天 我趴在偏房一處隱蔽的房頂上張望痢士。 院中可真熱鬧,春花似錦蘸嘶、人聲如沸良瞧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)褥蚯。三九已至,卻和暖如春况增,著一層夾襖步出監(jiān)牢的瞬間赞庶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工澳骤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歧强,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓为肮,卻偏偏與公主長(zhǎng)得像摊册,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颊艳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容