• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 1. Redis學習筆記

    標簽: redis  

    1. 鏈接

    2. Linux下安裝

    • 下載安裝包
    • 解壓redis安裝包,程序/opt
    • 基本的環境安裝
    yum -y install gcc-c++
    # 查看gcc版本
    gcc -v
    
    make
    make install
    
    • redis 默認安裝路徑 /usr/local/bin

    • 將源碼路徑下redis配置文件,復制到/usr/local/bin/myconfig/

    • 修改redis.conf配置文件

    • 客戶端進行驗證

    • 檢測redis默認端口是否在使用中,如在使用則安裝程。 netstat -ntlp grep 6379

    • 查看redis進程是否開啟ps -ef |grep redis

    在這里插入圖片描述

    • 如何關閉redis服務 shutdown 不建議使用,防止把服務器給關掉
    • [阿里云安裝Redis教程與相關問題](https://www.cnblogs.com/blackBlog/p/12924891.html

    3. 性能測試 - redis-benchmark

    在這里插入圖片描述

    測試:100個并發鏈接,100000請求!

    redis-benchmark -h localhost -p 6379 -c 100 -n 100000
    

    在這里插入圖片描述

    4. Redis基礎知識

    • redis默認有16個數據庫

    • 選擇數據庫select index

    • 查看當前數據庫的大小dbsize

    • 清空當前數據庫flushdb \ 清空所有數據庫flushall

    • 查看指定key是否存在EXISTS key

    • 移出指定的keymove key 1

    • 讓指定數據在指定的時間失效expire key 10,單位是秒

    • 查看當前key的剩余時間ttl key

    • 查看指定key的類型type key

    • Redis更多命令

    5. 五大數據類型

    5.1. String類型

    • 追加字符串APPEND key value

    • 獲取字符串的長度STRLEN

    • 自增/自減運算 INCR/DECR

    • 自增/自減指定的值 INCRBY/DECRBY

    • 獲取某個范圍GETRANGE的字符串

    • 替換某個范圍的字符串SETRANGE

    • 設置過期時間SETEX

    • 不存在的時候才設置SETNX

    • 批量設置/獲取值MSET,MSETNX/MGET

    • 獲取當前的值的同時設置一個新值GETSET

    5.2. List類型

    • List當中插入一個元素LPUSH/RPUSH

    • List當中獲取指定元素LRANGE

    • 移出List集合中的一個元素LPOP/RPOP

    • 移出List集合中指定的元素LREM

    • 根據索引(下標)獲取集合中元素值LINDEX

    • 獲取List的長度LLEN

    • 裁剪List為原來的一部分(直接修改原有List集合)

    • 移出列表的最后一個元素,并移動到新的列表中RPOPLPUSH

    • 將列表中指定的下標值替換為另一個值,更新操作,如果下標不存在就會報錯

    • 在list集合中的指定元素前面插入值linsert lst before world xiaofan

    5.3.Set集合

    • 集合中添加元素sadd myset hello kuangshen lovekuangshen

    • 查看集合中的元素SMEMBERS

    • 判斷某個元素是否存在于集合中SISMEMBER myset hello

    • 獲取集合中元素個數SCARD

    • 移出集合中指定的元素值SREM

    • 隨機獲取Set集合中的值SRANDMEMBER

    • 隨機刪除集合中的一個元素SPOP

    • 移動指定的元素到另一個集合當中去SMOVE

    • 差集/交集/并集SDIFF/SINTER/SUNION

    5.4. Hash集合

    • 設置一個具體的字段值hset myhash field2 value2

    • 設置多個個具體的字段值hmset myhash field2 value2 field3 value3

    • 獲取多個指定的字段值hmget myhash field1 field2

    • 獲取全部的值hgetall myhash

    • 刪除hash指定的鍵HDEL myhash field1

    • 獲取鍵值對的個數HLEN判斷hash中指定字段是否存在HEXISTS

    • 獲取所有的key、valueHKEYS/HVALS

    5.5. Zset有序集合

    • 添加元素zadd myset 1 one 2 two 3 three

    • 獲取所有元素zrange myset 0 -1

    • 排序ZREVRANGEBYSCORE key max min WITHSCORES LIMIT offset count

    • 升序/降序zrange myzset 0 -1/ZREVRANGE myzset 0 -1

    • 獲取指定區間的元素個數zcount myzset 1 4

    6. 三種特殊的餓數據類型

    6.1. geospatial 地理位置

    127.0.0.1:6379> geoadd china:city 116.405285 39.904989 beijing
    (integer) 1
    127.0.0.1:6379> geoadd china:city 121.472644 31.231706 shanghai
    (integer) 1
    127.0.0.1:6379> geoadd china:city 106.504962 29.533155 chongqing
    (integer) 1
    127.0.0.1:6379> geoadd china:city 120.153576 30.287459 hangzhou
    (integer) 1
    127.0.0.1:6379> geoadd china:city 125.14904 42.927 xian
    (integer) 1
    127.0.0.1:6379> geoadd china:city 112.549248 37.857014 taiyuan
    (integer) 1
    
    
    • geopos 獲取指定城市的經緯度
    127.0.0.1:6379> geopos china:city taiyuan
    1) 1) "112.54924803972244263"
       2) "37.85701483724372451"
    127.0.0.1:6379> geopos china:city beijing
    1) 1) "116.40528291463851929"
       2) "39.9049884229125027"
    
    • geodist 獲取兩個位置之間的距離
    m 為米。
    km 為千米。
    mi 為英里。
    ft 為英尺。
    
    127.0.0.1:6379> geodist china:city beijing taiyuan km
    "404.1120"
    127.0.0.1:6379> geodist china:city beijing shanghai
    "1067597.9668"
    127.0.0.1:6379> geodist china:city beijing shanghai km
    "1067.5980"
    
    
    • GEORADIUS具體指定位置多少范圍內的所有城市
    127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km
    1) "chongqing"
    2) "hangzhou"
    3) "taiyuan"
    127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
    1) "chongqing"
    
    127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord
    1) 1) "chongqing"
       2) 1) "106.50495976209640503"
          2) "29.53315530684997015"
    2) 1) "hangzhou"
       2) 1) "120.15357345342636108"
          2) "30.28745790721532671"
    3) 1) "taiyuan"
       2) 1) "112.54924803972244263"
          2) "37.85701483724372451"
          
    # 獲取指定的個數
    127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord count 2
    1) 1) "chongqing"
       2) 1) "106.50495976209640503"
          2) "29.53315530684997015"
    2) 1) "taiyuan"
       2) 1) "112.54924803972244263"
          2) "37.85701483724372451"
    
    
    • GEORADIUSBYMEMBER 找出位于指定元素周圍的其他元素
    127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km 
    1) "taiyuan"
    2) "beijing"
    3) "xian"
    
    • geohash 命令,返回一個或者多個位置元素的geohash表示

    該命令將返回11個字符的Geohash字符串,如果兩個字符串越接近,表示距離越近!

    127.0.0.1:6379> geohash china:city beijing chongqing
    1) "wx4g0b7xrt0"
    2) "wm78p86e170"
    

    GEO 底層的實現原理其實就是Zset!我們可以使用Zset命令來操作geo!

    127.0.0.1:6379> ZRANGE china:city 0 -1
    1) "chongqing"
    2) "hangzhou"
    3) "shanghai"
    4) "taiyuan"
    5) "beijing"
    6) "xian"
    127.0.0.1:6379> ZREM china:city xian
    (integer) 1
    127.0.0.1:6379> ZRANGE china:city 0 -1
    1) "chongqing"
    2) "hangzhou"
    3) "shanghai"
    4) "taiyuan"
    5) "beijing"
    

    6.2. Hyperloglog 基數統計

    在這里插入圖片描述

    127.0.0.1:6379> PFADD mykey a b c d e f g h i j		# 創建第一組元素 mykey
    (integer) 1
    127.0.0.1:6379> PFCOUNT mykey 	# 統計第一組元素的個數
    (integer) 10
    127.0.0.1:6379> PFADD mykey2 i j z x c v b n m		# 創建第二組元素 mykey2
    (integer) 1
    127.0.0.1:6379> PFCOUNT mykey2	# 統計第二組元素的個數
    (integer) 9
    127.0.0.1:6379> PFMERGE mykey3 mykey mykey2		# 合并第一組元素和第二組元素
    OK
    127.0.0.1:6379> PFCOUNT mykey3
    (integer) 15
    
    

    6.7. Bitmaps

    在這里插入圖片描述

    127.0.0.1:6379> setbit sign 0 0		# 設置數據
    (integer) 0
    127.0.0.1:6379> setbit sign 1 0
    (integer) 0
    127.0.0.1:6379> setbit sign 2 1
    (integer) 0
    127.0.0.1:6379> setbit sign 3 1
    (integer) 0
    127.0.0.1:6379> setbit sign 4 1
    (integer) 0
    127.0.0.1:6379> setbit sign 5 0
    (integer) 0
    127.0.0.1:6379> setbit sign 6 1
    (integer) 0
    
    127.0.0.1:6379> getbit sign 6	# 獲取指定數據
    (integer) 1
    127.0.0.1:6379> getbit sign 5
    (integer) 0
    
    127.0.0.1:6379> bitcount sign	# 統計1的個數
    (integer) 4
    
    

    7. 事務

    在這里插入圖片描述

    127.0.0.1:6379> multi			# 開啟事務
    OK
    # 入隊
    127.0.0.1:6379> set k1 v1
    QUEUED
    127.0.0.1:6379> set k2 v2
    QUEUED
    127.0.0.1:6379> get k2
    QUEUED
    127.0.0.1:6379> set k3 v3
    QUEUED
    127.0.0.1:6379> exec			# 執行事務
    1) OK
    2) OK
    3) "v2"
    4) OK
    
    

    取消事務

    127.0.0.1:6379> multi			# 開啟事務
    OK
    127.0.0.1:6379> set k1 v1
    QUEUED
    127.0.0.1:6379> set k2 v2
    QUEUED
    127.0.0.1:6379> set k3 v3
    QUEUED
    127.0.0.1:6379> get k3
    QUEUED
    127.0.0.1:6379> DISCARD			# 取消事務
    OK
    127.0.0.1:6379> keys *			# 事務隊列中命令都不會被執行
    (empty array)
    
    

    編譯性異常(代碼有問題! 命令有錯!),事務中所有的命令都不會被執行!

    127.0.0.1:6379> multi			# 開啟事務
    OK
    127.0.0.1:6379> set k1 v1
    QUEUED
    127.0.0.1:6379> set k2 v2
    QUEUED
    127.0.0.1:6379> set k3 v3
    QUEUED
    127.0.0.1:6379> setget k3		# 命令報錯
    (error) ERR unknown command `setget`, with args beginning with: `k3`, 
    127.0.0.1:6379> set k4 v4
    QUEUED
    127.0.0.1:6379> set k5 v5
    QUEUED
    127.0.0.1:6379> exec
    (error) EXECABORT Transaction discarded because of previous errors.
    127.0.0.1:6379> get k5			# 隊列中的其他命令都沒有被執行
    (nil)
    
    

    運行時異常(I/O),如果事務隊列中存在語法行,那么執行命令的時候,其他命令是可以正常執行的,錯誤命令拋出異常!

    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> INCR k1		# 會執行的時候失敗
    QUEUED
    127.0.0.1:6379> set k2 v2
    QUEUED
    127.0.0.1:6379> set k3 v3
    QUEUED
    127.0.0.1:6379> get k3
    QUEUED
    127.0.0.1:6379> EXEC
    1) (error) ERR value is not an integer or out of range	# 雖然其中一條命令執行失敗了,但是不影響其他命令執行
    2) OK
    3) OK
    4) "v3"
    127.0.0.1:6379> get k3
    "v3"
    127.0.0.1:6379> get k2
    "v2"
    
    

    8. Redis實現樂觀鎖

    在這里插入圖片描述

    # 正常執行
    127.0.0.1:6379> set money 100
    OK
    127.0.0.1:6379> set out 0
    OK
    127.0.0.1:6379> watch money			# 監視money對象
    OK
    127.0.0.1:6379> multi				# 事務正常結束,數據期間沒有發生變化,這個時候就正常執行成功!
    OK
    127.0.0.1:6379> DECRBY money 20
    QUEUED
    127.0.0.1:6379> INCRBY out 20
    QUEUED
    127.0.0.1:6379> exec
    1) (integer) 80
    2) (integer) 20
    
    

    測試多線程修改值,使用watch可以當做redis的樂觀鎖操作!

    127.0.0.1:6379> set money 100
    OK
    127.0.0.1:6379> watch money
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> DECRBY money 20
    QUEUED
    127.0.0.1:6379> INCRBY out 20
    QUEUED
    127.0.0.1:6379> exec	# 執行之前,另一個線程修改了我們的值, 這個時候,就會導致事務執行失敗!
    (nil)
    
    
    127.0.0.1:6379> set salary 100
    OK
    127.0.0.1:6379> watch salary
    OK
    127.0.0.1:6379> multi 
    OK
    127.0.0.1:6379> DECRBY salary 10
    QUEUED
    127.0.0.1:6379> INCRBY out 10
    QUEUED
    127.0.0.1:6379> exec			# 執行事務的時候報錯
    (nil)
    127.0.0.1:6379> unwatch			# 取消監聽
    OK
    127.0.0.1:6379> watch salary	# 重新監聽
    OK
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> DECRBY salary 10
    QUEUED
    127.0.0.1:6379> INCRBY out 10
    QUEUED
    127.0.0.1:6379> exec
    1) (integer) 990
    2) (integer) 10
    
    

    9. Jedis

    • 導入依賴
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.3.0</version>
    </dependency>
    
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.73</version>
    </dependency>
    
    • 測試
    Jedis jedis = new Jedis("47.94.235.187", 6379);
    System.out.println(jedis.ping());
    

    10. springboot

    在這里插入圖片描述

    源碼分析:

    @Bean
    @ConditionalOnMissingBean(name = {"redisTemplate"})
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
    
    @Bean
    @ConditionalOnMissingBean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
    

    測試一下

    1. 導入依賴
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    1. 配置連接
    spring.redis.host=47.94.235.187
    spring.redis.port=6379
    
    1. 測試
    package com.xiaofan;
    
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.redis.core.RedisTemplate;
    
    @SpringBootTest
    class Redis02SpringbootApplicationTests {
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        @Test
        void contextLoads() {
            redisTemplate.opsForValue().set("mykey", "范建海");
            System.out.println(redisTemplate.opsForValue().get("mykey"));
        }
    
    }
    
    1. 自定義RedisTemplate
    package com.xiaofan.config;
    
    import com.fasterxml.jackson.annotation.JsonAutoDetect;
    import com.fasterxml.jackson.annotation.PropertyAccessor;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    
    import java.net.UnknownHostException;
    
    @Configuration
    public class RedisConfig {
    
        @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
            RedisTemplate<String, Object> template = new RedisTemplate();
            template.setConnectionFactory(redisConnectionFactory);
    
            // 序列化配置
            Jackson2JsonRedisSerializer<Object> objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
            ObjectMapper om = new ObjectMapper();
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            om.enableDefaultTyping();
            objectJackson2JsonRedisSerializer.setObjectMapper(om);
            StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    
            template.setKeySerializer(stringRedisSerializer);
            template.setHashKeySerializer(stringRedisSerializer);
            template.setValueSerializer(objectJackson2JsonRedisSerializer);
            template.setHashValueSerializer(objectJackson2JsonRedisSerializer);
    
            template.afterPropertiesSet();
    
            return template;
        }
    }
    
    

    11. redis.conf詳解

    基本配置
    
    內存單位的表示
    
    # 1k => 1000 bytes
    # 1kb => 1024 bytes
    # 1m => 1000000 bytes
    # 1mb => 10241024 bytes
    # 1g => 1000000000 bytes
    # 1gb => 10241024*1024 bytes
    
    單位中不區分大小寫1GB 1Gb 1gB是一樣的
    
    后臺運行,yes是后臺運行,no前臺運行,將輸出,輸出到終端(默認)
    
    daemonize yes
    
    如果daemonize參數為yes的話就會產生pid文件,一下是pid文件的定義
    
    pidfile /usr/local/redis-master/run/redis.pid
    
    監聽的端口
    
    port 6379
    
    綁定監聽的IP地址
    
    bind 127.0.0.1
    
    如果在本地調用redis可以直接用sock文件
    
    unixsocket /tmp/redis.sock //sock文件的位置
    
    unixsocketperm 755      //sock文件的權限
    
    如果一個鏈接在N秒內是空閑的,就將其關閉
    
    timeout 0
    
    如果對方down了或者中間網絡斷了發送ACK到客戶端在指定的時間內沒有收到對方的回應就斷開TCP鏈接(時間單位秒記),此參數會受到內核參數的影響,推薦配置60。
    
    tcp-keepalive 0
    
    指定輸出消息的級別
    
    # debug (調試級別,詳細信息,信息量大)
    # verbose (詳細信息,信息量較大)
    # notice (通知,生產環境推薦)
    # warning (錯誤信息警告信息)
    
    loglevel notice
    
    日志輸出文件,默認在前端運行的時候此key的默認值是stdout輸出到終端,如果用守護進程運行此key的stdout的時候將日志輸入到/dev/null,如果想記錄日志,就必須為其指定logfile位置
    
    logfile /var/log/redis.log
    
    將日志記錄的哦syslog
    
    syslog-enabled no
    
    指定syslog的身份
    
    syslog-ident redis
    
    指定syslog的級別,必須是LOCAL0-LOCAL7之間
    
    syslog-facility local0
    
    設置數據庫的數量
    
    databases 16
    
    設置數據庫的數量。默認數據庫DB 0,你可以選擇一個不同的per-connection的使用SELECT<dbid>這兒的DBID是一個介于0和'databases'-1
    
    databases 16
    
    2.快照配置
    
    將DB保存到磁盤的規則定義(快照)
    
    格式:save <seconds> <changes>
    
    例子:save 900 1 //在900秒(15分鐘)內如果至少有1個鍵值發生變化 就保存
    
          save 300 10 //在300秒(6分鐘)內如果至少有10個鍵值發生變化 就保存 
    save 900 1           //每一條表示一個存盤點
    save 300 10
    save 60 10000
    
    如果啟用如上的快照(RDB),在一個存盤點之后,可能磁盤會壞掉或者權限問題,redis將依然能正常工作
    
    stop-writes-on-bgsave-error yes
    
    是否將字符串用LZF壓縮到.rdb 數據庫中,如果想節省CPU資源可以將其設置成no,但是字符串存儲在磁盤上占用空間會很大,默認是yes
    
    rdbcompression yes
    
    rdb文件的校驗,如果校驗將避免文件格式壞掉,如果不校驗將在每次操作文件時要付出校驗過程的資源新能,將此參數設置為no,將跳過校驗
    
    rdbchecksum yes
    
    轉儲數據的文件名
    
    dbfilename dump.rdb
    
    redis的工作目錄,它會將轉儲文件存儲到這個目錄下,并生成一個附加文件
    
    dir /usr/local/redis-master/db
    
    3.主從參數
    如果本地是salve服務器那么配置該項
    
    # slaveof <masterip> <masterport>
    
    slaveof 127.0.0.1 65532
    
    master的驗證密碼
    
    masterauth <master-password>
    
    當從主機脫離主的鏈接時,如果此值為yes當客戶端查詢從時,回響應客戶端,如果是第一次同步回返回一個日期數據或這空值,如果設置為no,則返回“SYNC with master in progress”到INFO and SLAVEOF
    
    slave-serve-stale-data yes
    
    從服務器只讀(默認)
    
    slave-read-only yes
    
    從發送ping到主的時間間隔(單位:秒)
    
    repl-ping-slave-period 10
    
    批量傳輸I / O超時和主數據或ping響應超時 默認60s 必須大于repl-ping-slave-period值
    
    repl-timeout 60
    
    此選項如果是“yes”那么Redis的使用數量較少的TCP數據包和更少的帶寬將數據發送到,在從主機上延遲40毫秒(linux kernel中的40毫秒)出現。如果是no將在slave中減少延遲,但是流量使用回相對多一些,如果用多個從主機,此處建議設置成yes
    
    repl-disable-tcp-nodelay no
    
    從主機的優先級,如果當主主機掛了的時候,將從從主機中選取一個作為其他從機的主,首先優先級的數字最低的將成為主,0是一個特殊的級別,0將永遠不會成為主。默認值是100.
    
    slave-priority 100
    
    

    12. 持久化操作

    12.1. RDB(Redis DataBase)

    在這里插入圖片描述

    在這里插入圖片描述

    • 觸發機制

      • save的規則滿足的情況下,會自動觸發rdb規則!
      • 執行flushall命令,也會觸發我們的rdb規則!
      • 退出redis,也會產生rdb文件!

      備份就自動生成一個dump.rdb

    在這里插入圖片描述

    12.2. AOF(Append Only File )

    在這里插入圖片描述

    在這里插入圖片描述

    在這里插入圖片描述

    在這里插入圖片描述

    在這里插入圖片描述

    13. Redis發布訂閱

    在這里插入圖片描述

    測試

    • 發布者
    127.0.0.1:6379> PUBLISH xiaofanshuo hello,xiaofan	# 發布消息
    (integer) 1
    127.0.0.1:6379> PUBLISH xiaofanshuo hello,redis
    (integer) 1
    
    • 訂閱者
    127.0.0.1:6379> SUBSCRIBE xiaofanshuo		# 訂閱頻道
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "xiaofanshuo"
    3) (integer) 1
    # 等待消息
    1) "message"		# 消息
    2) "xiaofanshuo"	# 消息頻道
    3) "hello,xiaofan"	# 消息內容
    1) "message"
    2) "xiaofanshuo"
    3) "hello,redis"
    
    

    在這里插入圖片描述

    • 使用場景
      • 實時消息系統!
      • 實時聊天(頻道當做聊天室,將信息回顯給所有人即可!)
      • 訂閱,關注系統都是可以的!
      • 稍微復雜的場景我們就是用消息中間件MQ Kafka…

    14. Redis主從復制

    在這里插入圖片描述

    • 環境配置
    [root@iZ2zeg4ytp0whqtmxbsqiiZ bin]# redis-server myconfig/redis.conf 
    4229:C 09 Sep 2020 11:33:21.661 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    4229:C 09 Sep 2020 11:33:21.661 # Redis version=6.0.7, bits=64, commit=00000000, modified=0, pid=4229, just started
    4229:C 09 Sep 2020 11:33:21.661 # Configuration loaded
    [root@iZ2zeg4ytp0whqtmxbsqiiZ bin]# redis-cli 
    127.0.0.1:6379> info replication		# 查看當前的庫信息
    # Replication
    role:master								# 角色
    connected_slaves:0						# 沒有從機
    master_replid:724a0bd2cfd29650f2aa0df97418cab7d68b9b41
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:0
    second_repl_offset:-1
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    
    

    復制3個配置文件,然后修改對應的信息

    1. 端口
    2. pid名字
    3. log文件名字
    4. dump.rdb 名字
    • 一主二從

      • 默認情況下,每臺redis服務器都是主節點

      • 命令模式SLAVEOF 127.0.0.1 6379 找自己的老大

      • 配置文件配置

    在這里插入圖片描述

    15. 哨兵模式

    在這里插入圖片描述

    在這里插入圖片描述

    • 哨兵配置文件sentinel.conf
    # sentinel monitor 被監控的名稱 host port 1
    sentinel monitor myredis 127.0.0.1 6379 1
    

    后面這個數字1,代表主機掛了,slave投票讓誰接替成為主機,票數最多的就成為主機

    啟動哨兵redis-sentinel myconfig/sentinel.conf

    4484:X 09 Sep 2020 14:25:14.436 # Sentinel ID is 96d49dd51a76685defccae4a712ce14a3c5e7e7f
    4484:X 09 Sep 2020 14:25:14.436 # +monitor master myredis 127.0.0.1 6379 quorum 1
    4484:X 09 Sep 2020 14:25:14.436 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:25:14.438 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:20.524 # +sdown master myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:20.524 # +odown master myredis 127.0.0.1 6379 #quorum 1/1
    4484:X 09 Sep 2020 14:26:20.524 # +new-epoch 1
    4484:X 09 Sep 2020 14:26:20.524 # +try-failover master myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:20.526 # +vote-for-leader 96d49dd51a76685defccae4a712ce14a3c5e7e7f 1
    4484:X 09 Sep 2020 14:26:20.526 # +elected-leader master myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:20.526 # +failover-state-select-slave master myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:20.592 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:20.592 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:20.654 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:20.709 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:20.709 # +failover-state-reconf-slaves master myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:20.782 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:21.751 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:21.751 * +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:21.816 # +failover-end master myredis 127.0.0.1 6379
    4484:X 09 Sep 2020 14:26:21.816 # +switch-master myredis 127.0.0.1 6379 127.0.0.1 6380
    4484:X 09 Sep 2020 14:26:21.816 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6380
    4484:X 09 Sep 2020 14:26:21.816 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ myredis 127.0.0.1 6380
    4484:X 09 Sep 2020 14:26:51.863 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ myredis 127.0.0.1 6380
    4484:X 09 Sep 2020 14:29:32.130 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ myredis 127.0.0.1 6380
    4484:X 09 Sep 2020 14:29:42.080 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ myredis 127.0.0.1 6380
    

    16. Redis緩存穿透和雪崩

    緩存穿透 查不到

    緩存擊穿 量太大,緩存過期

    布隆過濾器

    在這里插入圖片描述

    緩存空對象

    在這里插入圖片描述

    緩存雪崩

    版權聲明:本文為fanjianhai原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/fanjianhai/article/details/108491047

    智能推薦

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    猜你喜歡

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    基于TCP/IP的網絡聊天室用Java來實現

    基于TCP/IP的網絡聊天室實現 開發工具:eclipse 開發環境:jdk1.8 發送端 接收端 工具類 運行截圖...

    19.vue中封裝echarts組件

    19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...

    精品国产乱码久久久久久蜜桃不卡