Redis 入門-redis.conf詳解


Redis入門

redis 是什么

Redis(Remote Dictionary Server ),即遠程字典服務

是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日志型、Key-Value數據庫,並提供多種語言的API。

  • 內存存儲。持久化、內存中斷電即失、所以持久化很重要(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。 它支持多種類型的數據結構,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets) 與范圍查詢, bitmapshyperloglogs地理空間(geospatial) 索引半徑查詢。 Redis 內置了 復制(replication)LUA腳本(Lua scripting)LRU驅動事件(LRU eviction)事務(transactions) 和不同級別的 磁盤持久化(persistence), 並通過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。

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   #同事獲取多個值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4   #msetnx是一個原子性的操作,要么一起成功、否則全失敗
(integer) 0
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379>

127.0.0.1:6379> mset user:1:name zhangsan user:1:age 3
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "3"
---------------------------------------------------------------------
#getset
127.0.0.1:6379> getset db redis #如果不存在值,則返回nil、並設置值
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb  #如果存在值,獲取原值、並設置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"

 

list


基本的數據類型,列表

------------------------------------------------
127.0.0.1:6379> LPUSH list one   #將一個值或多個值,插入到列表的頭部(左)
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1  #獲取list中值、可以獲取區間值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LRANGE list 0 1    
1) "three"
2) "two"
127.0.0.1:6379> RPUSH list rigth   #將一個值或多個值,插入到列表的尾部(右)
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "rigth"
-------------------------------------------------------------------------
lpop
rpop
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "rigth"
127.0.0.1:6379> LPOP list    #移除列表list的第一個元素
"three"
127.0.0.1:6379> rPOP list    #移除列表list的最后一個元素
"rigth"
127.0.0.1:6379> LRANGE list 0 -1    
1) "two"
2) "one"
---------------------------------------------------------
lindex
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LINDEX list 1   #通過下標獲取list中的某一值!
"one"
127.0.0.1:6379> LINDEX list 0
"two"

----------------------------------------------------------------
llen
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> LPUSH list one
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
127.0.0.1:6379> LLEN list   # 返回列表的長度
(integer) 3
----------------------------------------------------------------
移除指定的值
lrem
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one  #移除list集合中指定個數的value,精確匹配
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> LREM list 2 three
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
----------------------------------------------------------------
trim修剪。
127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
127.0.0.1:6379> RPUSH mylist "hello1"
(integer) 2
127.0.0.1:6379> RPUSH mylist "hello2"
(integer) 3
127.0.0.1:6379> RPUSH mylist "hello3"
(integer) 4
127.0.0.1:6379> LTRIM mylist 1 2   #通過下標截取指定的長度,保留指定的
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello1"
2) "hello2"
----------------------------------------------------------------
rpoplpush # 移除列表最后一個元素,並將它移動到新的列表中!
127.0.0.1:6379> RPUSH list "hello"
(integer) 1
127.0.0.1:6379> RPUSH list "hello1"
(integer) 2
127.0.0.1:6379> RPUSH list "hello2"
(integer) 3
127.0.0.1:6379> RPOPLPUSH list otherlist # 移除列表最后一個元素,並將它移動到新的列表中!
"hello2"
127.0.0.1:6379> LRANGE list 0 -1  
1) "hello"
2) "hello1"
127.0.0.1:6379> LRANGE otherlist 0 -1
1) "hello2"
----------------------------------------------------------------
lset #將列表中指定下標的值替換為另一個值,更新操作。
127.0.0.1:6379> EXISTS list  # 判斷這個列表是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item    #如果不存在列表,去更新就會報錯
(error) ERR no such key
127.0.0.1:6379> LPUSH list "value1"
(integer) 1
127.0.0.1:6379> LRANGE list 0  0
1) "value1"
127.0.0.1:6379> lset list 0 item   #如果存在、就更新當前下標的值
OK
127.0.0.1:6379> LRANGE list 0  0
1) "item"
127.0.0.1:6379> lset list 1 other   #如果不存在、則會報錯
(error) ERR index out of range
-----------------------------------------------------------------------------
linsert #將某個具體的value插入到列表中某個元素的前邊或者后邊
127.0.0.1:6379> RPUSH list hello
(integer) 1
127.0.0.1:6379> RPUSH list world
(integer) 2
127.0.0.1:6379> LINSERT list before world other
(integer) 3
127.0.0.1:6379> LRANGE list  0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> LINSERT list after world wwww
(integer) 4
127.0.0.1:6379> LRANGE list  0 -1
1) "hello"
2) "other"
3) "world"
4) "wwww"

實際上是個鏈表,

  • before Node after ,left ,right 都可以插入

  • 如果key不存在,創建新的鏈表。

  • 如果key存在,新增內容

  • 如果移除了所有值,空鏈表,也代表不存在!

  • 在兩邊插入或者改動值,效率最高、中間元素,相對效率會低一點~

