1. 程式人生 > >NoSQL之Redis及資料型別

NoSQL之Redis及資料型別

Redis     Remote  Dictionary Server(遠端字典伺服器)-www.redis.cn中文網站

高效能的分散式記憶體資料庫,支援資料持久化(可以把記憶體儲存到硬碟),list,hash,set,zset等資料型別和master-slave模式資料備份

Redis伺服器搭建

安裝原始碼包redis-4.0.8.tar.gz(基於c語言編譯,需要先安裝gcc)

[[email protected] ~]# yum -y install gcc
[[email protected] ~]# tar -zxf redis-4.0.8.tar.gz 
[
[email protected]
~]# cd redis-4.0.8/ [[email protected] redis-4.0.8]# make cd src && make all make[1]: 進入目錄“/root/redis-4.0.8/src” CC Makefile.dep .... INSTALL redis-check-rdb INSTALL redis-check-aof Hint: It's a good idea to run 'make test' ;) make[1]: 離開目錄“/root/redis-4.0.8/src” [
[email protected]
redis-4.0.8]# make install cd src && make install ... INSTALL install INSTALL install INSTALL install make[1]: 離開目錄“/root/redis-4.0.8/src”

初始化配置 (埠,主配置檔案,日誌檔案,資料庫目錄,啟動服務程式,命令列連結工具)

  1. Port                            : 6379                                                                        
  2. Config file                 : /etc/redis/6379.conf              
  3. Log file                      : /var/log/redis_6379.log
  4. Data dir                     : /var/lib/redis/6379
  5. Executable               : /usr/local/bin/redis-server
  6. Cli Executable         : /usr/local/bin/redis-cli
[[email protected] redis-4.0.8]# ./utils/install_server.sh      //初始化
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379]       
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] 
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379           //服務啟動指令碼
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...                                  //服務已經開啟
Installation successful!

檢視服務狀態資訊及啟動,停止

[[email protected] redis-4.0.8]# netstat -pantul | grep 6379
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN  5025/redis-server 1 
[[email protected] redis-4.0.8]# ps -C redis-server
  PID TTY          TIME CMD
 5025 ?        00:00:00 redis-server
[[email protected] redis-4.0.8]# /etc/init.d/redis_6379 status
Redis is running (5025)

[[email protected] redis-4.0.8]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
[[email protected] redis-4.0.8]# /etc/init.d/redis_6379 status
cat: /var/run/redis_6379.pid: 沒有那個檔案或目錄
Redis is running ()

[[email protected] redis-4.0.8]# /etc/init.d/redis_6379 start
Starting Redis server...
[[email protected] redis-4.0.8]# /etc/init.d/redis_6379 status
Redis is running (5421)

連結redis

[[email protected] redis-4.0.8]# redis-cli 
127.0.0.1:6379> ping 
PONG                                       //返回值為PONG正常
127.0.0.1:6379> exit

資料管理命令

[[email protected] redis-4.0.8]# redis-cli 
127.0.0.1:6379> set key value [EX seconds] [PX milliseconds] [NX|XX]  //儲存
127.0.0.1:6379[1]> set test 123
OK
127.0.0.1:6379[1]> get key             //獲取鍵值
127.0.0.1:6379[1]> select index        //資料庫編號0-15 切換資料庫
127.0.0.1:6379[1]> keys pattern        //* 列印所有 te?? 列印指定變數,?萬用字元
127.0.0.1:6379[1]> EXISTS key [key ...]  //檢查是否存在
127.0.0.1:6379[1]> ttl key                //檢視生存時間
127.0.0.1:6379[1]> type key               //檢視型別
127.0.0.1:6379[1]> move key db            //移動記錄到某個庫
127.0.0.1:6379> expire key seconds         //設定生存時間
127.0.0.1:6379> del key [key ...]         //刪除鍵值
127.0.0.1:6379> fullshall                  //刪除所有
127.0.0.1:6379> flushdb                    //刪除當前庫的內容
127.0.0.1:6379> save                       //儲存
127.0.0.1:6379> SHUTDOWN [NOSAVE|SAVE]     //關閉服務,預設save

配置選項

