目錄
一、Redis入門
1.1 redis簡介
Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API其中value 可以爲string、hash、list、set、zset 等多種數據結構,可以滿足很多應用場景。還提供了鍵過期,發佈訂閱,事務,流水線,等附加功能
流水線
Redis 的流水線功能允許客戶端一次將多個命令請求發送給服務器,並將被執行的多個命令請求的結果在一個命令回覆中全部返回給客戶端,使用這個功能可以有效地減少客戶端在執行多個命令時需要與服務器進行通信的次數。
數據存放
1,Redis安裝在磁盤;
2,Redis數據存儲在內存
redis簡單使用
比如說,數據庫有一張表Order訂單表, 表主鍵orderid
1.2 Redis特性
- 速度快,數據放在內存中,官方給出的讀寫性能10 萬/S,與機器性能也有關
- 鍵值對的數據結構服務器
- 豐富的功能:見上功能
- 簡單穩定:單線程
- 持久化:發生斷電或機器故障,數據可能會丟失,持久化到硬盤
- 主從複製:實現多個相同數據的redis 副本
- 高可用和分佈式:哨兵機制實現高可用,保證redis 節點故障發現和自動轉移
- 客戶端語言多:java php python c c++ nodejs 等
1.3 redis性能高性能原因
- 純內存訪問
- 非阻塞I/O(使用多路複用)
- 單線程避免線程切
1.3 redis使用場景
1,緩存:合理使用緩存加快數據訪問速度,降低後端數據源壓力
2,排行榜:按照熱度排名,按照發布時間排行,主要用到列表和有序集合
3,計數器應用:視頻網站播放數,網站瀏覽數,使用redis 計數
4,社交網絡:贊、踩、粉絲、下拉刷新
5,消息隊列:發佈和訂閱
1.4 redis基本操作
可執行文件 |
作用 |
redis-server |
啓動redis |
redis-cli |
redis命令行客戶端 |
redis-benchmark |
基準測試工具 |
redis-check-aof |
AOF持久化文件檢測和修復工具 |
redis-check-dump |
RDB持久化文件檢測和修復工具 |
redis-sentinel |
啓動哨兵 |
redis-trib |
cluster集羣構建工具 |
二、Redis數據結構介紹
2.1 字符串
字符串類型:實際上可以是字符串(包括XML JSON),還有數字(整形 浮點數),二進制(圖片 音頻 視頻),最大不能超過512MB
命令 | 備註 |
set age 23 ex 10 | 10秒後過期 px 10000 毫秒過期 |
setnx name test | 不存在鍵name時,返回1設置成功;存在的話失敗0 |
set age 25 xx | 存在鍵age時,返回1成功 |
get age | 存在則返回value, 不存在返回nil |
set country china city beijing | 批量設值 |
mget country city address | 批量獲取 |
注意:若沒有mget命令,則要執行n次get命令
命令 | 備註 |
incr age | 必須爲整數自加1,非整數返回錯誤,無age鍵從0自增返回1 |
decr age | 整數age減1 |
incrby age 2 | 整數age+2 |
decrby age 2 | 整數age -2 |
ncrbyfloat score 1.1 | 浮點型score+1.1 |
append name world | 追加指令 |
getrange name 2 4 | 截取字符串 |
2.2 哈希(Hash)
2.2.1 hash存儲對象
redis得hash和JAVA的hash結構是一樣的,我們可以將一些數據庫的熱點數據寫入redis中。例如:
1,用戶表數據如下:
2,存儲到Redis, 使用字符串如何完成存儲操作?
3,哈希hash是一個string類型的field和value的映射表,hash特適合用於存儲對象
操作指令: hmset user:1 name Dk age 18
2.2.2 hash常用命令
命令 | 備註 |
hset key field value | hset user:1 name Dk//成功返回1,失敗返回0 |
hget user:1 name | 取值 |
hdel user:1 age | 刪只值 |
hlen user:1 | 計算個數 |
hmset user:2 name Dk age 23 sex boy | 批量設值 |
hmget user:2 name age sex | 批量取值 |
hexists user:2 name | 判斷field是否存在 |
hkeys user:2 | 獲取所有field |
hvals user:2 | 批量取值 |
hgetall user:2 | 獲取user:2所有field與value |
hincrby user:2 age 1 | 增加1 |
hincrbyfloat user:2 age 2 | 增加2 浮點 |
2.2.3 hash對象存放優點
1,原生:set user:1:name Dk;
set user:1:age 23;
set user:1:sex boy;
優點:簡單直觀,每個鍵對應一個值
缺點:鍵數過多,佔用內存多,用戶信息過於分散,不用於生產環境
2,將對象序列化存入redis
set user:1 serialize(userInfo);
優點:編程簡單,若使用序列化合理內存使用率高
缺點:序列化與反序列化有一定開銷,更新屬性時需要把userInfo全取出來進行反序列化,更新後再序列化到redis
3,使用hash類型:
hmset user:1 name Dk age 23 sex boy
優點:簡單直觀,使用合理可減少內存空間消耗
缺點:要控制ziplist與hashtable兩種編碼轉換,且hashtable會消耗更多內存erialize(userInfo);
2.2.4 內部編碼
hash的內部編碼主要有ziplist<壓縮列表>和hashtable<哈希表>兩種,大家感興趣的話後面可以單獨個章節介紹下這兩種數據結構
當field 個數少且沒有大的value 時,內部編碼爲ziplist
如:hmset user:3 name Dk age 24; object encoding user:3 //返回ziplist
當value 大於64 字節,內部編碼由ziplist 變成hashtable
如:hset user:4 address “fsgst64 字節”; object encoding user:3 //返回hashtable
2.3 列表<list>
2.3.1 list簡介
用來存儲多個有序的字符串,一個列表最多可存2的32次方減1個元素
因爲有序,可以通過索引下標獲取元素或某個範圍內元素列表,列表元素可以重複
2.3.2 list常用命令
命令 | 備註 |
rpush Dk c b a | 從右向左插入cba, 返回值3 |
lrange Dk 0 -1 | 從左到右獲取列表所有元素 返回 c b a |
lpush key c b a | 從左向右插入cba |
linsert Dk before b teacher | 在b之前插入teacher, after爲之後,使用lrange Dk 0 -1 查看 |
lrange key start end | 索引下標特點:從左到右爲0到N-1 |
lindex Dk -1 | 返回最右末尾a,-2返回b |
llen Dk | 返回當前列表長度 |
lpop Dk | 把最左邊的第一個元素c刪除 |
rpop Dk | 把最右邊的元素a刪除 |
2.4 集合<set>
2.4.1 集合應用場景
用戶標籤,社交,查詢有共同興趣愛好的人,智能推薦
保存多元素,與列表不一樣的是不允許有重複元素,且集合是無序,一個集合最多可存2的32次方減1個元素,除了支持增刪改查,還支持集合交集、並集、差集;
2.4.2 set命令:
命令 | 備註 |
exists user | 檢查user鍵值是否存在 |
sadd user a b c | 向user插入3個元素,返回3 |
sadd user a b | 若再加入相同的元素,則重複無效,返回0 |
smember user | 獲取user的所有元素,返回結果無序 |
srem user a | 返回1,刪除a元素 |
scard user | 返回2,計算元素個數 |
2.4.3 使用示例
當我們要根據用戶標籤篩選有同興趣愛好的人,實現智能推薦,可以按照這種方式進行計算
1、給用戶添加標籤:
sadd user:1:fav basball fball pq
sadd user:2:fav basball fball
............
2、或者標籤添加用戶
sadd basball:users user:1 user:2
sadd fball:users user:1 user:2
.......
3、計算出共同感興趣的人:
sinter user:1:fav user2:fav
2.5 有序集合(ZSET)
2.5.1 常用場景
常用於排行榜,如視頻網站需要對用戶上傳視頻做排行榜,或點贊數。與集合有聯繫,不能有重複的成員
三、redis常用命令
3.1 常用命令
1,查看所有鍵:
keys * set school enjoy set hello world
keys *ool -----> school
2,鍵總數 :
dbsize //2個鍵,如果存在大量鍵,線上禁止使用此指令
3,檢查鍵是否存在:
exists key //存在返回1,不存在返回0
4,鍵過期:
expire key seconds //set name test expire name 10,表示10秒過期
ttl key // 查看剩餘的過期時間
5,鍵的數據結構類型:
type key //返回string,鍵不存在返回none
3.2 redis數據庫管理
redis數據庫管理方式 |
select 0 選擇數據庫 |
flushdb 清除數據庫 |
flushall 清除所有數據 |
dbsize 數據大小 |
默認支持16個數據庫;可以理解爲一個命名空間
跟關係型數據庫不一樣的點
- redis不支持自定義數據庫名詞
- 每個數據庫不能單獨設置授權
- 每個數據庫之間並不是完全隔離的。 可以通過flushall命令清空redis實例面的所有數據庫中的數據
通過 select dbid 去選擇不同的數據庫命名空間 。 dbid的取值範圍默認是0 -15