Redis從基礎到精通
一 . Linux下安裝Redishtml
- 下載安裝包 redis官網:https://redis.io/,下載完成 redis-4.0.9.tar.gz
- 啓動Linux,上傳安裝包至/home/wenjin目錄下
- 移動安裝包至opt目錄下 mv redis-4.0.9.tar.gz /opt
- 解壓 tar -zxvf redis-4.0.9.tar.gz
- 進入解壓後的文件,能夠看到redis的配置文件
- 安裝gcc環境 yum install gcc-c++ 執行make命令 make install命令
- redis默認安裝在 /usr/local/bin
- 將redis配置文件複製至當前文件夾下 cp /opt/redis-4.0.9/redis.conf wconfig
- redis默認不是後臺啓動的,修改配置文件 vim redis.conf 修改daemonize no 爲 daemonize yes
- 啓動redis服務,在bin目錄下執行 redis-server wconfig/redis.conf
- 使用redis自帶客戶端鏈接測試 redis-cli -p 6379
二 . Redis基礎知識c++
redis有16個數據庫,默認爲第0個數據庫
切換數據庫 select 序號
查看全部的key
redis
127.0.0.1:6379[3]> keys * 1) "age" 127.0.0.1:6379[3]>
清除當前數據庫 FLUSHDB 清除全部數據庫 FLUSHALL
127.0.0.1:6379> flushdb OK 127.0.0.1:6379> keys * (empty list or set) 127.0.0.1:6379>
Redis是單線程的!!
官方表示Redis是基於內存操做的,CPU不是Redis的性能瓶頸,Redis的性能瓶頸是根據計算機的內存和網絡帶寬,既然可使用單線程來實現就使用單線程實現了!
Redis是C語言寫的,官方提供的數據爲100000+QPS,性能很是之高!
mongodb
Redis爲何單線程還這麼快?
1. 誤區1:高性能的服務器必定是多線程的?
2. 誤區2:多線程(CPU上下文切換!)必定比單線程高!
核心:Redis是將全部的數據放在內存中,因此說Redis使用單線程去操做效率就是最高的,(多線程CPU上下文切換耗時間!!),對於內存系統來講,沒有上下文切換效率就是最高的!屢次讀寫都是在一個CPU 上,在內存狀況下這個就是最佳方案!
數據庫
三 . Redis五大數據類型json
查詢未知命令----Redis中文網站 http://www.redis.cn/commands.html# Redis-keyvim
127.0.0.1:6379> keys * //查看當前庫全部的key (empty list or set) 127.0.0.1:6379> flushall //清除全部的庫 OK 127.0.0.1:6379> keys * (empty list or set) 127.0.0.1:6379> set name wenjin OK 127.0.0.1:6379> keys * 1) "name" 127.0.0.1:6379> set age 22 OK 127.0.0.1:6379> keys * 1) "name" 2) "age" 127.0.0.1:6379> exists name //查看key是否存在 (integer) 1 127.0.0.1:6379> exists name1 (integer) 0 127.0.0.1:6379> move name 1 //一出key到目標庫 (integer) 1 127.0.0.1:6379> keys * 1) "age" 127.0.0.1:6379> select 1 //切換庫 OK 127.0.0.1:6379[1]> keys * 1) "name" 127.0.0.1:6379[1]> select 0 OK 127.0.0.1:6379> keys * 1) "age" 127.0.0.1:6379> set name wenwen OK 127.0.0.1:6379> keys * 1) "name" 2) "age" 127.0.0.1:6379> expire name 10 //設置key過時時間,單位是秒 (integer) 1 127.0.0.1:6379> ttl name //查看當前key的剩餘時間 (integer) 6 127.0.0.1:6379> ttl name (integer) 3 127.0.0.1:6379> ttl name (integer) 0 127.0.0.1:6379> type age //查看key的類型 string 127.0.0.1:6379>
String類型緩存
127.0.0.1:6379> keys * (empty list or set) 127.0.0.1:6379> set name1 wenjin OK 127.0.0.1:6379> get name1 "wenjin" 127.0.0.1:6379> append name1 ",qianyu" //追加字符串 (integer) 17 127.0.0.1:6379> get name1 "wenjin,qianyu" 127.0.0.1:6379> append name2 "hello" //追加字符串,若是當前字符串不存在,則爲set (integer) 5 127.0.0.1:6379> strlen name2 //查看字符串長度! (integer) 5 127.0.0.1:6379>
作自增i++,例如瀏覽量服務器
127.0.0.1:6379> set view 0 OK 127.0.0.1:6379> get view "0" 127.0.0.1:6379> incr view //自加 (integer) 1 127.0.0.1:6379> incr view (integer) 2 127.0.0.1:6379> 127.0.0.1:6379> incr view (integer) 3 127.0.0.1:6379> decr view //自減 (integer) 2 127.0.0.1:6379> decr view (integer) 1 127.0.0.1:6379> decr view (integer) 0 127.0.0.1:6379> decr view (integer) -1 127.0.0.1:6379> incrby view 30 //自加多 (integer) 29 127.0.0.1:6379> decrby view 20 //自減多 (integer) 9 127.0.0.1:6379>
字符串替換和截取網絡
//字符串範圍 range 127.0.0.1:6379> set key1 "hello,wenjin" OK 127.0.0.1:6379> get key1 "hello,wenjin" 127.0.0.1:6379> getrange key1 0 4 //截取字符串【0,3】 "hello" 127.0.0.1:6379> get key1 "hello,wenjin" 127.0.0.1:6379> getrange key1 0 -1 //獲取所有字符串 "hello,wenjin" 127.0.0.1:6379> set key2 abdfdgdjkj OK 127.0.0.1:6379> get key2 "abdfdgdjkj" 127.0.0.1:6379> setrange key2 2 xxx //字符串替換 (integer) 10 127.0.0.1:6379> get key2 "abxxxgdjkj"
重點:setex和setnx基礎用法及分佈式鎖使用場景
#setex (set with expire) //設置過時時間 #setnx (set if not existr) //設置不存在的key-value (在分佈式鎖中經常使用) 127.0.0.1:6379> setex key3 40 danaomeng //設置key3的值在40秒後過時 OK 127.0.0.1:6379> ttl key3 //查看key3的過時時間 (integer) 35 127.0.0.1:6379> ttl key3 (integer) 32 127.0.0.1:6379> setnx mykey hahhahaha //若是meykey不存在,則設置mykey (integer) 1 127.0.0.1:6379> keys * 1) "mykey" 2) "key1" 3) "key2" 4) "i" 5) "name" 127.0.0.1:6379> setnx mykey wewewewe //若是mykey存在,則設置失敗 (integer) 0 127.0.0.1:6379> keys * 1) "mykey" 2) "key1" 3) "key2" 4) "i" 5) "name" 127.0.0.1:6379> get mykey "hahhahaha"
批量設置字符串
#mset #mget 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 //同時設置多個值 OK 127.0.0.1:6379> mget k1 k2 k3 //同時獲取多個值 1) "v1" 2) "v2" 3) "v3" 127.0.0.1:6379> keys * 1) "k3" 2) "k2" 3) "k1" 127.0.0.1:6379> msetnx k1 v1 k4 v4 //msetnx是一個原子性操做,要麼一塊兒成功!要麼一塊兒失敗! (integer) 0 127.0.0.1:6379>
設置對象
#對象
set user:1 {name:wenjin,age:22} #這隻一個user:1對象,值用一個json字符串來保存一個對象! #這裏key是一個巧妙的設計: user:{id}:{filed} 127.0.0.1:6379> mset user:1:name liusan user:1:age 33 OK 127.0.0.1:6379> mget user:1:name user:1:age 1) "liusan" 2) "33" 127.0.0.1:6379>
getset用法
#getset //先get後set 127.0.0.1:6379> getset desc redis //若是不存在值則,則返回nil (nil) 127.0.0.1:6379> get desc "redis" 127.0.0.1:6379> getset desc mongodb //若是存在值,則返回原來的值,設置新的值! "redis" 127.0.0.1:6379> get desc "mongodb" 127.0.0.1:6379>
String類型使用場景:value除了咱們的字符串還能夠是數字
* 計數器
* 統計多單位數量
* 粉絲數
* 對象緩存存儲
* 等等等等
**
基礎部分先寫到這裏,後期內容我會進一步跟進,歡迎各位小夥伴一塊兒探討!
**