Redis——初識Redis
Redis簡介
Redis的資料結構致力於幫助使用者解決問題,而不是像關係型資料庫那樣,要求使用者扭曲問題來適應資料庫。除此之外,通過複製、持久化和客戶端分片(client-side sharding)等特性,使用者可以很方便的將Redis擴充套件成一個能夠包含數百GB資料、每秒處理上百萬次請求的系統。
Redis 是完全開源免費的,遵守BSD協議,是一個高效能的key-value資料庫。Redis不使用表,它的資料庫也不會預定義或者強制要求使用者對Redis儲存的不同資料進行關聯。Redis擁有兩種不同形式的持久化方法,第一種是時間點儲存,第二種是將所有修改了資料庫的命令都寫入一個只追加的檔案裡面。
Redis資料結構簡介
Redis可以儲存鍵與5種不同資料結構型別之間的對映,分別是:
- String: 字串
- Hash: 雜湊
- List: 列表
- Set: 集合
- Sorted Set: 有序集合
Redis 與其他 key - value 快取產品有以下三個特點:
- Redis支援資料的持久化,可以將記憶體中的資料儲存在磁碟中,重啟的時候可以再次載入進行使用。
- Redis不僅僅支援簡單的key-value型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。
- Redis支援資料的備份,即master-slave模式的資料備份。
Redis 優勢
- 效能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
- 豐富的資料型別 – Redis支援二進位制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料型別操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支援事務,即原子性,通過MULTI和EXEC指令包起來。
- 豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。
在Linux上的安裝
解壓安裝包後,使用make,再建立bin目錄,配置環境變數、配置conf(設定後臺啟動)
(略,請查閱相關資料)
** /etc/redis.conf**
redis.conf配置選項如下:
- daemonize 是否以後臺程序執行,預設為no
- pidfile 如以後臺程序執行,則需指定一個pid,預設為/var/run/redis.pid
- bind 繫結主機IP,預設值為127.0.0.1(註釋)
- port 監聽埠,預設為6379
- timeout 超時時間,預設為300(秒)
- loglevel 日誌記錄等級,有4個可選值,debug,verbose(預設值),notice,warning
- logfile 日誌記錄方式,預設值為stdout
- databases 可用資料庫數,預設值為16,預設資料庫為0
- save 指出在多長時間內,有多少次更新操作,就將資料同步到資料檔案。這個可以多個條件配合,比如預設配置檔案中的設定,就設定了三個條件。
- save 900 1 900秒(15分鐘)內至少有1個key被改變
- save 300 10 300秒(5分鐘)內至少有300個key被改變
- save 60 10000 60秒內至少有10000個key被改變
- rdbcompression 儲存至本地資料庫時是否壓縮資料,預設為yes
- dbfilename 本地資料庫檔名,預設值為dump.rdb
- dir 本地資料庫存放路徑,預設值為 ./
- slaveof 當本機為從服務時,設定主服務的IP及埠(註釋)
- masterauth 當本機為從服務時,設定主服務的連線密碼(註釋)
- requirepass 連線密碼(註釋)
- maxclients 最大客戶端連線數,預設不限制(註釋)
- maxmemory 設定最大記憶體,達到最大記憶體設定後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理後,任到達最大記憶體設定,將無法再進行寫入操作。(註釋)
- appendonly 是否在每次更新操作後進行日誌記錄,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為redis本身同步資料檔案是按上面save條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。預設值為no
- appendfilename 更新日誌檔名,預設值為appendonly.aof(註釋)
- appendfsync 更新日誌條件,共有3個可選值。no表示等作業系統進行資料快取同步到磁碟,always表示每次更新操作後手動呼叫fsync()將資料寫到磁碟,everysec表示每秒同步一次(預設值)。
- vm-enabled 是否使用虛擬記憶體,預設值為no
- vm-swap-file 虛擬記憶體檔案路徑,預設值為/tmp/redis.swap,不可多個Redis例項共享
- vm- max-memory 只可以使用記憶體的最大值 如果超過了此值就使用虛擬記憶體了交換是使用次數少為主放在虛擬記憶體中去。預設值為0。
以下為後臺啟動:
使用Redis操作key-value資料
連線到Redis
Redis提供了四種連線工廠:
具體使用哪種,現在來說區別不大。從Spring Data Redis的角度來看,這些連線工廠在適用性上都是相同的。
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private int port;
@Value("${redis.password}")
private String password;
@Bean
public JedisConnectionFactory jedisConnectionFactory(){
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setHostName(host);
jedisConnectionFactory.setPort(port);
jedisConnectionFactory.setPassword(password);
return jedisConnectionFactory;
}
使用RedisTemplate
Spring Data Redis以模版的形式提供了較高階的資料訪問方案。實際上,它提供了兩個模版:
- RedisTemplate
- StringRedisTemplate
RedisTemplate可以極大簡化Redis的資料訪問,持久化各種型別的key-value,而不僅僅是位元組陣列。但在認識到key-value通常是String型別的後,StringRedisTemplate又擴充套件了RedisTemplate,只關注String型別。
初始化bean,我們選擇序列化器如下:
@Bean
public RedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory){
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(jedisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}