一吃环、引言
1.1 數(shù)據(jù)庫壓力過大
由于用戶量增大,請求數(shù)量也隨之增大洋幻,數(shù)據(jù)壓力過大
1.2 數(shù)據(jù)不同步
多臺服務(wù)器之間郁轻,數(shù)據(jù)不同步
1.3 傳統(tǒng)鎖失效
多臺服務(wù)器之間的鎖,已經(jīng)不存在互斥性了鞋屈。
二范咨、Redis介紹
2.1 關(guān)于關(guān)系型數(shù)據(jù)庫和NOSQL數(shù)據(jù)庫(鍵值對存儲)
關(guān)系型數(shù)據(jù)庫是基于關(guān)系表的數(shù)據(jù)庫,最終會將數(shù)據(jù)持久化到磁盤上厂庇,而nosql數(shù)據(jù)庫是基于特殊的結(jié)構(gòu)渠啊,并將數(shù)據(jù)存儲到內(nèi)存的數(shù)據(jù)庫。從性能上而言权旷,nosql數(shù)據(jù)庫要優(yōu)于關(guān)系型數(shù)據(jù)庫替蛉,從安全性上而言關(guān)系型數(shù)據(jù)庫要優(yōu)于nosql數(shù)據(jù)庫贯溅,所以在實際開發(fā)中一個項目中nosql和關(guān)系型數(shù)據(jù)庫會一起使用,達到性能和安全性的雙保證躲查。
2.2 Redis介紹
有一位意大利人它浅,在開發(fā)一款LLOOGG的統(tǒng)計頁面,因為MySQL的性能不好镣煮,自己研發(fā)了一款非關(guān)系型數(shù)據(jù)庫姐霍,并命名為Redis。Salvatore典唇。
Redis(Remote Dictionary Server)即遠程字典服務(wù)镊折,Redis是由C語言去編寫,Redis是一款基于Key-Value的NoSQL介衔,而且Redis是基于內(nèi)存存儲數(shù)據(jù)的恨胚,Redis還提供了多種持久化機制,性能可以達到110000/s讀取數(shù)據(jù)以及81000/s寫入數(shù)據(jù)炎咖,Redis還提供了主從赃泡,哨兵以及集群的搭建方式,可以更方便的橫向擴展以及垂直擴展乘盼。
Redis之父 |
---|
image.png
|
三升熊、Redis安裝
3.1 安裝Redis
官網(wǎng):https://redis.io
下載:http://download.redis.io/releases
中文網(wǎng):https://www.redis.net.cn/
官網(wǎng)提供安裝方式如下:(安裝redis編譯的c環(huán)境,此步驟沒有編譯)
Installation
Download, extract and compile Redis with:
$ wget <http://download.redis.io/releases/redis-5.0.5.tar.gz >
cd redis-5.0.5
$ make
The binaries that are now compiled are available in the src directory. Run Redis with:
$ src/redis-server
You can interact with Redis using the built-in client:
$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
3.3 安裝步驟
1.把下載好的redis-5.0.4.tar.gz安裝包拷貝到當前虛擬機root目錄下蹦肴,解壓到/usr/local下
[root@localhost ~]# tar -zxvf redis-5.0.4.tar.gz -C /usr/local
2.編譯的c環(huán)境
[root@localhost ~]# yum install gcc-c++
3.進入redis-5.0.4目錄 使用make命令編譯redis(若報錯僚碎,先make distclean猴娩,再make)
[root@localhost redis-5.0.4]# make
4.使用make PREFIX=/usr/local/redis-5.0.4 install命令安裝(安裝后會出現(xiàn)bin目錄)
[root@localhost redis-5.0.4]# make PREFIX=/usr/local/redis-5.0.4 install
5.啟動redis服務(wù)端(前臺啟動)
[root@localhost redis-5.0.4]# cd bin
[root@localhost bin]# ./redis-server
image.png
啟動后看到如上歡迎頁面阴幌,但此窗口不能關(guān)閉,窗口關(guān)閉就認為redis也關(guān)閉了卷中,所以我們需要在后臺啟動矛双,然后再啟動客戶端進行連接,所以首先Ctrl+C退出蟆豫。
解決:可以通過修改配置文件配置redis的后臺啟
動(即服務(wù)器啟動了但不會創(chuàng)建控制臺窗口)
步驟如下:
1.切換到redis-5.0.4目錄下议忽,把當前目錄下的redis.conf文件拷貝到bin目錄下
[root@localhost bin]# cd ../
[root@localhost redis-5.0.4]# cp redis.conf bin/redis.conf
2.切換到bin目錄下,修改redis.conf文件
[root@localhost redis-5.0.4]# cd bin
[root@localhost bin]# vim redis.conf
3.將redis.conf文件中的daemonize的值從no修改成yes表示后臺啟動
image.png
4.啟動redis服務(wù)端(后臺啟動)
[root@localhost bin]# ./redis-server redis.conf
5.查看是否啟動成功
[root@localhost bin]# ps -ef | grep redis
6.啟動客戶端
[root@localhost bin]# ./redis-cli
7.存取數(shù)據(jù)進行測試
127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> get name
"jack"
四十减、redis-benchmark官方自帶的性能測試工具
4.1 在安裝的redis中可以看到redis-benchmark
4.2 關(guān)于redis-benchmark 的一些參數(shù)
簡單測試:100個并發(fā)栈幸,十萬個請求,單機測試
[root@localhost bin]# ./redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000
image.png
參數(shù)解釋:
====== PING_INLINE ======
100000 requests completed in 0.84 seconds 表示對十萬個請求進行寫入測試
100 parallel clients 100個并發(fā)客戶端
3 bytes payload 每次寫入3個字節(jié)
keep alive: 1 只有一臺服務(wù)器處理請求(單機性能)
99.36% <= 1 milliseconds
99.96% <= 2 milliseconds
100.00% <= 2 milliseconds 請求在3毫秒處理完成
119047.62 requests per second 每秒處理119047.62次請求
./redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q:此命令表示只測試set和lpush方式并退出
五帮辟、Redis的常用命令
5.1 數(shù)據(jù)類型
redis是一種高級的key-value的存儲系統(tǒng)速址,其中的key是字符串類型,盡可能滿足如下幾點:
1.key不要太長由驹,最好不要操作1024個字節(jié)芍锚,這不僅會消耗內(nèi)存還會降低查找效率
2.key不要太短,如果太短會降低key的可讀性
3.在項目中,key最好有一個統(tǒng)一的命名規(guī)范(根據(jù)企業(yè)的需求)
value最常用的五種數(shù)據(jù)類型:
1.字符串(String):最常用的并炮,一般用于存儲一個值
2.列表(List):使用list結(jié)構(gòu)實現(xiàn)棧和隊列結(jié)構(gòu)
3.集合(Set) :交集默刚,差集和并集的操作
4.有序集合(sorted set) :排行榜,積分存儲等操作
5.哈希(Hash):存儲一個對象數(shù)據(jù)的
5.2 字符串(String)
set key value:設(shè)定key持有指定的字符串value逃魄,如果該key存在則進行覆蓋操作荤西,總是返回"OK"
get key:獲取key的value。如果與該key關(guān)聯(lián)的value不是String類型伍俘,redis將返回錯誤信息皂冰,因為get命令只能用于獲取String value,如果該key不存在养篓,返回null
getset key value:先獲取該key的值秃流,然后在設(shè)置該key的值。
incr key:將指定的key的value原子性的遞增1.如果該key不存在柳弄,其初始值為0舶胀,在incr之后其值為1。如果value的值不能轉(zhuǎn)成整型碧注,如hello嚣伐,該操作將執(zhí)行失敗并返回相應(yīng)的錯誤信息。
decr key:將指定的key的value原子性的遞減1.如果該key不存在萍丐,其初始值為0轩端,在incr之后其值為-1。如果value的值不能轉(zhuǎn)成整型逝变,如hello基茵,該操作將執(zhí)行失敗并返回相應(yīng)的錯誤信息。
incrby key increment:將指定的key的value原子性增加increment壳影,如果該key不存在拱层,器初始值為0,在incrby之后宴咧,該值為increment根灯。如果該值不能轉(zhuǎn)成整型,如hello則失敗并返回錯誤信息掺栅。
decrby key decrement:將指定的key的value原子性減少decrement烙肺,如果該key不存在,器初始值為0氧卧,在decrby之后桃笙,該值為decrement。如果該值不能轉(zhuǎn)成整型假抄,如hello則失敗并返回錯誤信息怎栽。
append key value:如果該key存在丽猬,則在原有的value后追加該值;如果該key不存在熏瞄,則重新創(chuàng)建一個key/value脚祟。
5.3 列表(List)
lpush key value1 value2...:在指定的key所關(guān)聯(lián)的list的頭部插入所有的values,如果該key不存在强饮,該命令在插入的之前創(chuàng)建一個與該key關(guān)聯(lián)的空鏈表由桌,之后再向該鏈表的頭部插入數(shù)據(jù)。插入成功邮丰,返回元素的個數(shù)行您。
rpush key value1 value2…:在該list的尾部添加元素。
lrange key start end:獲取鏈表中從start到end的元素的值剪廉,start娃循、end可為負數(shù),若為-1則表示鏈表尾部的元素斗蒋,-2則表示倒數(shù)第二個捌斧,依次類推….
image.png
lpushx key value:當key存在時,在頭部插入value泉沾,否則將不插入
rpushx key value:在key的尾部插入value
image.png
lpop key:返回并彈出指定的key關(guān)聯(lián)的鏈表中的第一個元素捞蚂,即頭部元素。
rpop key:從尾部彈出元素跷究。
image.png
rpoplpush resource destination:將鏈表中的尾部元素彈出并添加到頭部姓迅。
image.png
llen key:返回指定的key關(guān)聯(lián)的鏈表中的元素的數(shù)量。
lset key index value:設(shè)置鏈表中的index的腳標的元素值俊马,0代表鏈表的頭元素丁存,-1代表鏈表的尾元素。
image.png
lrem key count value:刪除count個值為value的元素潭袱,如果count大于0柱嫌,從頭向尾遍歷并刪除count個值為value的元素,如果count小于0屯换,則從尾向頭遍歷并刪除。如果count等于0与学,則刪除鏈表中所有等于value的元素彤悔。
image.png
linsert key before|after pivot value:在pivot元素前或者后插入value這個元素。
image.png
5.4 集合(Set索守,不允許出現(xiàn)重復(fù)的元素)
sadd key value1 value2…:向set中添加數(shù)據(jù)晕窑,如果該key的值已有則不會重復(fù)添加。
smembers key:獲取set中所有的成員卵佛。
scard key:獲取set中成員的數(shù)量杨赤。
image.png
sismember key member:判斷參數(shù)中指定的成員是否在該set中敞斋,1表示存在,0表示不存在或者該key本身就不存在疾牲。
srem key member1 member2… :刪除set中指定的成員植捎。
image.png
srandmember key:隨機返回set中的一個成員。
image.png
sdiff key1 key2:返回key1與key2中相差的成員阳柔,而且與key的順序有關(guān)焰枢,即返回差集。
image.png
sdiffstore destination key1 key2:將key1舌剂、key2相差的成員存儲在destination上济锄。
image.png
sinter key[key1,key2…]:返回交集。
sinterstore destination key1 key2:將返回的交集存儲在destination上霍转。
image.png
sunion key1 key2:返回并集荐绝。
image.png
sunionstore destination key1 key2:將返回的并集存儲在destination上
image.png
5.5 有序集合(sorted set)
zadd key score member score2 member2 … :將所有成員以及該成員的分數(shù)存放到sorted-set中。
image.png
zcard key:獲取集合中的成員數(shù)量避消。
image.png
zcount key min max:獲取分數(shù)在[min,max]之間的成員很泊。
image.png
zincrby key increment member:設(shè)置指定成員的增加的分數(shù)。
zrange key start end [withscores]:獲取集合中腳標為start-end的成員沾谓,[withscores]參數(shù)表明返回的成員包含其分數(shù)委造。
image.png
zrangebyscore key min max [withscores][limit offset count]:返回分數(shù)在[min,max]的成員并按照分數(shù)從低到高排序。[withscores]:顯示分數(shù)均驶;[limit offset count]:offset昏兆,表明從腳標為offset的元素開始并返回count個成員。
image.png
zrank key member:返回成員在集合中的位置妇穴。
zrem key member[member…]:移除集合中指定的成員爬虱,可以指定多個成員。
zscore key member:返回指定成員的分數(shù)腾它。
5.6 哈希(Hash)
hset key field value:為指定的key設(shè)定field/value對(鍵值對)跑筝。
hgetall key:獲取key中的所有filed-vaule。
image.png
hget key field:返回指定的key中的field的值瞒滴。
image.png
hmset key fields:設(shè)置key中的多個filed/value曲梗。
hmget key fileds:獲取key中的多個filed的值。
hexists key field:判斷指定的key中的filed是否存在妓忍。
hlen key:獲取key所包含的field的數(shù)量虏两。
hincrby key field increment:設(shè)置key中filed的值增加increment,如:age增加20世剖。
5.7 通用操作
keys patten:獲取所有與patten匹配的key定罢,*表示任意字符,?表示一個字符旁瘫。
image.png
del key1 key2....:刪除指定的key祖凫。
image.pngexists key:判斷該key是否存在琼蚯,1表示存在,0表示不存在惠况。
rename key newkey:為當前key重命名遭庶。
image.png
expire key second:為當前key設(shè)置過期時間(單位:秒)。
ttl key:查看當前key剩余過期時間售滤。
type key:查看當前key類型罚拟。
image.png
flushall: 刪除所有key