redis的基本數(shù)據(jù)類型(redis設(shè)置開機(jī)自啟動)
Redis緩存是針對于業(yè)務(wù)數(shù)據(jù)緩存還是對數(shù)據(jù)庫數(shù)據(jù)緩存不應(yīng)該問Redis緩存的是業(yè)務(wù)數(shù)據(jù)還是數(shù)據(jù)庫數(shù)據(jù),可以問Redis是屬于業(yè)務(wù)層還是數(shù)據(jù)層,這樣問比較合理。我覺得R...
Redis緩存是針對于業(yè)務(wù)數(shù)據(jù)緩存還是對數(shù)據(jù)庫數(shù)據(jù)緩存
不應(yīng)該問Redis緩存的是業(yè)務(wù)數(shù)據(jù)還是數(shù)據(jù)庫數(shù)據(jù),可以問Redis是屬于業(yè)務(wù)層還是數(shù)據(jù)層,這樣問比較合理。
我覺得Redis屬于數(shù)據(jù)層;首先我們先看一個(gè)概念。
DAOdataaccessobject:數(shù)據(jù)訪問對象
主要用來封裝對數(shù)據(jù)的訪問,注意,是對數(shù)據(jù)的訪問,不是對數(shù)據(jù)庫的訪問。
其實(shí)你的數(shù)據(jù)可以在數(shù)據(jù)庫,在文件中,還是在Redis中,都可以通過DAO層訪問。
所以我把Redis看成和數(shù)據(jù)庫是同一個(gè)級別的。
Mybatis的二級緩存我們使用Redis的時(shí)候,很多時(shí)候都是通過代碼操作Redis,比如使用用Jedis,其實(shí)還有一個(gè)簡單的辦法,就是使用Redis做Mybatis的二級緩存,只需要做簡單的配置和極少量的代碼即可。
我們之前做的一個(gè)項(xiàng)目,會有大量的數(shù)據(jù)需要頻繁被查詢,很少(幾乎沒有)做新增修改刪除的操作,這種數(shù)據(jù)很適合使用Redis進(jìn)行緩存,所以新的版本想把Redis引入進(jìn)來。
引入所需要的jar包:
增加配置文件
實(shí)現(xiàn)org.apache.ibatis.cache.Cache接口
mybatis-config.xml開啟二級緩存:<settingname="cacheEnabled"value="true"/>
mybatis的Mapper配置文件中增加配置:
<cachetype="com.xxx.xxx.cache.RedisCache"/>
其中useCache="false"表示,這個(gè)查詢SQL不進(jìn)行緩存;useCache="true",這個(gè)查詢SQL的結(jié)果進(jìn)行緩存。
其余的insert、update、delete操作,可以進(jìn)行如下配置:flushCache="true/false",當(dāng)設(shè)置成true的時(shí)候,執(zhí)行sql會把redis中的緩存刪除(調(diào)用Cache實(shí)現(xiàn)類的clear()方法),設(shè)置成false,則不做操作。
所以到這里也可以清楚的理解何時(shí)進(jìn)行緩存、何時(shí)進(jìn)行刪除緩存了:程序剛啟動的時(shí)候,Redis中是空的。每次執(zhí)行select的時(shí)候,首先會去redis讀取,讀取不到的話,再去db中查詢,查詢結(jié)束后,將結(jié)果存入redis中(key里面包含了SQL語句),注意,如果sql查詢無結(jié)果,也會放入redis中。執(zhí)行insert、update、delete語句的時(shí)候,清除對應(yīng)的redis中的值。
整理的功能實(shí)現(xiàn)還是很簡單的,大家有興趣可以嘗試一下。
如果大家需要demo的源碼,后續(xù)我整理一下發(fā)出來,有需要的朋友可以關(guān)注下我。
redis可以存儲哪些數(shù)據(jù)類型
redis開創(chuàng)了一種新的數(shù)據(jù)存儲思路,使用redis,我們不用在面對功能單調(diào)的數(shù)據(jù)庫時(shí),把精力放在如何把大象放進(jìn)冰箱這樣的問題上,而是利用redis靈活多變的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作,為不同的大象構(gòu)建不同的冰箱。 redis常用數(shù)據(jù)類型 redis最為常用的數(shù)據(jù)類型主要有以下五種:string、hash、list、set、sortedset
redis七種數(shù)據(jù)類型
7種類型分別是:
1.字符串(string)
2.哈希(hash)
3.列表(list)
4.集合(set)
5.有序集合(sortedset)
6.位圖(Bitmaps)
7.基數(shù)統(tǒng)計(jì)(HyperLogLogs)
a、字符串
String是一組字節(jié)。在Redis數(shù)據(jù)庫中,字符串是二進(jìn)制安全的。這意味著它們具有已知長度,并且不受任何特殊終止字符的影響??梢栽谝粋€(gè)字符串中存儲最多512兆字節(jié)的內(nèi)容。
b、哈希
哈希是鍵值對的集合。在Redis中,哈希是字符串字段和字符串值之間的映射。因此,它們適合表示對象。
c、列表
Redis列表定義為字符串列表,按插入順序排序。可以將元素添加到Redis列表的頭部或尾部。
d、集合
集合(set)是Redis數(shù)據(jù)庫中的無序字符串集合。在Redis中,添加,刪除和查找的時(shí)間復(fù)雜度是O(1)。
e、有序集合
Redis有序集合類似于Redis集合,也是一組非重復(fù)的字符串集合。但是,排序集的每個(gè)成員都與一個(gè)分?jǐn)?shù)相關(guān)聯(lián),該分?jǐn)?shù)用于獲取從最小到最高分?jǐn)?shù)的有序排序集。雖然成員是獨(dú)特的,但可以重復(fù)分?jǐn)?shù)。
f、位圖RedisBitmap
RedisBitmap通過類似map結(jié)構(gòu)存放0或1(bit位)作為值。
RedisBitmap可以用來統(tǒng)計(jì)狀態(tài),如日活是否瀏覽過某個(gè)東西。
Redissetbit命令
Redissetbit命令用于設(shè)置或者清除一個(gè)bit位。
*Redissetbit命令語法格式
SETBITkeyoffsetvalue
g、基數(shù)統(tǒng)計(jì)HyperLogLogs
RedisHyperLogLog可以接受多個(gè)元素作為輸入,并給出輸入元素的基數(shù)估算值
基數(shù)
集合中不同元素的數(shù)量,比如{'apple','banana','cherry','banana','apple'}的基數(shù)就是3
估算值
算法給出的基數(shù)并不是精確的,可能會比實(shí)際稍微多一些或者稍微少一些,但會控制在合理的范圍之內(nèi)
HyperLogLog的優(yōu)點(diǎn)是:即使輸入元素的數(shù)量或者體積非常非常大,計(jì)算基數(shù)所需的空間總是固定的、并且是很小的。
在Redis里面,每個(gè)HyperLogLog鍵只需要花費(fèi)12KB內(nèi)存,就可以計(jì)算接近264個(gè)不同元素的基數(shù)。
這和計(jì)算基數(shù)時(shí),元素越多耗費(fèi)內(nèi)存就越多的集合形成鮮明對比。
因?yàn)镠yperLogLog只會根據(jù)輸入元素來計(jì)算基數(shù),而不會儲存輸入元素本身,所以HyperLogLog不能像集合那樣,返回輸入的各個(gè)元素。
RedisPFADD命令
RedisPFADD命令將元素添加至HyperLogLog
*RedisPFADD命令語法格式
PFADDkeyelement[element...]
redis有哪些數(shù)據(jù)類型
redis目前能夠在緩存領(lǐng)域迅速蠶食鯨吞memcached的市場占比,能夠在分布式架構(gòu)中扮演重要的地位,都與其支持多種數(shù)據(jù)類型(而memcached只支持一種)這個(gè)優(yōu)勢有關(guān)。
redis支持存儲的數(shù)據(jù)類型一共有5種,但是根據(jù)我的工作經(jīng)驗(yàn),最常用的只有三種,接下來,我就介紹下最常用的三種。
Listlist是redis中常用的數(shù)據(jù)類型,能夠進(jìn)行頭尾查找,插入,移除(lpop,lpush,rpop,rpush等等);
支持像Python一樣的分片讀?。╨rangeapi);
可以按照索引查找隊(duì)列中元素(lindex),刪除隊(duì)列中元素(lrem),修改隊(duì)列中元素(lset),還能獲取隊(duì)列長度(llen)。
list還有一個(gè)更加突出的功能,它可以從當(dāng)前隊(duì)列彈出一個(gè)值,然后插入到另一個(gè)隊(duì)列中(BRPOPLPUSH)。這個(gè)過程是原子的,保證了數(shù)據(jù)一致性,避免由于中間步驟失敗而導(dǎo)致數(shù)值丟失。
Setset其實(shí)和list類似,但是正如平時(shí)我們了解的set,首先它的存儲是無序的,其次它的存儲是去重的。也就是說,如果你需要記錄數(shù)據(jù)的插入順序,或者可能會插入重復(fù)數(shù)據(jù),并且數(shù)據(jù)不可去重的話,用list就更合適些,其它場景,就可以考慮用set。
set可以進(jìn)行基礎(chǔ)的增刪(sadd,srem),也能進(jìn)行進(jìn)行集合操作,比如求差集(sdiff),求交集(sinter),求并集(sunion),返回集合中全部元素,但是并不將它們彈出(smember)。同時(shí)set也支持像list一樣,用一個(gè)原子操作,把一個(gè)元素從當(dāng)前set彈出,并壓入另一個(gè)set(smove)。
hashhash是redis中最常用的一種數(shù)據(jù)結(jié)構(gòu),其實(shí)就是我們常說的map。
它是一個(gè)string型的key-value,因此特別適用于存儲序列化對象。理論上,每個(gè)hash可以存儲40多億個(gè)鍵值對。
hash的操作api要比set和list多了不少。
基礎(chǔ)的有hset,hget,hdel,hexist(檢查元素是否存在),hincrby(這個(gè)是為指定的整數(shù)字段加指定數(shù)值,相當(dāng)于能夠原子性的做到查找和修改,減少了我們自己去實(shí)現(xiàn)的麻煩)。
hash還有hgetAll,hgetKeys這種接口,能夠批量的把hash中指定字段的全部內(nèi)容都拉取回來。但是要慎用,我曾親身經(jīng)歷過,在server高并發(fā)情況下,會導(dǎo)致server出現(xiàn)OOM。
除了上面介紹的常用的三種,redis還支持String和sortedset,但是由于不太常用,因此不在此介紹了。
以上是我的淺見,歡迎各位在下方評論區(qū)交流點(diǎn)贊。
我是蘇蘇思量,來自BAT的Java開發(fā)工程師,每日分享科技類見聞,歡迎關(guān)注我,與我共同進(jìn)步。
本文鏈接:http://xinin56.com/kaifa/1390.html