Redis3.2學習記錄

nosqljava

特徵:訪問量大,高併發,高可用,海量數據linux

redis3.2
做用:減輕關係型數據庫查詢的壓力
安裝:
windows下解壓便可使用,啓動服務如:redis-server redis-config文件
linux下:
軟件壓縮包在/home/soft/下
tar -zxvf 源碼 -C /usr/local/ 解壓到/usr/local/下
進入解壓目錄,使用gcc編譯(yum -y install gcc 安裝)。生成可執行程序。
make編譯,make install(能夠不用,主要做用是將redis添加到環境變量中)
進入src中,啓動服務:./redis-server,這種方式是前臺啓動,ctrl+c退出
後臺啓動 ./redis-server &  (也能夠在redis.conf中設置daemonize值爲yes)
使用ps查看進程:ps -ef | grep redisredis

啓動客戶端:./redis-clisql

關閉redis:數據庫

1.切換到redis/src/目錄下,執行./redis-cli shutdown(比較安全,推薦使用這種方式,主要是先
完成數據的操做,在進行關閉)
2.kill pid 或者kill -9 pid(不推薦)
3.退出redis-cli 可輸入exit編程

客戶端:
1.命令行客戶端,本機直接鏈接:./redis-cli
指定IP和端口鏈接:./redis-cli -h 127.0.0.1 -p 6379
2.圖形客戶端。redis desktop manager(這個工具須要本機有c編譯庫),遠程訪問
注意網絡訪問的安全策略,首先關閉linux的防火牆
centos6.5關閉防火牆命令
1.永久性生效,重啓後不會復原
開啓: chkconfig iptables on
關閉: chkconfig iptables offvim

2.即時生效,重啓後復原
開啓: service iptables start
關閉: service iptables stopwindows


第二,修改redis.conf配置文件:(主要是redis有安全保護措施,默認只有本機訪問)
bind ip 綁定ip此行註釋掉
protected-mode yes 保護模式改成no後端

修改配置文件先作備份:cp redis.conf bak_redis.conf
使用vim 修改,
vim redis.confcentos

在命令模式下使用 /bind ;搜索bind關鍵字。

注意:修改後,咱們在啓動時要指定咱們修改的配置文件
./redis-server ../redis.conf &

查看防火牆:systemctl status firewalld (Active inactive關閉)

有一個java寫的客戶端工具:redisclient-win32x86_64.2.0.jar(直接使用,不用依賴啥C++類庫的
)

編程客戶端:Jedis

redis的數據持久化,內部執行


操做基本命令
1.ping 返回PONG,表示當前服務可用
2.dbsize 查看當前數據庫中key的數目(默認訪問第0個庫)
3.select db 切換數據庫,如:select 5 表示使用第5 個庫
4.flushdb 刪除當前庫的全部數據
5.exit或quit 退出客戶端
操做key命令:
1.keys pattern 查找全部符合模式pattern的key,pattern使用通配符(在生產環境中,
少用*,採用 通配符查找,單線程查找,通配符(*全部、?單個字
符、))
2.exists key [key...] 判斷key是否存在 返回整數數量。
3.expire key seconds 設置key的超時時間,若是key不存在,則設置無效,返回值0
4.ttl key 查看key剩餘的生存時間(秒爲單位),返回值-1:永久存在;-2不存在
;>0的值, 表明剩餘生存時間
5.type key 查看key所存儲值得數據類型
6.del key [key...] 刪除指定的key,不存在的key忽略
操做value命令:

五種數據類型
a.string 包括二進制數據,序列化後的數據,最大512M
b.hash 特別適合用於存儲對象(分佈式環境中解決session會話不一致,採用redis服務器
進行共享,使用hash存儲當前登陸的用戶信息)
c.list 簡單的字符串列表
d.set 無序集合,惟一,不能重複
e.zset 有序集合,通過排序的集合類型

數據類型操做命令
A.string基本命令:
set,get,
incr(理解成i++,incr key[若是key不存在,則先建立+1] 值加1並返回,原子操做,可用
於全局的計數器)
decr 減一 (在線用戶數,登錄+1,退出-1)
append key value 追加value,返回追加後的總字符數,若是追加的key不存在,則相對
set
B.string經常使用命令:
  strlen key 長度
  getrange key start end (至關substring(),)
  setrange key offset value 用value覆蓋(相等replace()。)
  mset 建立多個key,value
  mget 獲取多個key值
