redis快取以及叢集詳解
阿新 • • 發佈:2019-01-03
- redis的安裝以及啟動
- windows環境
- 到官網下載zip的安裝包
- 如果不安裝redis服務就需要啟動redis-service.exe可執行檔案
- 如果不想每次啟動就安裝redis服務
- 安裝 :redis-server --service-install --service-name redis2 (redis2是服務的名稱)
- 安裝並指定日誌級別: redis-server --service-install redis.windows.conf --service-name redis3 --loglevel verbose(指定配置檔案,日誌級別)
- 安裝並指定埠:redis-server --service-install –service-name redisService1 –port 10001
- 解除安裝:redis-server --service-uninstall --service-name redis2
- 啟動 :redis-server --service-start --service-name redis2 也可以到service.msc中滑鼠操作
- linux環境
- http://www.redis.io/下載tar.gz安裝包 ,或是線上安裝$ wget
http://download.redis.io/releases/redis-2.8.3.tar.gz- 解壓 tar xzf redis-2.8.3.tar.gz
- 到解壓的名錄下使用 make命令實現編譯
- 編譯完成到安裝目錄下src目錄下使用 make install命令安裝檔案
- 可以把redis配置檔案和可執行檔案(redis-service、redis-cli)放到比較上層的目錄,這樣就不需要每次都切換目錄了。
- 把redis配置文(redis.conf)中 daemonize 設定成yes,實現後臺啟動redis;修改資料檔案儲存路勁;
- 檢視redis埠 ps -ef|grep 6379
- 退出redis服務 pkill redis-server ;kill 程序號 ; 路徑/redis-cli shutdown(後臺啟動)/ 前置啟動就直接ctrl+c
- redis資料型別命令使用詳解
- String
set name value 設定值,多次設定會覆蓋 get name 根據name獲得value del name 刪除值 setnx (設定值的時候有返回0,設定失敗) 設定返回1,設定成功 setex (設定時間) set name 10 value setrange (從第幾個位置開始設定值,0開始,並返回長度) mset name value name2 value2 (批量設定值) mget name name1 name2 incr /decr age (對age進行遞增或遞減,返回執行結果的值) incrby /decby age [步長](對age增加或減少多少,返回執行1結果的值) append name value (給name追加value,並返回長度)
- Hash
適合儲存物件(hset user id 1、hset user name pwade、hset user age 20)此時user就相當於一個物件 hset myhash name value hget myhash name hincr /hdecr 遞增遞減 hexists 判斷key是否存在,有返回1無返回0 hlen 返回 hash裡所有的鍵值 hdel hash name 刪除 hkeys myhash 得到所有欄位 hmget myhash name name1 name2 (redis屬性名) hvals 得到所有value hgetall 得到欄位和value
- List
list 是一個連結串列結構集合,其主要功能就是push和pop,list型別是雙端連結串列的結構,可以在頭部或尾部操作資料,既可以做棧,又可以做佇列 lpush 從頭部新增元素,先進後出(棧) rpush 從尾部新增元素 ,先進先出(佇列) flushdb 清空資料庫 lrange list 0 -1 查詢list中所有資料 linsert 插入元素 lrem list 下標位置 返回移除的個數 lpop 從頭部刪除元素,並返回刪除元素 rpop 從尾部刪除元素,並返回刪除元素 rpoplpush 尾部刪除資料,從頭部新增資料 lindex list 1 返回下邊為1的元素值 llen list 返回元素個數
- Set 、Zset
set和String的無序集合,是通過hashtable實現的 sadd set1 aaa 新增資料 smembers set1 檢視set1裡面的資料 srem set1 刪除 spop 隨機返回刪除的key sdiff 返回兩個集合不同的元素 sdiffstore 返回兩個集合不同的元素,儲存到set3集合裡面、 sinter 取交集 sunion 取並集 smove 將一個集合移動但另外一個集合 scard 檢視集合裡面的元素個數 sismember 是否為集合中的元素,是返回1,否返回0 zadd zset1 5 aaa 向有序集合set1新增一個aa元素,位置下標在5 zrange zset1 0 -1 withscores zrem zset1 key 刪除元素 zincrby 元素遞增或遞減 zrangebyscore 返回指定區間內的資料 zremrangebyrank 只刪除索引 zremrangebyscore 刪除指定序號 zrank 根據從小到 排序
- 高階命令
exists key key是否存在 keys name* 模糊查詢 expire name time 設定過期時間 ttl name 檢視過期時間 persist name 取消過期時間 select 選擇資料庫(0-15) select 0 move name [資料庫下標] 移動資料到其他資料庫 rname name name1 修改name為name1 echo 列印資訊 dbsize 資料數量 info redis資料庫資訊 config get * config配置檔案 flushdb 清除當前資料庫 flushall 清除所有資料庫 monitor #實時監控 quit 退出連線
- redis安全性
設定密碼: auth 密碼 /自啟動redis-cli時 加上 -a 密碼 退出redis服務: netstat -tunpl |grep redis kill 程序號 redis-cli shutdown
- 主從複製
目的::主要實現讀寫分離
實現 :在從伺服器配置檔案中新增主伺服器的IP以及埠號master可以擁有多個slave,slave還可以連線其他slave scp -r 檔名 ip 遠端檔案copy slaveof 192.168.15.130 6379 主伺服器讀寫都可以,從伺服器主能讀
- redis事務
multi :開啟事物
exec:執行multi 開啟事物,所有操作多在佇列中。若執行中有一個個錯誤,其中有一個操作錯誤,但是這個操作不影響其它操作的,也就是說只有它操作失敗,其它是操作成功。 執行exec,將佇列中的操作都執行
- redis持久化
snapshotting 快照方式
snapshotting 快照的方式將資料寫入二進位制檔案中,預設是dump.rdb,這是預設方式 snapshotting設定格: save 900 1 在900秒內如果有一個key發生了改變,則發起快照儲存
append-only 模式(跟oracle日誌一樣的),啟開appendonly yes註解,啟動aof模式
appendfsync always //收到命令就寫入磁碟,速度慢 appendfsync everysec //每秒鐘寫入 appendfsync no //完全依賴os,效能最好,持久化沒保障
選擇:由於snapshotting是一定時間儲存資料,可能會導致資料丟失,所以一般都是使用aop方式 always儲存。
- redis釋出和訂閱
操作流程:現在監聽的視窗輸入 subscribe 需要監聽頻道----》在需要釋出的視窗使用publish 內容釋出的頻道 內容
subscribe 【頻道】訂閱、監聽 publish 【頻道】【釋出內容】進行釋出訊息廣播
- redis使用JavaApi
分片概念:3.0以前使用分片,3.0後使用叢集 將資料分為固定的多個槽,根據下標取資料
jedis使用:jedis操作redis和命令操作redis是一致的
redis篩選: 多種資料型別配合使用
- redis叢集
下面修改都是在redis配置檔案中操作
修改redis埠號 (port) 綁定當前伺服器地址 (bind ip),如果沒有設定可能導致執行速度慢 修改資料檔案儲存地址 (dir ) cluster-enabled yes 註釋放開,開啟器群模式 cluster-config-file nodes-7001.conf 與埠對應 cluster-node-timeout 15000 開啟appendonly 模式 安裝ruby apt-get install ruby 安裝ruby gems: apt-get install rubygems-integration
解決ruby版本過低:檢視版本 ruby -v
安裝apt-get install curl 執行 gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 , 安裝curl -L get.rvm.io | bash -s stable, source /etc/profile.d/rvm.sh rvm list known rvm autolibs disable(不然安裝報錯404) rvm install 2.4.1
叢集操作開始
啟動6個例項 檢視redis服務是否啟動 ps -ef|grep redis 安裝redis叢集介面 gem install redis redis-trib.rb(redis 安裝目錄src下執行) create --replicas(命令) 主節點數/從節點數 叢集的多個伺服器:埠號
- redis叢集瞭解,以及常用命令
叢集節點開啟客戶端:./redis-cli -c -h 【ip】 -p 【埠號】,資料儲存到0-16383中隨機槽,設定值後客戶端自動自動跳轉到槽所在的客戶端。
圖片展示的是主節點上分佈的槽的下標: 節點7001覆蓋0-5460; 節點7002覆蓋5461-10922; 節點7003覆蓋10923-16383.
redis叢集ruby命令:(叢集的IP隨意一個)
./redis-trib.rb create --replicas 建立叢集 ./redis-trib.rb check 【ip:埠】 查詢節點狀態 ./redis-trib.rb add-node 【新節點ip:埠 + 叢集中ip:埠】,新增主節點 ,剛加入的節點是沒有槽的 ,從節點需要在redis-cli客戶端執行cluster replicate 主節點id ./redis-trib.rb info 【ip:埠號】檢視節點資訊 或者是登入cli客戶端檢視 ./redis-trib.rb set-timeout 【ip:埠】設定心跳時間 ./redis-trib.rb reshard 【ip:埠號】-需要操作的節點,新增是:新節點id:埠 刪除:刪除的節點id:埠 ./redis-trib.rb add-node --slave --master-id $[nodeid] (新建從節點的又一種方式)新節點ip:埠號 叢集ip:埠號 ./redis-trib del-node 127.0.0.1:7001 ${node-id}
重新分配槽:
redis-trib.rb reshard 【ip:埠號】
輸入需要分配的槽:4096 ,需要剛加入叢集節點id,ee3efb90e5ac0725f15238a64fc60a18a71205d7
詢問你從哪裡提取雜湊槽:all /節點id
最後輸入:done
- 叢集操作JavaApi
// 叢集JavaApi:
Set <HostAndPort> jedisClusterNode=new HashSet<HostAndPort>();
//定義叢集中的
HostAndPort hostAndPort=new HostAndPort (ip,port)
jedisClusterNode.add( hostAndPort);
jedisPoolConfig cfg=new jedisPoolConfig ();
//設定連線屬性
cfg.setMaxTotal(1000);
//使用
jedisCluster jc=new jedisCluster (jedisClusterNode,600,100.cfg);
使用jc操作redis
- spring整合redis實現redisTemplate
redisTemplate.opsForValue();//操作字串 redisTemplate.opsForHash();//操作hash redisTemplate.opsForList();//操作list redisTemplate.opsForSet();//操作set redisTemplate.opsForZSet();//操作有序set
redisTemplate快取中資料亂碼:
@Resource private RedisTemplate redisTemplate; @Bean public RedisTemplate<String, Object> stringSerializerRedisTemplate() { RedisSerializer<String> = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer); redisTemplate.setValueSerializer(stringSerializer); redisTemplate.setHashKeySerializer(stringSerializer); redisTemplate.setHashValueSerializer(stringSerializer); return redisTemplate; }