消息隊列!(lpush rpop),棧(lpush lpop)

 

set(集合)


set中的值不能重復讀的!

Hash(哈希)


 

三種特殊數據類型

geospatial 地理位置

hyperloglog

bitmaps

 

事務


Redis事務本質:一組命令的集合!所有命令都會被序列化,在事務執行的過程中,會按照順序執行!一次性、順序性、排他性!執行一系列的命令!

-----隊列 set set set 執行 ----

Redis事務沒有隔離級別的概念!

所有的命令在事務中,並沒有直接被執行,只有發起命令的時候才會執行、exec

Redis單條命令 是保證原子性的,但是事務不保證原子性!

redis 的事務:

  • 開啟事務()

  • 命令入隊()

  • 執行事務()

正常執行事務

 

redis.conf詳解


啟動的時候 就是通過配置文件啟動的!

單位:

不區分大小寫、對大小寫不敏感

  9 # it in the usual form of 1k 5GB 4M and so forth:
 10 #
 11 # 1k => 1000 bytes
 12 # 1kb => 1024 bytes
 13 # 1m => 1000000 bytes
 14 # 1mb => 1024*1024 bytes
 15 # 1g => 1000000000 bytes
 16 # 1gb => 1024*1024*1024 bytes
 17 #
 18 # units are case insensitive so 1GB 1Gb 1gB are all the same.
網絡
  69 bind 127.0.0.1   #綁定ip
 88 protected-mode yes  #保護模式
 92 port 6379         #端口設置
通用 general
  225 daemonize yes  #以守護進程方式運行、默認是no 需要開啟yes
  247 pidfile /var/run/redis_6379.pid #如果以后台方式運行,就需要指定一個pid文件!
  日志:
  249 # Specify the server verbosity level.
  250 # This can be one of:
  251 # debug (a lot of information, useful for development/testing)
  252 # verbose (many rarely useful info, but not a mess like the debug lev     el)
  253 # notice (moderately verbose, what you want in production probably)
  254 # warning (only very important / critical messages are logged)
  255 loglevel notice
 
  260 logfile ""  # 日志的文件位置名
  275 databases 16  #數據庫的數量 默認是16個
  283 always-show-logo yes   #是否顯示logo
快照

持久化,在規定時間內,執行了多少次操作,則會持久化到文件(.rdb、.aof) redis 是內存數據庫,如果沒有持久化,那么數據斷電即失!

  307 save 900 1   #如果900秒內,有1個key進行修改,就進行持久化操作
 308 save 300 10  #如果300秒內,有10個key進行修改,就進行持久化操作
 309 save 60 10000 #如果60秒內,有10000個key進行修改,就進行持久化操作
 #以后自己可以定義
 324 stop-writes-on-bgsave-error yes #持久化出錯,是否繼續工作
 330 rdbcompression yes #是否壓縮rdb文件、需要消耗一些CPU資源。
 339 rdbchecksum yes  #保存rdb文件時,進行錯誤檢測校驗
 365 dir ./   #rdb文件保存的目錄
安全:

redis默認是沒有密碼的 可以設置密碼

667 ################################## SECURITY #############################  
   127.0.0.1:6379> CONFIG GET requirepass   #獲取密碼
   1) "requirepass"
   2) ""
   127.0.0.1:6379> CONFIG sET requirepass 123456  # 設置密碼
  OK
[root@localhost bin]# redis-cli -p 6379
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
   127.0.0.1:6379> auth 123456   # 密碼登錄
OK
127.0.0.1:6379> ping
PONG
客戶端限制
############################## CLIENTS #################################
   833 # maxclients 10000 #設置客戶端最大連接數
   860 # maxmemory <bytes> #redis配置最大的內存容量
   891 # maxmemory-policy noeviction   #內存滿了后的處理策略:
  1、volatile-lru:只對設置了過期時間的key進行LRU(默認值)
    2、allkeys-lru : 刪除lru算法的key  
        3、volatile-random:隨機刪除即將過期key  
    4、allkeys-random:隨機刪除  
    5、volatile-ttl : 刪除即將過期的  
        6、noeviction : 永不過期,返回錯誤
aof 配置
#aof配置
1069 ############################## APPEND ONLY MODE ########################
   1089 appendonly no  #默認是不開啟aof模式的、默認使用rdb方式持久化的,在大部分情況下、rdb完全夠用了。
   1093 appendfilename "appendonly.aof"  #持久化文件的名字  
   1119 appendfsync everysec  #每秒執行一次sync,可能會丟失這1秒的數據!
      appendfsync always     #每次修改都會寫入sync,消耗性能
      appendfsync no         #不執行 sync,這個時候系統自己同步數據,速度最快!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM