Redis入門
文章目錄
- Redis入門
-
- NoSQL的概述
- Redis概述
- Redis的安裝和使用
-
- Jedis的入門
- Redis的資料類型
-
- 存儲String
- 存儲Hash
- 存儲Set
- 存儲Sorted-Set
- Keys的通用操作
- Redis的特性
- Redis的持久化
- 總結
看慕課網的視訊, 同時寫下的筆記
NoSQL的概述
NoSQL= Not Only SQL
為什麼需要NoSQL?(補充關系型資料庫的不足)
- 高并發讀寫–High performance(朋友圈、 新浪微網誌)
- 海量資料的高效率存儲和通路–Huge Storage
- 高擴充性和高可用性–High Scalability && High Availability
NoSQL的例子:MongoDB Redis Membase等
NoSQL的四大分類
- 鍵值存儲(Redis, memcache, Riak)
- 列存儲(Cassandra, Hbase)
- 文檔資料庫(mongoDB, CouchDB)
- 圖形資料庫(neo4j)
NoSQL的特點
- 易擴充
- 大資料量,高性能
- 靈活的資料模型
- 高可用
Redis概述
Redis的由來
一個意大利人不滿Mysql的性能,用C語言為自己的公司量身定做的一個資料庫,并且進行開源。
Redis支援的資料類型
高性能的鍵值對的資料庫,支援的鍵值資料類型
- 字元串類型 String
- 集合類型 Set
- 清單類型 List
- 散列類型 Hash
- 有序集合類型 Sorted-Set
Redis的應用場景
- 緩存
- 任務隊列
- 網站通路統計
- 資料過期處理
- 應用排行榜
- 分頁式Session
Redis的安裝和使用
搭建環境
- 虛拟機: VMware
- Linux系統:CentOS
- 連接配接工具:SecureCRT,FileZilla
運作指令安裝c語言運作環境:yum install gcc-c++
- 将檔案放入 root 目錄中并解壓
- 使用make指令進行編譯
- 安裝 make PREFIX=/usr/local/redis install
-
cd /usr/local/redis/bin
ls 指令檢視目錄, 可以看到
- benchmark 性能測試的工具
- heck-aof caof修複工具
- check-dump 檔案檢查的工具
- cli 指令行的用戶端
- sentinel
- server 伺服器啟動
- 回到編譯時的目錄中,進入redis,找到檔案redis.conf
- 把這個redis.conf檔案拷貝到安裝目錄下
- 指令: cp redis.conf /usr/local/redis
- 可以開始啟動redis,進行bin目錄,運作 ./redis-server 屬于前端啟動,但是不能做其他操作了,使用ctrl + c停止
- 要使用後端啟動要修改配置檔案 vim redis.conf ,修改配置檔案,把 daemonize no 變成 daemonize yes
- 再使用./bin/redis-server ./redis.conf 指令,後端啟動。
- 可以通過 ps -ef | grep -i redis 來檢視端口
- 停止redis: kill - 9 4684 (不推薦使用)
- 一般使用./bin/redis-cli shutdown
- 運作時 使用 ./bin/redis-cli 進入redis指令模式
Jedis的入門
Jedis就是Redis的一個用戶端,進行redis官網中檢視連接配接方式
Jedis介紹
- Jedis是Redis官方首先的Java用戶端開發包
- Jedis的GitHub位址
- 建立Java項目,引用Jar包,添加到路徑中去
Jedis jedis =new Jedis("IP Address", port);
jedis.set("name", "value");
String value = jedis.get("name");
jedis.close();
在這裡可能有個問題,防火牆端口可能還沒有打開,這裡要自行百度,根據所處的linux系統打開端口。
Jedis也可以使用連接配接池的方式來進行連接配接。
JedisPoolConfig config = new JedisPoolConfig(); //擷取連接配接池的配置對象
config.setMaxTotal(30); //設定最大連接配接數
config.setMaxIdle(10); //設定最大空閑連接配接數
JedisPool jedisPool = new JedisPool(config, "IP Address", port); //獲得連接配接池
Jedis jedis = jedisPool.getResource(); //得到jedis
Redis的資料類型
5種資料類型
- 字元串String
- 字元串清單list
- 字元串集合set
- 哈希hash
- 有序字元串集合sorted set
key命名的注意點
- 不要太長(不超過1024個位元組)
- 不要太短
- 統一的命名規範
存儲String
- 二進制安全的,存入和擷取的資料相同
- Value最多可謂容納的資料長度是512兆
常用指令
- 指派
- set key value 傳回ok
- get key 傳回value
- getset value 先擷取再設定這個key的值
- 取值 get key
- 删除 del key
- 數值的增減 數值進行遞增
- incr key: ++1 (需要保證key的值可以轉成int)
- decr key: --1 (同上)
- 擴充指令
- incrby key value 将指定的key的值加上value, 同時也要保證key的值可以轉成int
- decrby key value 将指定的key的值減少value,同上
- append key value 在指定的key的值從後面追加上value
存儲Hash
- String Key 和String Value的map容器
- 每一個Hash可以存儲4294967295個鍵值對
常用指令
- 指派
- hset hashname key value 設定一個hash 鍵 值,可以設定多個鍵值對
- hmset hashname key1 value1 key2 value2 一次為一個hash設定多個鍵值對
- 取值
- hget hashname key 傳回key的值
- hmget hashname key1 key2 key3 一次傳回多個key的值
- hgetall hashname 直接傳回hash中的所有鍵值對
- 删除
- hdel hashname key1 key2 傳回ok可以删除多個key-value
- del hashname 直接删除所有的key-value,沒有這個值了
- 擴充指令
- hincrby hashname key value hashname中的key中的值會加上value
- hdecrby hashname key value hashname中的key中的值會減少value
- hexists hashname key 判斷hashname中有沒有這個key
- hgetall hashname 傳回hashname中的所有key-value
- hlen hashname 傳回hashname中的key-value的長度
- hkeys hashname 得到所有key
- kvals hashname 得到所有value
存儲list
- ArrayList 使用數組方式
- LinkedList 使用雙向連結方式
- 雙向連結清單中增加資料
- 雙向連結清單中删除資料
存儲list常用指令
- 兩端添加
- lpush listname value1 value2 value3 從左開始插入
- rpush listname value1 value2 value3 從右開始插入
- 檢視清單
- lrange listname start(0) end(-1) 這裡-1代表倒數第一個,也可用正數0 10表示從下标0到下标10
- 兩端彈出
- lpop listname 從左邊彈出,如果不存在傳回nul,存在傳回值
- rpop listname 從右邊彈出,如果不存在傳回nul,存在傳回值
- 擷取清單元素個數
- llen listname 傳回listname中的長度
- 擴充指令
- lpushx listname value 如果該list存在則插入,如果不存在就不會插入
- rpushx listname value 如果該list存在則插入,不存在就不會插入
- lrem listname count value 如果count大于0,則會從頭開始往後删除count個value值,count等于0,則會從頭開始把所有value值删除,如果count小于0,則會從尾部開始删除count個value值
- lset listname index value 在index的下标上插入value,從0開始計算
- linsert listname before value insert_value 在value值的前面插入insert_value值
- linsert listname after value insert_value 在value值的後面插入insert_value
-
rpoplpush listname1 listname2 将listname1中的最右邊的值彈出,并從listname2左邊壓入
rpoplpush使用場景
消息釋出系統–》 time>12 滿足條件的成功消息–》未達到條件,在原有隊列中繼續循環,隻有達到條件後才能彈棧
存儲Set
- 看作沒有順序的集合
- Set集合中不允許出現重複的元素
- Set可包含的最大元素數量是4294967295
- 添加和删除元素
- sadd setname value1 value2 value3 向setname中添加value1 value2 value3
- srem setname value1 value2 從sername中删除value1 value2
- 獲得集合中的元素
- smembers setname 檢視setname中的元素
- sismember setname value 檢視setname中是否存在value
- 集合中的差集運算
- sdiff setname1 setname2 檢視setname1和setname2中的差集,和set中的元素位置有關
- 集合中的交集運算
- sinter setname1 setname2 檢視兩個set中的交集
- 集合中的并集運算
- sunion setname1 setname2 檢視兩個set中的并集
- 擴充指令
- scard setname 得到set的具體數量
- srandmember setname 随機傳回set中的一個value
- sdiffstore newsetname setname1 setname2 把setname1和setname2 差集存入newsetname集合中
- sinterstore newsetname setname1 setname2 把setname1 和setname2 交集存入newsetname集合中
- sunion newsetname setname1 setname2 把setname1 和setname2 并集結果存到newsetname集合中
使用場景
- 跟蹤具有唯一性的資料,比如說通路部落格唯一ip位址
- 用于維護資料對象之間的關聯關系。購買所有電子裝置客戶的id,存到一個指定的set中,把購買别一個裝置的客戶id存到另一個set中,可以看到兩個集合中的交集,進而知道同時購買兩件商品的使用者
存儲Sorted-Set
和Set很相似,都是字元串集合,都不允許重複
不同:
- Sorted-Set和Set的差別
- Sorted-Set中的成員在集合中的位置是有序的
實際應用場景:遊戲排名和微網誌熱點排名
常用指令
- 添加元素
- zadd zsetname score value1 score value2 向zsetname中添加value1和value2
- zadd zsername newscore value1 向zsetname中添加擁有新score的value1
- 獲得元素
- zscore zsetname value 得到value的分數score
- zcard zsetname 得到zsetname中的數量
- 删除元素
- zrem zsetname value1 value2 從zsetname中删除value1和value2的值
- 範圍查詢
- zrange zsetname 0 -1 顯示所有value 從小到大
- zrange zsetname 0 -1 withscores 顯示所有value并且帶上所對應的score
- zrangebyscore zsetname 0 100 【withscores】
- zrevrange zsetname 0 -1 顯示所有value 從大到小
- zrevrange zsetname 0 -1 withscores 顯示所有value并且帶上所對應的score
- zremrangebyrank zsetname 0 4 按照範圍來删除value
- zremrangebyscore zsetname 80 100 按照分數範圍來删除value
- 擴充指令
- zrangebyscore zsetname 0 100 【withscores】 顯示所有分數在0-100範圍内的值
- zrangebyscore zsetname 0 100 【withscores】 limit 0 2 隻顯示其中的兩個
- zincrby zsetname intvalue value 給zsetname中的value值增加intvalue
- zcount zsetname 80 90 顯示在80分和90分之間的個數
Sorted-Set使用場景
- 大型線上遊戲積分排行榜
- 建構索引資料
Keys的通用操作
- keys * 所有key的檢視
- keys my? 檢視以my開頭的所有key
- del key1 key2 key3 删除key1 key2 key3
- exisis key1 檢視key1是否存在
- rename keyname newkeyname 重命名keyname
- expire keyname 1000 設定一個過期時間
- ttl keyname 檢視所剩的時間
- type keyname 檢視key的類型
- flushall 清空資料庫
Redis的特性
相關特性:
- 多資料庫
- 一個Redis執行個體,可以包含多個資料庫,用戶端可以指定連接配接某個Redis執行個體的資料庫。
- Redis中有16個資料庫,從0号開始到15,預設連接配接0号資料庫
- 可以通過select指令來選擇連接配接某個資料庫。 select 1
- move keyname 1 将keyname從目前資料庫移到1号資料庫
- Redis事務
- multi exec discard 實作事務 所有指令都将會被串行化,順序執行,執行期間Redis将不會為其他服務端提供任何的服務,進而保證事務中的指令都被原子化執行
- multi 相當于開啟事務,其後的指令都會被存放到指令的隊列中
- exec 相當于送出,将指令隊列原子化執行
- discard 相當于callback復原
Redis的持久化
從記憶體把資料存到磁盤中:持久化
Redis的兩種持久化方式
- RDB方式
- 預設支援
- 在指定的時間内,将資料集快照定入磁盤:多少秒寫入到磁盤一次
- 優勢:整個Redis隻包含一個檔案,對于備份來說非常好,對于災難恢複來說很輕松,性能最大化
- 劣勢:如果在定時持久化之間當機,那麼前面的資料就沒有了。通過分叉子程序來進行持久化,當資料太大時可能會發生整個伺服器停止幾毫秒。
- 配置:100多行左右,發現save 900 1 save 300 10 save 60 10000, dbfilename dump.rdb dir ./
- AOF方式
- 以日志的形式記錄伺服器處理的每一個操作,在Redis啟動的時候,它會讀取該檔案然後重新去建構資料庫來保證啟動後的資料是完整的(更高的資料安全性)
- 優勢:
- 更高的資料安全性 3種同步政策 1.每秒同步(異步完成,如果當機這一秒内修改的資料将丢失) 2.每修改同步(每次修改同步效率低但是最安全) 3.不同步
- 對于日志檔案的寫入操作采用的是append模式, 是以在寫入過程中就算出現當機現象也不會破壞日志檔案中已經存在的内容,如果本次操作隻是寫入了一半的資料就出現系統崩潰的問題,下一次可以通過Redis-check-aof來幫助解決資料一緻性問題
- 如果日志過大,Redis可以自動啟動重寫機制,Redis以append的模式不斷把修改的資料寫到老的磁盤檔案中,同時還會建立一個新的檔案用來記錄此期間産生了哪些修改指令被執行了,是以在進行重寫切換的時候可以更好地保障資料安全性。
- AOF包含一個格式非常清晰易于了解的日志檔案,用于記錄所有修改操作,也可以通過這個檔案來進行資料的重建。
- 劣勢:
- 對于相同資料的資料集,AOF的檔案要比RDB檔案大一些
- 因為同步政策的不同,同步效率要低于RDB
- 配置:appendonly no 變成 appendonly yes ,會産生appendonly.aof 選擇一種同步政策 appendfsync always appendfsync everysec appendfsync no
-
無持久化
通過配置禁用Redis持久化,此時可以認為Redis隻是作為一個緩存工具
- 同時使用RDB和AOF方式
總結
Redis是一種主流的NoSQL資料庫, 有很多應用場景可以使用.
如果你發現哪裡有問題, 請評論批評指正, 非常感謝.😃