[[email protected] ~]# vim /etc/redis/6379.conf   //進入開啟行號
   ...
  12 # 1k => 1000 bytes                       //資料單位
  13 # 1kb => 1024 bytes              
  14 # 1m => 1000000 bytes
  15 # 1mb => 1024*1024 bytes
  16 # 1g => 1000000000 bytes
  17 # 1gb => 1024*1024*1024 bytes
    ...
 ################### NETWORK ###############
  70 bind 127.0.0.1                           //IP地址
  93 port 6379                                //埠
 102 tcp-backlog 511                          //tcp連結總數
 114 timeout 0                                //連結超時時間
 131 tcp-keepalive 300                        //長連結時間
 #################### GENERAL #################
 137 daemonize yes                             //守護程序方式執行
 172 logfile /var/log/redis_6379.log           //pid檔案
 187 databases 16                              //資料庫個數
 #################### SNAPSHOTTING  ########### 
 264 dir /var/lib/redis/6379                   //資料庫目錄
 ################### CLIENTS ################
 533 # maxclients 10000                        //併發連結數量
 ################## MEMORY MANAGEMENT ###########
 560 # maxmemory <bytes>                       //最大記憶體
 565 # volatile-lru -> Evict using approximated LRU among the keys with an expir     e set.                                         //最近最少使用(針對設定了ttl的key)
 566 # allkeys-lru -> Evict any key using approximated LRU.  //刪除最少使用的key
 569 # volatile-random -> Remove a random key among the ones with an expire set. //在設定了ttl的key裡隨機刪除
 570 # allkeys-random -> Remove a random key, any key.  //隨機刪除key
 571 # volatile-ttl -> Remove the key with the nearest expire time (minor TTL)  //移除最近過期的key
 572 # noeviction -> Don't evict anything, just return an error on write operati     ons.  //不刪除,寫滿時報錯
 591 # maxmemory-policy noeviction                   //定義使用策略
 602 # maxmemory-samples 5                           //選取模板資料的個數(針對lru和ttl策略

修改服務使用的IP地址,埠,及密碼

常見問題:

[[email protected] ~]# /etc/init.d/redis_6379  start                         //非正常情況下停止此服務,不會自動刪除程序
/var/run/redis_6379.pid exists, process is already running or crashed

[[email protected] ~]#rm -rf  /var/run/redis_6379.pid                    //刪除這個檔案,即可重新啟動

[[email protected] ~]# vim /etc/redis/6379.conf  
70 bind 192.168.4.50
...
93 port 6350
...
501 requirepass 123456                       //修改密碼
[[email protected] ~]#/etc/init.d/redis_6379 start
[[email protected] ~]# ss -antul | grep 6350
tcp    LISTEN     0      128    192
[[email protected] ~]# redis-cli  -h 192.168.4.50 -p 6350 -a 123456
192.168.4.50:6350> 
[[email protected] ~]# redis-cli  -h 192.168.4.50 -p 6350
192.168.4.50:6350> auth 123456                  //裡面輸入密碼也可以

[[email protected] ~]# /etc/init.d/redis_6379 stop   //這種方式停不下來
Stopping ...
Could not connect to Redis at 127.0.0.1:6379: Connection refused
Waiting for Redis to shutdown ...
....
[[email protected] ~]# vim  /etc/init.d/redis_6379       //這個方式需要改以下內容,才可以呼叫指令碼 執行stop命令
REDISPORT="6350 -h 192.168.4.50 -a 123456 "        //因為stop會呼叫這個函式,所以如果不改埠,密碼,ip 這裡不用改。預設就是6379埠號
....
 stop)
...
  $CLIEXEC -p $REDISPORT shutdown
...

[[email protected] ~]# redis-cli  -h 192.168.4.50 -p 6350 -a 123456  shutdown   //可以這樣停
[[email protected] ~]# ss -antul | grep 6350

[[email protected] ~]# redis-cli  -h 192.168.4.50 -p 6350 -a 123456
192.168.4.50:6350> shutdown                        //或者這樣


Redis資料型別

                string字串

list列表

hash表

 

 

 

 

 

 

 

set key value[ex seconds] [px milliseconds] [nx | xx]

設定key和值,過期時間可以使用ex 秒 px 毫秒  不存在則賦值nx 存在賦值xx

是一個字元佇列,先進後出,

一個key多個值

一個string型別的field和value的對映表

一個key可對應多個field

一個field對應一個value

將一個對應儲存為hash型別,較於每個欄位都儲存乘string型別更能節省記憶體

mset  key value [key value...]

設定多個key及值,空格分隔,具有原子性

lrange key start stop

從開始位置讀取key的值到stop結束