A.hash基本命令:
  hset key field value
  hget key field
  hmset key [field.. value..]
  hmget key field[field...]
  hgetall key 獲取哈希表key中全部的域和值
  hdel key field[field] 刪除key中的field
B.hash經常使用命令:
  hkeys key 獲取key中的全部field
  hvals key 獲取key中的全部value
  hexists key field 查看給定field是否存在
A.list基本命令:
頭部操做:以l開始,尾部操做:以r開始
  lpush key value[value...] 存儲順序和操做順序相反
  rpush key value[value...] 存儲順序和操做順序一致
  lrange key start stop 獲取列表key中指定區間內的元素,包含start stop
  lindex key index 獲取指定下標index的成員
  llen key 獲取列表key的長度
B.list經常使用命令:
  lrem key count value 根據參數count的值,刪除列表中雨參數value相等的元素,count
>0,從列表的左側向右側刪除,count <0,則從右向左,count =0,則刪除與value相等的全部值,返回
刪除元素的個數
  lset key index value 將列表key下標爲index的元素的值設置爲value
  linsert key BEFORE|ALFTER pivot value 將值value插入到列表key 當中位於值povot之
前或以後的位置
A.set基本命令:
  sadd key member[member...] 添加成員,重複的成員沒法添加的
  smembers key 獲取集合key中的全部成員元素,key不存在,則返回空集合
  sismember key member 判斷當前成員member在當前集合key中是否存在
  scard key 獲取集合裏面的成員個數
  srem key member[member...] 刪除集合key中的一個或多個成員

B.set經常使用命令:
  srandmember key [count] 隨機返回集合中一(count)個元素,不刪除元素,count默認爲1
,count正數,返回的集合元素各不相同,count負數:則容許重複
  spop key [count] 隨機從集合中刪除一(count)個元素,並返回刪除的元素,count默認爲1

A.zset基本命令:
  zadd key score member[score member...] 將一個或多個member元素及其score值加入到
有序集合key中,若是member存在集合中,則更新值;socre能夠是整數或浮點數
  zrange key start stop[WITHSCORES] 查詢有序集合,指定區間的內的元素,默認不帶分
數socres
  zrem key member[member...] 刪除指定成員的member
  zcard key 統計成員key的個數

B.zset經常使用命令:
  zrangebyscore key min max [withscores] [LIMT offset count] 獲取有序集key中,所
有score值介於min和max之間的成員,limit用來限制返回結果的數量和區間,withscores顯示score
和value


高級部分:
A.redis事務(與寫代碼有關係,其餘三項服務器設置)
transaction,一組命令的集合,保證至少有兩條及以上命令被正常執行。
1.multi 事務的開始標誌,當前還未執行命令
2.exec 執行所全部事務塊內的命令
3.discard 取消事務
事務的執行過程:首先開啓事務multi,其次向事務隊列中加入命令,最後執行事務提交exec
redis事務是沒有回滾的,只保證性能
4.watch key [key...] 監視當前key是否被其餘事務改變
watch機制:主動放棄事務。這種方式避免了資源競爭,解決數據安全問題
對比sql事務中,算是樂觀鎖機制
5.unwatch key [key...] 取消監視
B.持久化
兩種方式:
1.RDB(redis database)方式:在指定時間間隔內將內存中的數據快照寫入到磁盤中(默認
是dump.rdb),保存數據是在單獨進程中寫文件,默認開啓的。
實現:redis.conf中配置
  save: 配置執行RDB生成快照文件的時間策略
  dbfilename:設置RDB的文件名,默認文件爲dump.rdb
  dir:指定RDB文件的存儲位置,默認是./當前目錄
優勢:因爲存儲的是數據快照文件,恢復數據很方便,也比較快
缺點:會丟失最後一次快照之後更改的數據。因爲常常操做磁盤,RDB會分出一個子進程,
若是redis數據很大,子進程佔用比較多的時間。
3.AOF(Append-only File)方式:若是你怕數據丟失,能夠採用AOP方式,即redi每次接
收到一條改變數據的命令時,它將把該命令寫到一個AOF文件中(只記錄寫操做,讀操做不記錄),
當redis重啓時,它經過執行AOF文件中全部的命令來恢復數據。
實現:redis.conf中配置
  appendonly:默認是no,改爲yes便可開啓aof持久化
  appendfilename:指定AOF文件名,默認文件名爲appendonly.aof
  dir:指定RDB和AOF文件存放的命令,默認是./
  appendfsync:配置aof文件寫命令數據的策略;
    no:不主動進行同步操做,而是徹底交由操做系統來作(即每30s一次),
