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”
初始化配置 (埠,主配置檔案,日誌檔案,資料庫目錄,啟動服務程式,命令列連結工具)
- 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
[[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)