Redis數據庫安裝部署及基本操作詳解

Redis數據庫概述

Redis是一個開源的、使用c語言編寫NoSQL數據庫,它是基於內存運行並支持持久化,采用key-value(鍵值對)的存儲形式, 是目前分佈式結構中不可或缺的

Redis相比於其他數據庫的優點

  • 具有極高的數據讀寫速度:讀(110000次/s),寫(81000次/s)
  • 支持豐富的數據類型:支持key-value、strings、Lists、Hashes(散列值)、Sets等數據類型操作
  • 支持數據持久化:可以將內存中的數據保存在磁盤中
  • Redis所有操作都是具有原子性的

Redis安裝部署

[[email protected] ~]# yum install -y gcc gcc-c++ make
[[email protected] opt]# tar xzf redis-5.0.7.tar.gz 
[[email protected] opt]# cd redis-5.0.7/
[[email protected] redis-5.0.7]# make 
[[email protected] redis-5.0.7]# make prefix=/usr/local/redis install
[[email protected] redis-5.0.7]# cd utils/
[[email protected] utils]# ./install_server.sh		#啟動安裝腳本
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server		
##這一步需要手動指定位置,其他都回車即可
[[email protected] utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[[email protected] utils]# netstat -antp | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      23276/redis-server

Redis服務控制

/etc/init.d/redis_6379 stop
/etc/init.d/redis_6379 start
/etc/init.d/redis_6379 restart
/etc/init.d/redis_6379 status

修改配置文件

[[email protected] utils]# vim /etc/redis/6379.conf 

在這裡插入圖片描述

[[email protected] utils]# /etc/init.d/redis_6379 restart		#重啟服務
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[[email protected] utils]# netstat -antp | grep redis
tcp        0      0 192.168.118.88:6379     0.0.0.0:*               LISTEN      23492/redis-server  
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      23492/redis-server

Redis命令工具

redis-server:用於啟動Redis的工具
redis-benchmark:用於檢測Redis在本機的運行效率
redis-check-aof:修復AOF持久化文件
redis-check-rdb:修復RDB持久化文件
redis-cli:Redis命令行工具
redis-cli -h 遠程主機ip -p 服務端口號 -a 指定密碼
如果沒有設置數據庫密碼,可以省略-a選項,若不添加任何選項表示,這使用127.0.0.1:6379連接本機上的Redis數據庫

Redis測試工具redis-benckmark

redis-benchmark 選項:
-h :指定服務器主機名
-P :指定服務器端口
-s :指定服務器socket(套接字)
-c :指定並發連接數
-n :指定請求數
-d :以字節的形式指定SET/GET值的數據大小
-k :1=keep alive 0=reconnect
-r :SET/GET/INCR 使用隨機key,SADD使用隨機值
-p :通過管道傳輸<numreq>請求
-q :強制退出redis
-l :生成循環,永久執行測試
-t :僅運行以逗號分割的測試命令列表
-I :Idle模式,僅打開N哥idle連接並等待
[[email protected] utils]# redis-benchmark -h 192.168.118.88 -P 6379 -c 100 -n 10000
##向主機發送100哥並發連接和10000哥請求測試性能

[[email protected] utils]# redis-benchmark -h 192.168.118.88 -p 6379 -q -d 10
##測試存取10字節的數據包性能
PING_INLINE: 925925.88 requests per second
PING_BULK: 1470588.12 requests per second
SET: 900900.88 requests per second
GET: 934579.44 requests per second
INCR: 1136363.62 requests per second
LPUSH: 578034.69 requests per second
RPUSH: 793650.75 requests per second
LPOP: 584795.31 requests per second
RPOP: 806451.62 requests per second
SADD: 840336.12 requests per second
HSET: 746268.62 requests per second
SPOP: 1098901.12 requests per second
LPUSH (needed to benchmark LRANGE): 671140.94 requests per second
LRANGE_100 (first 100 elements): 26089.22 requests per second
LRANGE_300 (first 300 elements): 5534.65 requests per second
LRANGE_500 (first 450 elements): 3414.37 requests per second
LRANGE_600 (first 600 elements): 2345.11 requests per second
MSET (10 keys): 120048.02 requests per second

 
[[email protected] utils]# redis-benchmark -t set,lpush -n 100000 -q
##測試本機Redis服務在進行set和lpush操作時的性能
SET: 166112.95 requests per second
LPUSH: 191570.88 requests per second

Redis數據庫數據類型

每個數據類型的創建key和查看key值都是不同的

String數據類型

[[email protected] utils]# redis-cli
127.0.0.1:6379> 


[[email protected] utils]# redis-cli			#查看所有的鍵
127.0.0.1:6379>  keys *
1) "counter:__rand_int__"
2) "myset:__rand_int__"
3) "mylist"
4) "key:__rand_int__"
127.0.0.1:6379> keys m*					#查看以m開頭所有鍵
1) "myset:__rand_int__"
2) "mylist"