比較快但不是很安全
    always:每次執行寫入都會執行同步,慢一些但比較安全
    everysec:每秒執行一次同步操做,比較平衡,介於速度和安全之間。默
認項
  auto-aof-rewrite-min-size:容許重寫的最小AOF文件大小,默認是64M.當文件大
於64M時,開始自動整理aof文件,去掉無用的操做命令。

C.主從複製
高可用的解決方案,集羣(一種服務器的網絡結構)
1.主從複製--讀寫分離原則
兩種實現方式:1.修改配置文件,啓動時,指定主從服務器。(實際開發中使用)
2.命令行中指定master-slave之間的關係。
修改配置文件,分別配置master-slave的conf文件
  master:redis6380.conf
    include /usr/local/redis-3.2.10/redis.conf
    daemonize yes
    port 6380
    pidfile /var/run/redis_6380.pid
    logfile 6380.log
    dbfilename dump6380.rdb
  slave:redis6382.conf
    include /usr/local/redis-3.2.10/redis.conf
    daemonize yes
    port 6382
    pidfile /var/run/redis_6382.pid
    logfile 6382.log
    dbfilename dump6382.rdb
    slaveof 127.0.0.1 6380
  slave:redis6384.conf
    include /usr/local/redis-3.2.10/redis.conf
    daemonize yes
    port 6384
    pidfile /var/run/redis_6384.pid
    logfile 6384.log
    dbfilename dump6384.rdb
    slaveof 127.0.0.1 6380
info replication 查看啓動的master-slave信息關係
問題:容災處理
A.Master6380忽然中止(模擬掛掉)
將slave 6382升級爲master,salve 6384新掛載到新master上
命令:slaveof no one表示將當前從服務器升級爲master;
slaveof host port改爲成新的從服務器slave
B.把忽然掛掉的服務修好了,從新添加到如今的主從關係中。
從新啓動6380
執行salveof 127.0.0.1 6382
+++++++++++++++++++上面出了故障,須要人爲參與,爲使自動,產生哨兵模式++++++++++++
2.高可用Sentine哨兵
    監控--主從服務器是否正常工做
    提醒--經過sentinel會通知管理員或其餘應用程序
    自動故障轉移--監控的主redis不能正常工做,sentinel會開始進行故障遷移操做
,從新分配主從redis

哨兵:奇數個,至少三個,採起投票方式決定。默認端口26379
哨兵監控主redis,採用心跳機制,ping根據響應結果判斷redis運行狀態.
哨兵是獨立的程序,之間相互獨立的
配置哨兵配置文件:
主要修改兩個位置:
port 26380
sentinel monitor mymaster 127.0.0.1 6380 2
格式:sentinel monitor <name> <masterIP> <masterPort> <Quorum投票數>

啓動哨兵模式後,自動化處理故障的主從關係。

D.安全設置
1.設置密碼

2.綁定ip

修改默認端口

E.Jedis操做Redis
redis是單線程,存在線程不安全問題,每每與common-pool一塊兒使用,建立鏈接池。獲取
jedis對象進行操做。


F.redis中有關技術問題:
1.緩存穿透:
在高併發條件下,會致使沒法從緩存中查詢到數據,直接從數據庫查詢,請求量
過大,這樣會致使數據庫系統壓力很大。這種狀況下,就是緩存穿透。
解決方案:
採用多線程方式解決,使用鎖或關鍵字synchronized,雙重檢測鎖進行。
2.緩存雪崩:
當緩存服務器重啓或者大量緩存集中在某一個時間段失效,這樣在失效的時候,
會給後端系統帶來很大壓力。致使系統崩潰。
  1:在緩存失效後,經過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。好比對
某個key只容許一個線程查詢數據和寫緩存,其餘線程等待。

  2:作二級緩存,A1爲原始緩存,A2爲拷貝緩存,A1失效時,能夠訪問A2,A1緩存
失效時間設置爲短時間,A2設置爲長期

  3:不一樣的key,設置不一樣的過時時間,讓緩存失效的時間點儘可能均勻。

相關文章
相關標籤/搜索