其實說到redis,一個廣泛流行的中間件。依稀記得當(dāng)年還是小白的時候第一次聽老板講redis簡直覺得神奇又神秘艾恼。依稀記得那是一個冬天住涉,剛剛參加工作以前只知道spring,spring mvc钠绍,spring boot舆声,mybatis等。然后第一份工作實習(xí)過后轉(zhuǎn)正的日子里柳爽。老板讓我看看redis和elasticsearch媳握。然后云里霧里的自己學(xué)習(xí)×赘看了官網(wǎng)蛾找,記了筆記。但是對于中間件的理解還是一知半解赵誓。一次下班的晚上自覺加班學(xué)習(xí)打毛。和老板閑聊時老板給我出了一個場景讓我解決。就是一個2g服務(wù)器做秒殺活動怎么做架曹?當(dāng)時知識儲匯少的可憐的我除了加服務(wù)器竟然無法可想隘冲。然后老板指點我說redis。至今我還記得那種初入神奇的知識海洋的激動和感嘆绑雄。并在自己的u盤記錄了幾句心得展辞。在此分享給大家。
其實在于現(xiàn)在的我來講万牺,這個言語和理解略有單純和淺薄罗珍。可是這種心情卻值得銘記和回憶脚粟。一般來講我的文章都會寫的心路歷程和想法較多覆旱,并不是為了湊字數(shù),而是希望不經(jīng)意的某個想法能讓某個新人看了豁然開朗或者學(xué)到些什么核无。我也是這么一點一滴過來的扣唱,反正于我而言很多時候看帖子真的純干貨的技術(shù)貼反而不太明白。我希望自己做到寫的東西基礎(chǔ)薄弱也能看懂团南。如果因此做的太滿反而廢話很多噪沙,對此感到抱歉。
閑不多談繼續(xù)說redis在java中的使用吐根。
1正歼,導(dǎo)包(因為我習(xí)慣用sb框架,所以這里用的也是data-redis)
<dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter-data-redis</artifactId>
? ? ? ? </dependency>
2拷橘,配置文件中配置(>忠濉喜爷!還要注意一點,我這里是采用了redis的一主二從三哨兵模式萄唇。所以配置的也是哨兵檩帐。如果普通直連會更簡單)
#因為是哨兵所以是redis.sentinel.master。名字是在redis中配置的穷绵。別盲目copy
spring.redis.sentinel.master=master001
spring.redis.password=XXXXX
#因為哨兵肯定多節(jié)點轿塔。。中間英文“仲墨,”分割
spring.redis.sentinel.nodes=192.168.1.106:26379,192.168.1.107:26379,192.168.1.108:26379
#超時時間啥的~~真的是千篇一律~~沒啥說的了勾缭。下面的都可以省略的
spring.redis.timeout=5000
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.pool.min-idle=0
spring.redis.pool.max-idle=8
3,配置完了之后就可以直接autowired注入使用了目养。這里必須感謝下spring家族的高度封裝俩由。這里是一個最簡單的存取demo
package com.example.demo.redis;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class RedisUtil {
@Autowired
StringRedisTemplate stringRedisTemplate;
public String setRedis(String key,String value) {
stringRedisTemplate.opsForValue().set(key, value, 50l,TimeUnit.SECONDS);
return "ok";
}
public String getRedis(String key) {
String value =stringRedisTemplate.opsForValue().get(key);
return value;
}
}
這里廢話多一點加上延伸一點內(nèi)容,一步步講解下StringRedisTemplate:
? ? -和redis中的數(shù)據(jù)類型是一樣的癌蚁。也分為五種幻梯,對應(yīng)著不同的方法:
? ? ? ? ? ? ? ? stringRedisTemplate.opsForValue(); //操作字符串
??????????????? stringRedisTemplate.opsForHash(); //操作hash
? ? ? ? ? ? ? ? stringRedisTemplate.opsForList(); //操作list
? ? ? ? ? ? ? ? stringRedisTemplate.opsForSet(); ? //操作set
????????????????stringRedisTemplate.opsForZSet(); //操作有序set
? ? -這里再聲明一下redis中的數(shù)據(jù)類型:鍵的類型只能為字符串,值支持五種數(shù)據(jù)類型:字符串努释、列表碘梢、集合、散列表伐蒂、有序集合煞躬。
? ? 對redis概念還不熟的童鞋可以參考下這份文檔:Redis
其實我個人可能經(jīng)歷不足,所以一般用redis都是存儲字符串的逸邦。哪怕是真的存別的數(shù)據(jù)類型恩沛。我也都是以json串的形式存儲,取的時候再解析缕减。
這里明確講一下雷客,上面方法獲取的是redis中value是該類型的所有實例。例如下面:獲取數(shù)據(jù)庫中值是String類型的所有數(shù)據(jù)
????????ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
然后我們在這個基礎(chǔ)上可以添加桥狡,查詢等:
? ? ? ? ops.set(key,value); //向redis中插入數(shù)據(jù)搅裙。因為這個沒有設(shè)置過期時間所以是永久存儲的。
? ? ? ? ops.set(key,value,time,timeUtil); //向redis中插入數(shù)據(jù)裹芝。第三個參數(shù)是一個long型的時間呈宇。最后一個參數(shù)是時間的單位。比如我上面demo中就是設(shè)置的50秒過期局雄。
? ? ? ? ops.get(key);//獲取redis中指定key 的value值。
注意下上面的是針對字符串類型value的操作存炮。如果是別的值類型操作是有一點點不同的炬搭,例如set:
????????stringRedisTemplate.opsForSet().add("keySet", "1","2","3"); //向指定key中存放set集合
????????stringRedisTemplate.opsForSet().isMember("keySet", "1"); //根據(jù)key查看集合中是否存在指定數(shù)據(jù)
????????stringRedisTemplate.opsForSet().members("keySet"); //根據(jù)key獲取set集合
stringRedisTemplate還有一些別的方法:
stringRedisTemplate.expire(key,1000 , TimeUnit.MILLISECONDS); //設(shè)置過期時間
stringRedisTemplate.hasKey("isHas"); //檢查key是否存在蜈漓,返回boolean值
stringRedisTemplate.delete(key); //根據(jù)key刪除記錄
stringRedisTemplate.getExpire(key); //根據(jù)key獲取過期時間
stringRedisTemplate.getExpire(key,TimeUnit.SECONDS); //根據(jù)key獲取過期時間并換算成指定單位
差不多常用的就這些了吧宫盔。其實StringRedisTemplate是一個spring替我們封裝好了的一個類融虽。它繼承自redisTemplate。具體區(qū)別啥的大眾又沒有實際意義的說:1灼芭,不共通有额。 2,使用的序列化類不同彼绷。你要是看到這就能看懂只能夸一句你很棒棒哦~~但是實際上要想深入了解我建議大家還是看看spring官網(wǎng)上的介紹巍佑。
還有就是redis涉及到發(fā)布訂閱事務(wù)處理,集群設(shè)置之類的相對于存儲比較深奧的東西寄悯,我建議大家還是先把官網(wǎng)的文檔都讀一遍萤衰。有不理解的再去單獨查詢。這里丟個官方手冊地址:spring-data-redis猜旬。
然后如果有什么疑問或者覺得我說的哪里有問題歡迎留言或者私信指出脆栋。
全文手打~~這么不容易的寫個文~~如果你覺得用到了理解了~留個言點個贊轉(zhuǎn)個發(fā)什么的啊~