springboot redis

首先爲什麼要用redis。性能和併發,分佈式鎖也很方便。
redis的優缺點
缺點:Redis使用現場申請內存的方式來存儲數據,並且很少使用free-list等方式來優化內存分配,會在一定程度上存在內存碎片。
沒有索引,沒有外鍵,缺少int/date等基本數據類型,多條件查詢需要通過集合內聯(sinter,zinterstore) 和連接間接實現開發效率低,可維護性不佳。
優點:redis支持持久化操作。redis提供了兩種不同的持久化方法來講數據存儲到硬盤裏面,第一種是rdb形式,一種是aof形式。
沒有Scheme約束,數據結構的變更相對容易,一開始確定數據類型,抗壓能力強,性能極高,10萬/qps
Redis 定時、定期等多種緩存失效機制,減少內存泄漏
redis支持五種數據類型
redis五種數據類型建議的應用場景
https://blog.csdn.net/hcmony/article/details/80694560

redis集羣和分佈式
Redis有三種集羣模式,第一個就是主從模式,第二種“哨兵”模式,第三種是Cluster集羣模式,第三種的集羣模式是在Redis 3.x以後的版本才增加進來的,我們今天就來說一下Redis第一種集羣模式:主從集羣模式。
具體怎麼搭建?爲什麼叫集羣分佈式?不是集羣/分佈式?

redis哨兵是什麼?
看文章也是集羣模式中的一種

緩存的收益和成本
1、緩存帶來的回報
1)高速讀寫
緩存加速讀寫速度:CPU L1/L2/L3 Cache、Linux page Cache加速硬盤讀寫、瀏覽器緩存、Ehcache緩存數據庫結果
2)降低後端負載
後端服務器通過前端緩存降低負載: 業務端使用Redis降低後端MySQL負載等
2、緩存帶來的代價
1)數據不一致
緩存層和數據層有時間窗口不一致,和更新策略有關
2)代碼維護成本
原本只需要讀寫MySQL就能實現功能,但加入了緩存之後就要去維護緩存的數據,增加了代碼複雜度。
3)堆內緩存可能帶來內存溢出的風險影響用戶進程,如ehCache、loadingCache

               堆、java虛擬機棧、方法區、本地方法棧、程序計數器 

               堆內緩存和遠程服務器緩存redis的選擇

               1、堆內緩存一般性能更好,遠程緩存需要套接字傳輸

               2、用戶級別緩存儘量採用遠程緩存

               3、大數據量儘量採用遠程緩存,服務節點化原則

緩存雪崩
如果緩存集中在一段時間內失效,發生大量的緩存穿透,所有的查詢都落在數據庫上,造成了緩存雪崩。由於原有緩存失效,新緩存未到期間所有原本應該訪問緩存的請求都去查詢數據庫了,而對數據庫CPU 和內存造成巨大壓力,嚴重的會造成數據庫宕機。
解決方案在小d課堂的筆記裏 不沾上來了
緩存穿透
緩存穿透是指用戶查詢數據,在數據庫沒有,自然在緩存中也不會有。這樣就導致用戶查詢的時候,在緩存中找不到對應key的value,每次都要去數據庫再查詢一遍,然後返回空(相當於進行了兩次無用的查詢)。這樣請求就繞過緩存直接查數據庫

配置redis
docker安裝redis教程很多 再用到的時候自己搜一下吧
pom:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
application.properties:
#=========redis基礎配置=========
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6390
#連接超時時間 單位 ms(毫秒)
spring.redis.timeout=3000

        #=========redis線程池設置=========
        #連接池中的最大空閒連接,默認值也是8。
        spring.redis.pool.max-idle=200

        #連接池中的最小空閒連接,默認值也是0。
        spring.redis.pool.min-idle=200

        #如果賦值爲-1,則表示不限制;pool已經分配了maxActive個jedis實例,則此時pool的狀態爲exhausted(耗盡)。
        spring.redis.pool.max-active=2000

        #等待可用連接的最大時間,單位毫秒,默認值爲-1,表示永不超時
        spring.redis.pool.max-wait=1000

工具類:br/>@Resource
private StringRedisTemplate stringRedisTemplate;
RedisTemplate中定義了5種數據結構操作
redisTemplate.opsForValue();  //操作字符串
redisTemplate.opsForHash();   //操作hash
redisTemplate.opsForList();   //操作list
redisTemplate.opsForSet();   //操作set
redisTemplate.opsForZSet();   //操作有序set
主要學習了opsForList的一些用法。range是取值 不影響集合,leftpop rightpop是彈出值
外網訪問配置:
protected-mode no

redistemplate存儲的key的value帶有亂碼\xAC\xED\x00\x05sr\x00\x11java.lang.Integer\x12\xE2\xA0\xA4\xF7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xAC\x95\x1D\x0B\x94\xE0\x8B\x02\x00\x00xp\x00\x00\x00\x02
解決方法:

@Configuration
public class RedisConfigurtion {

    @Autowired
    private RedisTemplate redisTemplate;

    @Bean
    public RedisTemplate<String, Object> stringSerializerRedisTemplate() {
        RedisSerializer<String> stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);
        return redisTemplate;
    }

}

常用的五種redis數據類型略過,着重看zset 看看是怎麼回事。
與set一樣不允許有重複的元素,但score可以重複。

下午拿回耳機繼續redis的demo
因爲在service層需要加註解@Service ,但實現的接口也叫service,導致註解只能寫這個@org.springframework.stereotype.Service。以後不要犯。

幾個常用的方法
add add("zset1","zset-1",1.0))新增一個有序集合
remove remove("zset1","zset-6"))從有序集合中移除一個或者多個元素
range range("zset1",0,-1));0至-1是所有, 0至99是 去分數0-99的所有數據
size 獲取有序集合的成員數,內部調用的就是zCard方法
incrementScore incrementScore("zset1","zset-1",1.1));增加元素的score值,並返回增加後的值
rank rank("zset1","zset-2"));返回有序集中指定成員的排名,其中有序集成員按分數值遞增(從小到大)順序排列
range range("zset1",0,-1))通過索引區間返回有序集合成指定區間內的成員,其中有序集成員按分數值遞增(從小到大)順序排列 注意下表也是從0開始的 如果 1, 10 那麼實際是相當於第二名開始的。


ok簡單的redis操作就看這些吧
redis自己寫了一個緩存demo 相比 mysql着實快了不少

其中有幾點以後需要的時候再看
redis的二級緩存和redis的事物機制,數據持久化的方式rdb和aof細節 有什麼用?redis作爲mybatis緩存整合講解/CacheConfig作用?

向王哥請教redis和mybatis二級緩存 並不常用,並且有場景限制,適合數據不怎麼變動的場景,比如一兩個月變一次。頻繁變動是不適合的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章