lrange list 0 -1 開始到結束(開始為0,最後存的,結束為-1 ,開始存的)

setrange key offset value

從偏移量開始複寫key的特定位的值,起始0

hset key field value

將hash表中field值設定為value

strlen key  統計字串長度 llen key  返回列表key的長度

hget key field

獲取hash表中field的值

append key value

存在則追加,不存在則建立,返回key長度

lpop key

移除並返回列表頭元素資料,存在則nil

setbit key offset values 

對key所儲存字串 設定或清楚特定偏移量上的位(bit)

value值可以為1或0 offset為0~2^32之間

key不存在,則建立新key

lset key index value

將可以中index位置的值修改為value

hmset key field value [field value ...]

 

同時給hash表中的多個field賦值

bitcount key 

統計字串中被設定為1的位元位數量

lindex  key index

返回列表中第index個值

hkeys    key

返回hash表中多個field的值

decr key

將key的值減1,key不存在則先初始化為0,再減1

rpush key value [value ...]

將value插入到key的末尾

hmget key field [field ...]

返回hash表中多個field的值

decrby key decrement   

將key中的值,減去decrement

rpop key

刪除並返回key末尾的值

hgetall key

返回hash表中所有key名和對應值列表

incr key 

將key的值加1,不存在則初始化0後再加1

lpush key value [value...]

將一/多個值value插入到列表key表頭 不存在,則建立key

hvals key

返回hash表中所有key的值

incrby  key increment 

將key的值增加increment

hdel key field [field ...]

刪除hash表中多個field的值,

不存在則忽略

incrbyfloat key increment 

為key中所儲存的值加上浮點數 increment

 

get key

返回key儲存的值,不存在則返回null

   

getrange key start end

返回字串值中的子字串,範圍為start和end

負偏移從末尾開始數,-1表示最後一個,以此類推

   

mget key [key ...]

獲取一個多個key值,空格分隔,有原子性

   

string字串案例

[[email protected] 6379]# redis-cli -h 192.168.4.50 -p 6350 -a 123456
192.168.4.50:6350> set a 123 ex 20 xx      //不存在用xx賦值為錯
(nil)
192.168.4.50:6350> set a 123 ex 20 nx      //不存在用nx才可以賦值,生存時間為20s
OK
192.168.4.50:6350> ttl a                   //統計剩餘時間
(integer) 9
192.168.4.50:6350> ttl a
(integer) 7

192.168.4.50:6350> set  hello ninhao     
OK
192.168.4.50:6350> SETRANGE hello 3 ,      //從偏移量3開始,只給3重新賦值為“,” ,初始預設為0
(integer) 6
192.168.4.50:6350> get hello                //檢視值
"nin,ao"

192.168.4.50:6350> STRLEN hello             //統計字元長度
(integer) 6

192.168.4.50:6350> append hello beijing     //追加hello的值beijing
(integer) 13                                //返回長度
192.168.4.50:6350> get hello                
"nin,aobeijing"
192.168.4.50:6350> append like  xihuan      //不存在key 建立一個新的key值
(integer) 6
192.168.4.50:6350> get like
"xihuan"

192.168.4.50:6350> mset e 1 f 2 g 3          //設定多個key和值 以空格分開
OK
192.168.4.50:6350> mget e f g                //取多個key的值
1) "1"
2) "2"
3) "3"


192.168.4.50:6350> set b b  
OK
192.168.4.50:6350> BITCOUNT b           //統計b的bit為1的個數 b對應的ascii碼為98 二進位制為0110 0010
(integer) 3
192.168.4.50:6350> get b
"b"
192.168.4.50:6350> setbit b 7 1          //設定b的第7位為1
(integer) 0                              //這個在這裡代表之前的位值為0
192.168.4.50:6350> get b           //可以看到b的值變成c了 因為c的二進位制為01100011 也就是b+1
"c"
192.168.4.50:6350> setbit b 7 0          //重新設定為0
(integer) 1
192.168.4.50:6350> get b                 //值又恢復了b
"b"

192.168.4.50:6350> setbit nin 2 1        //設定nin的第二位為1 
(integer) 0
192.168.4.50:6350> BITCOUNT nin
(integer) 1
192.168.4.50:6350> setbit nin 0 1        //設定nin的第0位為1
(integer) 0
192.168.4.50:6350> BITCOUNT nin          //統計nin的bit為1的位元位是兩個
(integer) 2