創建數據,獲取數據

127.0.0.1:6379> set whd zhangsan		#創建一個鍵whd,值為zhangsan
OK
127.0.0.1:6379> keys *					#查看創建結果
1) "counter:__rand_int__"
2) "myset:__rand_int__"
3) "mylist"
4) "key:__rand_int__"
5) "whd"
127.0.0.1:6379> get whd					#獲取鍵值
"zhangsan"	

查看鍵是否存在

127.0.0.1:6379> exists whd				#存在返回1,不存在返回為0
(integer) 1
127.0.0.1:6379> exists www
(integer) 0

刪除鍵

127.0.0.1:6379>  del whd
(integer) 1
127.0.0.1:6379> exists whd
(integer) 0

查看鍵中value的數據類型

127.0.0.1:6379> set aaa bbb 
OK
127.0.0.1:6379> type aaa
string

對鍵重命名

127.0.0.1:6379> rename aaa ccc
OK
127.0.0.1:6379> keys *
1) "counter:__rand_int__"
2) "myset:__rand_int__"
3) "mylist"
4) "key:__rand_int__"
5) "ccc"

##rename也可用來覆蓋鍵值

```bash
127.0.0.1:6379> get ccc
"bbb"
127.0.0.1:6379> set ddd fff				#新建鍵ddd,值為fff
OK
127.0.0.1:6379> rename ccc ddd			#將ccc值覆蓋ddd
OK
127.0.0.1:6379> get ddd					#查看結果
"bbb"

##renamens,可以判斷重命名的新鍵名是否存在,存在則返回0不做操作,不存在則覆蓋並重命名
127.0.0.1:6379> set aaa bbb
OK
127.0.0.1:6379> renamenx ddd aaa
(integer) 0

查看當前數據庫key的數目

127.0.0.1:6379> dbsize
(integer) 6

設置密碼,刪除密碼

127.0.0.1:6379> config set requirepass 123123			#設置新密碼
OK
127.0.0.1:6379> auth 123123								#認證密碼
OK
127.0.0.1:6379> config get requirepass					#查看密碼
1) "requirepass"
2) "123123"

[[email protected] utils]# redis-cli -h 192.168.118.88 -p 6379		#此時可以登錄數據庫,但是不能進行操作
192.168.118.88:6379> keys *
(error) NOAUTH Authentication required.
192.168.118.88:6379> auth 123123						#進行密碼認證後才能操作
OK			
192.168.118.88:6379> keys *
1) "counter:__rand_int__"
2) "aaa"
3) "ddd"
4) "myset:__rand_int__"
5) "mylist"
6) "key:__rand_int__"

192.168.118.88:6379> config set requirepass ''			#刪除密碼
OK

追加數據

127.0.0.1:6379> keys *
1) "counter:__rand_int__"
2) "aaa"
3) "ddd"
4) "myset:__rand_int__"
5) "mylist"
6) "key:__rand_int__"
7) "www"
127.0.0.1:6379> get www
"10"
127.0.0.1:6379> append www 20							#append,追加數值
(integer) 4
127.0.0.1:6379> get www
"1020"
127.0.0.1:6379> append whd 23							#如果鍵不存在,append命令相當於set創建鍵,並賦值
(integer) 2
127.0.0.1:6379> get whd
"23"
127.0.0.1:6379> strlen whd							  	#strlen判斷鍵值得長度
(integer) 2

key值遞增/遞減,incr/decr/incrby/decrby

127.0.0.1:6379> get whd
"23"
127.0.0.1:6379> incr whd								#INCR遞增數值(key值必須為整數)
(integer) 24
127.0.0.1:6379> incr whd
(integer) 25	
127.0.0.1:6379> decr whd								#DECR遞減數值(key值必須為整數)
(integer) 24
127.0.0.1:6379> decr whd
(integer) 23
127.0.0.1:6379> incrby whd 10							#按照指定數值進行遞增
(integer) 33
127.0.0.1:6379> get whd
"33"
127.0.0.1:6379> decrby whd 5							#按照指定數值進行遞減
(integer) 28
127.0.0.1:6379> 

getset返回原有值然後給key設置新值

127.0.0.1:6379> getset whd 22				#先返回原有key值50,然後給予key新值22(新的值不會打印顯示)
"50"	
127.0.0.1:6379> get whd						#查看key新的值
"22"	
127.0.0.1:6379> getset whd 66
"22"
127.0.0.1:6379> get whd
"66"

setex支持key的過期時間

127.0.0.1:6379> setex ttt 10 66								#指定ttt10秒過期
OK
127.0.0.1:6379> ttl ttt										#ttl可查看生命周期
(integer) 3
127.0.0.1:6379> ttl ttt										#查出-2表示已經過期,-1表示永久保存
(integer) -2
127.0.0.1:6379> get ttt
(nil)
127.0.0.1:6379> ttl whd
(integer) -1127.0.0.1:6379> setnx whd 22
(integer) 0


127.0.0.1:6379> setnx whd   22           #setnx可以對鍵進行判斷,有則操作無效,無則創建
(integer) 0

批量創建,批量查看

127.0.0.1:6379> mset aa 10 bb 20 cc 30
OK
127.0.0.1:6379> keys *
1) "counter:__rand_int__"
2) "cc"
3) "myset:__rand_int__"
4) "whd"
5) "aa"
6) "key:__rand_int__"
7) "mylist"
8) "bb"
127.0.0.1:6379> mget aa bb cc
1) "10"
2) "20"
3) "30"
127.0.0.1:6379> msetnx aa 10 jj 10 dd 10					#msetnx可進行判斷,隻要有一個鍵存在,則操作失效,當鍵都不存在才創建key
(integer) 0
127.0.0.1:6379> msetnx jj 10 dd 10
(integer) 1

List數據類型

127.0.0.1:6379> lpush age a b c d e 						#lpush由左插入多個鍵值,
(integer) 5
127.0.0.1:6379> lrange age 0 -1		
#lrange查看list數據類型的key值,後面要加查看的范圍,這裡0表示第一個數,-1表示最後一個數(也可以輸入key值個數),
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> lrange age 1 2
1) "d"
2) "c"
127.0.0.1:6379> lrange age 3 5
1) "b"
2) "a"
127.0.0.1:6379> lpushx age g							#lpushx插入一個元素在一個已存在的key的開頭
(integer) 6
127.0.0.1:6379> lrange age 0 -1
1) "g"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> lpop age								#lpop移除首個元素
"g"
127.0.0.1:6379> lrange age 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> lpop age
"e"
127.0.0.1:6379> lrange age 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> llen age								#獲取key值個數
(integer) 4

LREM/LSET/LINDEX/LTRIM

127.0.0.1:6379> del age
(integer) 1
127.0.0.1:6379> lpush age a b c d d a c
(integer) 7
127.0.0.1:6379> lrange age 0 -1
1) "c"
2) "a"
3) "d"
4) "d"
5) "c"
6) "b"
7) "a"
127.0.0.1:6379> lrem age 1 a						#指定刪除從開頭開始n個重復值
(integer) 1
127.0.0.1:6379> lrange age 0 -1
1) "c"
2) "d"
3) "d"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> lrem age 2 c
(integer) 2
127.0.0.1:6379> lrange age 0 -1
1) "d"
2) "d"
3) "b"
4) "a"
127.0.0.1:6379> lindex age 1						#獲取索引值對應的key值,索引值從上往下從0開始
"d"
127.0.0.1:6379> lindex age 3
"a"
127.0.0.1:6379> lset age 1 a						#基於已有的索引值更換key值
OK
127.0.0.1:6379> lset age 3 c
OK
127.0.0.1:6379> lrange age 0 -1
1) "d"
2) "a"
3) "b"
4) "c"

127.0.0.1:6379> lrange whd1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "c"
6) "b"
7) "b"
127.0.0.1:6379> ltrim whd1 0 3						#僅保留索引范圍的元素
OK
127.0.0.1:6379> lrange whd1  0 -1
1) "a"
2) "b"
3) "c"
4) "d"

在指定元素的左/右插入元素

127.0.0.1:6379> linsert whd1 before a a1				#在a的前面插入元素a1
(integer) 5
127.0.0.1:6379> lrange whd1 0 -1
1) "a1"
2) "a"
3) "b"
4) "c"
5) "d"
127.0.0.1:6379> linsert whd1 after a a2					#在a的後面插入元素a2
(integer) 6
127.0.0.1:6379> lrange whd1 0 -1
1) "a1"
2) "a"
3) "a2"
4) "b"
5) "c"
6) "d"

由右插入元素

127.0.0.1:6379> rpush whd2 a b c d e
(integer) 5
127.0.0.1:6379> lrange whd2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> rpushx whd2 a1								#在最後插入元素
(integer) 6
127.0.0.1:6379> lrange whd2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "a1"	
127.0.0.1:6379> rpop whd2									#移除最後一個元素
"a1"
127.0.0.1:6379> lrange whd2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> rpoplpush whd2 whd2				#組合使用,右彈出左插入,相當於把原key值最後一個元素插入到目標key值得最前面
"e"
127.0.0.1:6379> lrange whd2 0 -1
1) "e"
2) "a"
3) "b"
4) "c"
5) "d"
127.0.0.1:6379> rpoplpush whd2 whd1
"d"
127.0.0.1:6379> lrange whd1 0 -1
1) "d"
2) "a1"
3) "a"
4) "a2"
5) "b"
6) "c"
7) "d"

Hash(散列)數據類型

hash用於存儲對象,可以采用hash格式(對象列別和ID)構成鍵名

127.0.0.1:6379> hset caiwu name "lisi"			#創建鍵,設置字段為name,值為lisi
(integer) 1
127.0.0.1:6379> hget caiwu name
"lisi"
127.0.0.1:6379> hset caiwu name "wangwu"		#為該鍵添加字段name1,值為wangwu
(integer) 0
127.0.0.1:6379> hset caiwu name1 "wangwu"
(integer) 1
127.0.0.1:6379> hexists caiwu name				#判斷caiwu鍵中name字段是否存在
(integer) 1
127.0.0.1:6379> hlen caiwu						#查看key值裡面右多少個字段
(integer) 2
127.0.0.1:6379> hdel caiwu name					#刪除字段
(integer) 1
127.0.0.1:6379> hexists caiwu name
(integer) 0
127.0.0.1:6379> hsetnx caiwu name "aa"			#添加字段
(integer) 1
127.0.0.1:6379> hget caiwu name
"aa"
127.0.0.1:6379> hset caiwu name2 2	
(integer) 1
127.0.0.1:6379> hincrby caiwu name2 2			#遞增字段值
(integer) 4
127.0.0.1:6379> hincrby caiwu name2 -2			#遞減字段值
(integer) 2
127.0.0.1:6379> hgetall caiwu					#查看key中所有信息
1) "name1"
2) "wangwu"
3) "name"
4) "aa"
5) "name2"
6) "2"
127.0.0.1:6379> hmget caiwu name name1			#查看key的多個字段值
1) "aa"
2) "wangwu"
127.0.0.1:6379> hkeys caiwu						#查看鍵的多個字段
1) "name1"
2) "name"
3) "name2"
127.0.0.1:6379> hvals caiwu						#查看鍵中所有的字段值
1) "wangwu"
2) "aa"
3) "2"

set數據類型(無序集合)

元素具有唯一性,不允許存在重復的成員,多個集合類型之間可以進行並集、交集和差集運算

127.0.0.1:6379> keys *
1) "counter:__rand_int__"
2) "myset:__rand_int__"
3) "key:__rand_int__"
4) "mylist"
5) "caiwu"
127.0.0.1:6379> sadd whd a b c d					#添加鍵,設置鍵值
(integer) 4
127.0.0.1:6379> smembers whd						#查看鍵值
1) "a"
2) "c"
3) "b"
4) "d"
127.0.0.1:6379> scard whd							#查看key值個數
(integer) 4
127.0.0.1:6379> sismember whd a						#判斷key值是否存在,存在則返回1,不存在則返回0
(integer) 1
127.0.0.1:6379> sismember whd g
(integer) 0
127.0.0.1:6379> srandmember whd						#srandmember表示隨機返回一個成員
"b"
127.0.0.1:6379> srandmember whd
"a"

隨機移除鍵值

127.0.0.1:6379> spop whd		#隨機移除數值,後面不加參數則默認移除一個,可以添加數值,表示移除該數值個數的元素
"a"
127.0.0.1:6379> smembers whd
1) "c"
2) "b"
3) "d"
127.0.0.1:6379> spop whd 2
1) "d"
2) "b"
127.0.0.1:6379> smembers whd
1) "c"
127.0.0.1:6379>  sadd whd a b e f					#添加元素,有重復值不會插入
(integer) 4
127.0.0.1:6379> smembers whd
1) "a"
2) "e"
3) "b"
4) "c"
5) "f"
127.0.0.1:6379> srem whd a e b						#移除指定元素
(integer) 3
127.0.0.1:6379> smembers whd
1) "f"
2) "c"
127.0.0.1:6379> sadd whd1 a b						#設置新鍵
(integer) 2
127.0.0.1:6379> smove whd whd1 c					#講whd中的c移動到whd1中
(integer) 1
127.0.0.1:6379> smembers whd										
1) "f"
127.0.0.1:6379> smembers whd1
1) "a"
2) "c"
3) "b"

Sorted Set 數據類型(有序集合)

元素類型為String,元素具有唯一性,不能重復,每個元素都會關聯一個double類型的分數score(表示權重),可以通過權重的大小排序,元素的score可以相同,可以用於在線遊戲的積分排行榜

127.0.0.1:6379> zadd whd 1 "zhansan"				#添加一個數值為1的成員zhansan
(integer) 1
127.0.0.1:6379> zadd whd 2 "lisi" 3 "wangwu"		#添加兩個成員,對應數值為2,3
(integer) 2
127.0.0.1:6379> zrange whd 0 -1						#查看whd的各元素值
1) "zhansan"
2) "lisi"
3) "wangwu"
127.0.0.1:6379> zrange whd 0 -1 WITHSCORES			#WITHSCORES表示返回的結果中包含每個成員及其分數,否則返回成員
1) "zhansan"
2) "1"
3) "lisi"
4) "2"
5) "wangwu"
6) "3"
127.0.0.1:6379>  zrank whd "zhansan"				#獲取成員對應的位置索引,0代表第一個,nil表示不存在
(integer) 0
127.0.0.1:6379>  zrank whd "lisi"
(integer) 1
127.0.0.1:6379> zcard whd							#查看成員數
(integer) 3
127.0.0.1:6379> zcount whd 2 3						#分數滿足表達式2<= score <=3的成員數量
(integer) 2
127.0.0.1:6379> zcount whd 1 2
(integer) 2
127.0.0.1:6379> zrem whd lisi						#刪除指定成員
(integer) 1
127.0.0.1:6379> zrange whd 0 -1					
1) "zhansan"
2) "wangwu"
127.0.0.1:6379> zscore whd zhansan					#返回成員所對應的分數
"1"
127.0.0.1:6379> zrange whd 0 -1 WITHSCORES
1) "zhansan"
2) "1"
3) "wangwu"
4) "3"
127.0.0.1:6379> zincrby whd 5 zhansan				#為成員的分數增加指定值
"6"
127.0.0.1:6379> zrange whd 0 -1 WITHSCORES
1) "wangwu"
2) "3"
3) "zhansan"
4) "6"
127.0.0.1:6379> zadd whd 2 zhansan			#添加已有成員設置分數時,會覆蓋原因成員和分數,並返回為0.表示沒有增加元素,但不表示沒有修改
(integer) 0
127.0.0.1:6379> zrange whd 0 -1 WITHSCORES
1) "zhansan"
2) "2"
3) "wangwu"
4) "3"
127.0.0.1:6379> zrangebyscore whd 1 2		#獲取分數滿足1<=score<=2的成員
1) "zhansan"
2) "lisi"


127.0.0.1:6379> zrange whd 0 -1
1) "lisi"
2) "zhansan"
3) "xuyi"
4) "wangwu"
127.0.0.1:6379> zrangebyscore whd -inf +inf limit 1 3		
#-inf表示第一個成員,+inf表示最後一個成員,這裡表示匹配所有成員,然後limit顯示索引1後面的三個成員
1) "zhansan"
2) "xuyi"
3) "wangwu"
127.0.0.1:6379> zremrangebyrank whd 0 1		#刪除位置索引滿足表達式0<=rank<=1的元素
(integer) 2
127.0.0.1:6379> zcard whd
(integer) 2
127.0.0.1:6379> zrange whd 0 -1
1) "xuyi"
2) "wangwu"

排序

127.0.0.1:6379> zadd whd1 1 a 2 b 3 d 4 e	
(integer) 4
127.0.0.1:6379> zrevrange whd 0 -1 withscores
1) "wangwu"
2) "3"
3) "xuyi"
4) "2"
127.0.0.1:6379> zrevrange whd1 0 -1 withscores			#以位置索引從高到低顯示區間的值
1) "e"
2) "4"
3) "d"
4) "3"
5) "b"
6) "2"
7) "a"
8) "1"

到此這篇關於Redis數據庫安裝部署及基本操作的文章就介紹到這瞭,更多相關Redis安裝部署內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: