首先需要介紹一下nosql數據庫:
1沒有聲明性的查詢語言
2沒有預定義的模式
3最終一致性 而非ACID屬性
4非結構化和不可預知的數據
5CAP定理 三選二 不可能全滿足
6高性能,高可用性和可伸縮性
**
key的基本操作
**
redis默認有16個數據庫:
CONFIG GET databases; 獲取某個配置項的值
DBSIZE 獲取當前數據庫裏面有多少個數據
select 進行切換數據庫
●KEYS 匹配表達式 可以把相匹配的key查找出來 *表示很多字符 ?表示一個任意字符
●TYPE KEY 返回某一個鍵對應的值的類型
●MOVE KEY DB 把鍵值對移到某個數據庫中
●DEL 多個KEY 根據KEY進行刪除 返回成功刪除的個數
●EXISTS 多個KEY 返回存在的KEY的數量
●RANDOMKEY 在現有的KEY中隨機返回一個
●RENAME KEY NEWKEY 重命名,會導致覆蓋
●RENAMENX KEY NEWKEY 重命名,不允許覆蓋
●TIME 返回當前UNIX時間戳
●TTL KEY 查看存活時間 (秒 -1就是永久)
●PTTL KEY 查看存活時間 (毫秒)
●EXPIRE KEY SECONDS 設置過期時間
●EXPIREAT KEY TIMESTAMP 設置一個KEY在TIMESTAMP指定的時間過期
●PEXPIRE KEY MILLISECONDS 以毫秒爲單位指定過期時間
●PERSIST KEY 設置爲永久的key
**
value的操作
**
首先知道redis的value有五大數據類型
(1)string類型
(2)list類型
(3)hash類型
(4)set類型
(5)zest類型
(1)string類型 是二進制安全的 可以包含任何數據
●SET KEY VALUE [EX SECONDS] [PX MILLISECONDS] [NX|XX]
存活秒數 毫秒數 key不存在才行|key存在才行
●GET KEY 獲取String類型的value
●APPEND KEY VALUE 在key對應的value後面追加值,返回值是追加後字符串長度
●STRLEN KEY 字符串長度
●INCR KEY +1
●DECR KEY -1
●INCRBY KEY INCREMENT 原值+INCREMENT
●DECRBY KEY DECREMENT 原值-DECREMENT
●GETRANGE KEY START END 從字符串中取指定的一段
●SETRANGE KEY OFFSET VALUE 替換字符串中的一段值
●SETEX KEY SECONDS VALUE 跟ex參數一樣
●SETNX KEY VALUE 跟nx參數一樣
●MSET KEY VALUE [KEY VALUE ...] 一次性設置多個鍵值對
●MGET KEY [KEY ...] 一次性指定多個KEY,返回它們對應的值,沒有值的返回nil
●MSETNX KEY VALUE [KEY VALUE ...] 一次性新建多個值
●GETSET KEY VALUE 設置新值,同時將舊值返回
(2)list類型 是兩端都可以壓入彈出的結構 所以頭尾效率高,中間效率低
●LPUSH key value [value ...]
●RPUSH key value [value ...]
●LRANGE key start stop
根據list集合的索引打印元素數據 0 -1可以打印全部
正着數:0 1 2 3 4 5 。。。
倒着數:。。。-5 -4 -3 -2 -1
●LLEN key 返回list的總長度
●LPOP key 彈出左邊的元素並且從list中刪除
●RPOP key 彈出右邊的元素並且從list中刪除
●RPOPLPUSH source destination 從source中RPOP一個元素,LPUSH到destination中
●LINDEX key index 根據索引從集合中取值
●LINSERT key BEFORE|AFTER pivot value 在list中插入value 位置放在pivot的前面或者後面
●LPUSHX key value 只能針對存在的list執行LPUSH
●LREM key count value 刪除左邊count個元素
●LSET key index value 替換元素
●LTRIM key start stop 僅保留指定區間的數據,兩邊的數據被刪除
(3)set類型 (就相當於在一個集合中放進去值 沒有順序)
●SADD key member [member ...] 放進一個鍵值對
●SMEMBERS key 查看value
●SCARD key 返回集合中元素的數量
●SISMEMBER key member 檢查當前指定member是否是集合中的元素 是返回1 不是返回0
●SREM key member [member ...] 根據key刪除集合中的元素
●SINTER key [key ...] 返回兩個集合中交集的部分
●SINTERSTORE destination key [key ...]
取交集後存入destination
●SDIFF key [key ...] 返回集合1減去集合2的的部分
●SUNION key [key ...] 返回並集
●SDIFFSTORE destination key [key ...] 保存到destination中
●SUNIONSTORE destination key [key ...] 保存到destination中
●SMOVE source destination member 把member從source移動到destination
●SPOP key [count] 從集合中隨機彈出count個數量的元素,count不指定就彈出1個 彈出完就沒了
●SRANDMEMBER key [count] 從集合中隨機返回count個數量的元素,count不指定就返回1個 彈出的話原本元素還在裏面
●SSCAN key cursor [MATCH pattern] [COUNT count] 基於遊標的遍歷 0表示結束
(4)HASH 鍵值對 值又是鍵值對
●HSET key field value 設置鍵值對
●HGETALL key 返回全部
●HGET key field 返回一個
●HLEN key 返回長度
●HKEYS key 返回hash中的所有鍵
●HVALS key 返回hash中的所有值
●HEXISTS key field 判斷hash中的鍵是否存在
●HDEL key field [field ...] 刪除對應的鍵值對
●HINCRBY key field increment 加上
●HMGET key field [field ...] 一次性獲取多個值
●HMSET key field value [field value ...] 一次性設置多個值
●HSETNX key field value 要求hash中的鍵是新建的
●HSCAN key cursor [MATCH pattern] [COUNT count] 基於遊標對hash進行遍歷
(5)zset 鍵值對 值是數字 最後按照數字進行排隊
●ZADD key [NX|XX] [CH] [INCR] score member [score member ...] 增加鍵值對
●ZRANGE key start stop [WITHSCORES] 返回這個區間的值
●ZCARD key 返回集合中元素的數量
●ZCOUNT key min max 查找在min,max之間的元素
●ZSCORE key member 獲取對應的數字
●ZINCRBY key increment member 加一個數
●ZLEXCOUNT key min max
●ZRANGEBYLEX key min max [LIMIT offset count]
按照字母順序在區間內返回member 所以填的是字母
min和max使用“[a”表示閉區間,使用“(a”表示開區間
-表示負無窮
+表示正無窮
●ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
在分數的指定區間內返回數據
●ZRANK key member 返回分數對應的排名
●ZREM key member [member ...]
●ZREMRANGEBYLEX key min max
●ZREMRANGEBYRANK key start stop
●ZREMRANGEBYSCORE key min max
●ZREVRANGE key start stop [WITHSCORES]
●ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
●ZREVRANK key member
●ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
●ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
把指定集合的member取交集,分數會相加
●ZSCAN key cursor [MATCH pattern] [COUNT count]
**
redis的配置信息介紹
根據多個配置文件啓動就可以啓動集羣
**
redis的配置文件:
includes :可以用include包含其他的配置文件 用在你將配置文件分成多個的情況下
bind 綁定的ip纔可以訪問redis 一般註釋掉 然後配置密碼
port 監聽的端口號
timeout 超時時間 0表示沒生效
daemonize yes 後臺運行
pidfile 存放進程id 這個值會經常性改變的 跟端口號不一樣
loglevel 日誌級別
logfile 指定日誌文件的地址 空字符串表示標準輸出中打印(直接在前臺打印 但是如果用的是daemonize 日誌會被送到 /dev/null)
databases 16 表示有16個數據庫
SNAPSHOTTING rdb持久化方式的配置地方
replication 跟主從複製有關的配置
Security 跟安全有關
requirepass 設置密碼
maxclients 最大客戶端的配置
APPEND ONLY MODE aof處久化方式的配置地方
**
redis的持久化
及相關的配置
**
1 RDB 每隔一定的時間把內存的數據保存到硬盤上
save A秒 B次 A秒內有B次修改就保存
不可以保證數據的絕對安全,而且通常不會在redis中只有一份 mysql中也可以保存一份並且
如果redis做二級緩存(經常查詢 很少修改 ,不是特別重要允許出現偶爾的併發問題,
不會被其他應用程序修改不和其他應用程序共享的),重要 完全不能丟失的數據不會放在redis中
(1)默認啓動,想要禁用RDB的話就刪除save
(2)持久化文件名 253 行dbfilename 配置主從集羣的時候就需要改這個名字
持久化文件保存路徑 263 dir ./ 表示的是你從哪個路徑啓動的redis 就會保存在哪裏 所以一般指定一個絕對路徑 /usr/local/redis
(3)BGSAVE stop-writes-on-bgsave-error yes/no no表示後臺寫入錯誤也不處理不在乎數據不一致
(4)數據壓縮 rdbcompression yes 對於存儲到磁盤中的快照 可以設置是否進行壓縮存儲 是硬盤資源和cpu資源之間的權衡
(5)rdbchecksum yes 存儲快照後 還可以讓redis使用CRC64算法來進行數據校驗 會消耗10%的性能消耗
2 AOF 不保存數據本身 保存生成數據的命令 rdb是二進制文件不可讀 AOF還有可讀性
(1)默認關閉 appendonly yes 改成yes
(2)核心策略:
701 appendfsync always 每條命令都保存
702 appendfsync everysec 每秒執行一次保存(默認)
703 appendfsync no 不保存
(3)AOF重寫:
文件增加到一定的大小的時候 可以進行AOF重寫 把好幾條命令合成一條命令
auto-aof-rewrite-percentage 100 表示文件翻了一倍的時候進行重寫
auto-aof-rewrite-min-size 64mb 表示超過了64mb進行重寫
(4)AOF持久化文件的修復
/usr/local/bin/redis-check-aof --fix appendonly.aof 把壞的切掉了
/usr/local/bin/redis-check-rdb --fix rdb也可以用類似命令
**
redis事務相關命令
**
MULTI
好幾個命令
EXEC
這幾個命令先不執行 EXEC的時候開始一起執行 其中一個錯誤的話就會全部都不執行但是入隊的時候沒有檢測到錯誤是不會回滾的
WATCH之後才進入事務的話:在EXEC之前如果有別人操作了 那麼這一串事務作廢
**
樂觀鎖和悲觀鎖
**
樂觀鎖:不鎖定數據 以達到更好的性能 萬一發生了碰撞 放棄自己的操作 不會導致數據的不一致
redis
悲觀鎖:操作錢鎖定數據 避免數據的不一致
**
redis發佈訂閱功能
**
SUBSCRIBE 訂閱頻道
PUBLISH 發佈
**
主從複製集羣
**
配置多個配置文件 分別啓動 INFO replication查看主從服務器狀態
(1)默認都認爲自己是master
(2)SLAVEOF 設置爲另外一個master的奴隸 SLAVE no one 變成master
(3)主機可以寫 從機自動同步 但是從機只能讀 因爲有配置slave-read-only yes
(4)從機shutdown後重新登陸會變成master 只有SLAVEOF後才能獲得這期間的數據
(5)主機shutdown後從機還是slave 主機登陸後還是master
**哨兵模式**
一般哨兵會配置多個 防止判斷失誤
主觀下線:只有一個哨兵認爲下線了
客觀下線:達到配置的個數的哨兵下線了就可以
(1)slave下線後會主動變成slave
(2)主機下線後會在從機中選取主機 主機回來後就是slave
**
jedis
註釋bind 設置密碼requirepass
**
jedis直接連接:
new Jedis();
jedis.auth();
jedis.ping();
jedis.close();
連接池:
new GenericObjectPoolConfig() new Jedispool() getResource() 都得關閉