1. Redis學習筆記
標簽: 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
-
移出指定的key
move key 1
-
讓指定數據在指定的時間失效
expire key 10
,單位是秒 -
查看當前key的剩余時間
ttl key
-
查看指定key的類型
type key
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、value
HKEYS/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;
}
測試一下
- 導入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置連接
spring.redis.host=47.94.235.187
spring.redis.port=6379
- 測試
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"));
}
}
- 自定義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個配置文件,然后修改對應的信息
- 端口
- pid名字
- log文件名字
- 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緩存穿透和雪崩
緩存穿透 查不到
緩存擊穿 量太大,緩存過期
布隆過濾器
緩存空對象
緩存雪崩
智能推薦
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 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...
19.vue中封裝echarts組件
19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...