Redis入門
redis 是什么
Redis(Remote Dictionary Server ),即遠程字典服務
是一個開源的使用ANSI
-
內存存儲。持久化、內存中斷電即失、所以持久化很重要(rdb/aof)
-
效率高,可用於高速緩存
-
發布訂閱系統
-
地圖信息分析等等
持久化、集群 、事務、
官網:https://redis.io/ 中文網:http://www.redis.cn/
通過官網下載即可。
Linux安裝
Windows安裝下載解壓雙擊即可。下載地址:GitHub
#下載安裝包,上傳到opt目錄下、並解壓
[root@localhost jdk1.8.0_261]# wget http://download.redis.io/releases/redis-6.0.8.tar.gz
[root@localhost home]# mv redis-6.0.8.tar.gz /opt/
[root@localhost opt]# tar zxvf redis-6.0.8.tar.gz
[root@localhost opt]# ls
redis-6.0.8 redis-6.0.8.tar.gz
#進入解壓的文件,可以看到redis的配置文件redis.conf
#安裝基本環境gcc-c++
[root@localhost redis-6.0.8]# yum -y install gcc-c++
[root@localhost redis-6.0.8]#make
INSTALL redis-check-rdb
INSTALL redis-check-aof
Hint: It's a good idea to run 'make test' ;)
make[1]: Leaving directory `/opt/redis-6.0.8/src' 代表make成功
[root@localhost redis-6.0.8]#make install
Hint: It's a good idea to run 'make test' ;)
INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install
make[1]: Leaving directory `/opt/redis-6.0.8/src' 代表install成功
#注意報錯!make[1]: *** [server.o] Error 1
#原因是因為gcc版本過低,yum安裝的gcc是4.8.5的。因此需要升級gcc,升級過程如下:
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
#修改環境變量
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
gcc -v
make 和make install以后即可。
#注意安裝完成以后redis-server在/usr/local/bin/目錄下。
[root@localhost bin]# pwd
/usr/local/bin
[root@localhost bin]# ls
redis-benchmark redis-check-rdb redis-sentinel
redis-check-aof redis-cli redis-server
#拷貝/opt/redis-6.0.8/redis.conf文件到/usr/local/bin目錄下
[root@localhost bin]# cp /opt/redis-6.0.8/redis.conf .
[root@localhost bin]# ls
redis-benchmark redis-check-rdb redis.conf redis-server
redis-check-aof redis-cli redis-sentinel
#redis默認是前台啟動的,修改配置文件
vim redis.conf
daemonize no 改為 daemonize yes 后台方式啟動
#啟動redis服務、指定啟動配置文件為redis.conf
[root@localhost bin]# redis-server redis.conf
[root@localhost bin]# ./redis-server ./redis.conf
#客戶端redis-cli連接測試:
[root@localhost bin]# redis-cli -h localhost -p 6379 //默認本地可以不加-h
localhost:6379> ping
PONG
localhost:6379> set name koeb
OK
localhost:6379> get name
"koeb"
localhost:6379> keys * #查看所有的key
1) "name"
#查看redis進程是否開啟
[root@localhost redis-6.0.8]# ps -ef | grep redis
root 7680 1 0 02:11 ? 00:00:00 redis-server 127.0.0.1:6379
root 7688 2637 0 02:13 pts/0 00:00:00 redis-cli -h localhost -p 6379
root 7713 7244 0 02:16 pts/1 00:00:00 grep --color=auto redis
#關閉redis服務、並查看進程
localhost:6379> shutdown
not connected> exit
[root@localhost redis-6.0.8]# ps -ef | grep redis
root 7716 7244 0 02:17 pts/1 00:00:00 grep --color=auto redis
會使用單機多redis啟用
測試性能
redis-benchmark是一個壓力測試時工具!
Redis 自帶了一個叫 redis-benchmark
的工具來模擬 N 個客戶端同時發出 M 個請求。 (類似於 Apache ab 程序)。可以使用 redis-benchmark -h 來查看基准參數。
測試:
#100個並發連接 10w個請求
-h 指定主機ip
-p 指定端口
-c 指定連接數
-n 指定並發數
[root@localhost bin]# redis-benchmark -h localhost -p 6379 -c 100 -n 100000
基礎知識
redis默認有16個數據庫
默認使用的是第0 個、可以使用select進行切換數據庫!
127.0.0.1:6379> SELECT 3 #切換數據庫
OK
127.0.0.1:6379[3]> DBSIZE #查看Db大小
(integer) 0
#
127.0.0.1:6379[3]> set A qiang
OK
127.0.0.1:6379[3]> DBSIZE
(integer) 1
127.0.0.1:6379[3]> SELECT 7
OK
127.0.0.1:6379[7]> DBSIZE
(integer) 0
127.0.0.1:6379[7]> get A
(nil)
127.0.0.1:6379[7]> SELECT 3
OK
127.0.0.1:6379[3]> get A
"qiang"
#清空當前數據庫:FLUSHDB 清空所有庫:FLUSHALL
127.0.0.1:6379[3]> keys *
1) "A"
127.0.0.1:6379[3]> FLUSHDB
OK
127.0.0.1:6379[3]> keys *
(empty array)
redis 是單線程的!
redis是很快的,redis是基於內存操作,CPU不是redis性能瓶頸,redis的瓶頸是機的內存及網絡帶寬。
redis為什么單線程這么快?C語言寫的
-
誤區:高性能的服務器一定是多線程的、
-
誤區:多線程(cpu上下文切換)一定比單線程效率高、CPU>內存>硬盤
核心:redis是將所有的數據全部放在內存中的,所以使用單線程去操作效率就是最高的、多線程(CPU上下文:耗時)。對於內存系統來說、單線程就是最佳的。
5大基本數據類型
Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件MQ。 它支持多種類型的數據結構,如
Redis-key
127.0.0.1:6379> keys * #查看所有key
(empty array)
127.0.0.1:6379> set name kobe #設置 key
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set age 24
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 name2
(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> set name kobe
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379>
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> get name
"kobe"
127.0.0.1:6379> EXPIRE name 10 #設置key的過期時間 默認秒
(integer) 1
127.0.0.1:6379> ttl name #查看當前key的剩余時間
(integer) 3
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) 0
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> set name kobe
OK
127.0.0.1:6379> type name #查看當前key的類型
string
127.0.0.1:6379> type age
string
官網命令文檔:http://www.redis.cn/commands.html
String(字符串)
------------------------------------------------------------
127.0.0.1:6379> set key1 v1 #設置key
OK
127.0.0.1:6379> get key1 #獲得key
"v1"
127.0.0.1:6379> keys * #查看所有key
1) "key1"
127.0.0.1:6379> EXISTS key1 #判斷key是否存在
(integer) 1
127.0.0.1:6379> APPEND key1 "hello" #追加字符串,如果key不存在,就增加=set
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> STRLEN key1 #獲取字符串長度
(integer) 7
127.0.0.1:6379> APPEND key1 "koebe"
(integer) 12
127.0.0.1:6379> get key1
"v1hellokoebe"
127.0.0.1:6379>
------------------------------------------------------------------
127.0.0.1:6379> set views 0 #初始瀏覽量0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> INCR views #自增1
(integer) 1
127.0.0.1:6379> INCR views
(integer) 2
127.0.0.1:6379> DECR views #自減1
(integer) 1
127.0.0.1:6379> DECR views
(integer) 0
127.0.0.1:6379> DECR views
(integer) -1
127.0.0.1:6379> DECR views
(integer) -2
127.0.0.1:6379> get views
"-2"
127.0.0.1:6379> INCRBY views 10 #設置步長、指定增量
(integer) 8
127.0.0.1:6379> INCRBY views 10
(integer) 18
127.0.0.1:6379> DECRBY views 5 #設置步長、指定減量
(integer) 13
127.0.0.1:6379> DECRBY views 5
(integer) 8
----------------------------------------------------------------
#截取
127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> APPEND key1 ",lixingqiang"
(integer) 17
127.0.0.1:6379> get key1
"hello,lixingqiang"
127.0.0.1:6379> GETRANGE key1 0 4 #截取字符串 【0,4】
"hello"
127.0.0.1:6379> GETRANGE key1 0 -1 #截取字符串 【0,-1】 等於 get key1
"hello,lixingqiang"
---------------------------------------------------------------------------
#替換
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> SETRANGE key2 1 XX #替換指定位置開始的字符串:
(integer) 7
127.0.0.1:6379> get key2
"aXXdefg"
-----------------------------------------------------------------------------
#setex (set with expire) #設置過期時間
#setnx (set if not expire) #不存在再設置
127.0.0.1:6379> setex key3 30 "hello" #設置一個key3的值為hello 30秒后過期
OK
127.0.0.1:6379> ttl key3
(integer) 24
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx mykey "redis" #如果mykey不存在,創建mykey
(integer) 1
127.0.0.1:6379> keys *
1) "key1"
2) "mykey"
3) "key2"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey "MongoDB" #如果mykey存在,創建失敗
(integer) 0
127.0.0.1:6379> get mykey
"redis"
-----------------------------------------------------------------------
mset
mget
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #同事設置多個值
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> mget k1 k2 k3