192.168.4.50:6350> decr a                 //沒有a 則初始化為0 在減1
(integer) -1
192.168.4.50:6350> set test 9            
OK
192.168.4.50:6350> decr test              //將key的值減1
(integer) 8
192.168.4.50:6350> decrby test 2          //將key的值減2
(integer) 6
192.168.4.50:6350> incr test              //將key值加1
(integer) 7
192.168.4.50:6350> incrby test 3          //將key的值加3
(integer) 10
192.168.4.50:6350> incr d                 //d值不存在,初始化為0 加1
(integer) 1 
192.168.4.50:6350> incrbyfloat d 0.55     //將d的值新增小數0.55 
"1.55"


192.168.4.50:6350> set chenggong success 
OK
192.168.4.50:6350> getrange chenggong 0 1     //子串擷取從0開始 到1結束
"su"
192.168.4.50:6350> getrange chenggong 0  -1    //子串擷取從開始到結束
"success"
192.168.4.50:6350> getrange chenggong -4 -1    //子串擷取從倒數第四位到倒數第一位
"cess"

list列表案例  

192.168.4.50:6350> lpush ai  wo xi huan ni    //定以key的值列表
(integer) 4
192.168.4.50:6350> lrange ai 0 -1             //後存的為0 先存的在最下面,開始到結束
1) "ni"
2) "huan"
3) "xi"
4) "wo"
192.168.4.50:6350> lrange ai 0 1              //取0和1位
1) "ni"
2) "huan"
192.168.4.50:6350> lrange ai -3 -1            //按存的順序取反。
1) "huan"
2) "xi"
3) "wo"

192.168.4.50:6350> lpop ai                    //移除ni
"ni"
192.168.4.50:6350> lpop ai               
"huan"
192.168.4.50:6350> lrange ai 0 -1             //檢視列表
1) "xi"
2) "wo"
192.168.4.50:6350> lpop ii                    //不存在
(nil)

192.168.4.50:6350> rpush ai ya a               //在ai的末尾依次插入值ya a
(integer) 6
192.168.4.50:6350> lrange ai 0 -1              //顯示列表的值
1) "ni"
2) "huan"
3) "xi"
4) "wo"
5) "ya"
6) "a"

192.168.4.50:6350> rpop ai                     //移除末尾值
"a"
192.168.4.50:6350> lrange ai 0 -1
1) "ni"
2) "huan"
3) "xi"
4) "wo"
5) "ya"


192.168.4.50:6350> lindex ai 3                  //列出列表的第三位
"wo"
192.168.4.50:6350> lset ai -1 hello             //將-1位(末尾第一位)改成hello
OK
192.168.4.50:6350> lrange ai 0 -1
1) "ni"
2) "huan"
3) "xi"
4) "wo"
5) "hello"

hash表案例

168.4.50:6350> hset site baidu www.baidu.com     //定義鍵對應的域對應的值(key field value)
(integer) 1
192.168.4.50:6350> hset site tiammao  www.tmall.com
(integer) 1
192.168.4.50:6350> hset site taobao  www.taobao.com
(integer) 1
192.168.4.50:6350> hget site taobao               //獲取鍵值site對應的域淘寶對應的值
"www.taobao.com"
192.168.4.50:6350> hget site baidu 
"www.baidu.com"

192.168.4.50:6350> hmset hobby book sanguoyanyi ball football    //同時給多個域field賦值
OK
192.168.4.50:6350> hmget hobby book ball                        //返回多個field的值
1) "sanguoyanyi"
2) "football"
192.168.4.50:6350> hmget site taobao tiammao baidu
1) "www.taobao.com"
2) "www.tmall.com"
3) "www.baidu.com"
192.168.4.50:6350> hvals site                          //返回所有site的值
1) "www.baidu.com"
2) "www.tmall.com"
3) "www.taobao.com"


192.168.4.50:6350> hgetall site                        //返回所有的域和值
1) "baidu"
2) "www.baidu.com"
3) "tiammao"
4) "www.tmall.com"
5) "taobao"
6) "www.taobao.com"

192.168.4.50:6350> hkeys hobby                          返回域
1) "book"
2) "ball"
192.168.4.50:6350> hkeys site
1) "baidu"
2) "tiammao"
3) "taobao"


192.168.4.50:6350> hdel hobby book ball                刪除多個field的值
(integer) 2
192.168.4.50:6350> hgetall hobby 
(empty list or set)