redis的基本數(shù)據(jù)類型(redis設(shè)置開(kāi)機(jī)自啟動(dòng))
夕逆IT
- 開(kāi)發(fā)語(yǔ)言
- 2023-08-13
- 338

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