redis使用小結
NoSQL介紹
NoSQL是以key-value形式存儲,特點:非關系型的,分布式的,開源的,水平可擴展的
1.處理超大量的數據
2.運行在便宜的PC服務器集群上
3.擊碎了性能瓶頸
NoSQL適用場景
1.對數據高并發讀寫
2.對海量數據的高效率存儲和訪問
3.對數據的高可擴展性和高可用性
Redis的介紹
開源的,key-value存儲,通常被稱為數據結構服務器
鍵可以包含字符串strings,哈希hashes,鏈表lists,集合sets,有序集合sorted sets
這些數據類型都支持 push/pop,add/remove及取交集和并集以及更豐富的操作
Redis支持不同方式的排序
數據都緩存在內存中,也可以周期性的把更新的數據寫入磁盤,或者把修改操作寫入追加的記錄文件
Redis適用場合
新浪微博redis的部署場景很多,大概分2種:
1.應用程序直接訪問Redis數據庫
2.應用程序直接訪問Redis,只有當Redis訪問失敗的時候才訪問MySQL
應用場景:
1.取最新的N個數據的操作
2.排行榜應用,取TOP N的操作
3.需要精確設定過期時間的應用
4.計數器應用
5.Uniq操作,獲取某段時間所有數據排重值 唯一操作
6.實時系統,反垃圾系統
7.pub/sub構建實時消息系統
8.構建隊列系統
9.緩存
redis MySQL mongodb 區別
1.庫 庫 庫
2.無表 有表 集合-類似于MySQL的表
3.無字段、行、列 有字段、行、列 無字段、行、列
redis的安裝
官網:http://redis.io/download
穩定版 2.4.17
1.下載安裝包
wget http://redis.googlecode.com/files/redis-2.4.17.tar.gz
2.編譯源程序
tar -zxvf redis-2.4.17.tar.gz
cd redis-2.4.17
make
cd src && make test
make test 的時候如果出現
You need tcl 8.5 or newer in order to run the Redis test
make: ** [test] Error 1
這樣的錯誤,則需要安裝tcl
下載tcl
wget http://downloads.sourceforge.net/tcl/tcl8.6.0-src.tar.gz cd tcl8.6.0/ cd unix && ./configure --prefix=/usr \
--mandir=/usr/share/man \ --without-tzdata \
$([ $(uname -m) = x86_64 ] && echo --enable-64bit) && make && sed -e "s@^(TCL_SRC_DIR=').@\1/usr/include'@" \ -e "/TCL_B/s@='(-L)\?.unix@='\1/usr/lib@" \ -i tclConfig.sh
make install && make install-private-headers && ln -v -sf tclsh8.6 /usr/bin/tclsh && chmod -v 755 /usr/lib/libtcl8.6.so
如果是32位機,則需要把x86_64改成x86_32,--enable-64bit 改成32bit
make install
redis沒有配置configure 直接進行編譯安裝
3.移動文件,便于管理
mkdir -p /usr/local/redis/bin
mkdir -p /usr/local/redis/etc
mv /lamp/redis-2.4.17/redis.conf /usr/local/redis/etc
cd /lamp/redis-2.4.17/src
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin
4.啟動redis服務
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 指定配置文件
redis服務端的默認連接端口是6379
5.客戶端連接
/usr/local/redis/bin/redis-cli
6.停止redis實例
我們可以使用/usr/local/redis/bin/redis-cli shutdown
也可以使用 pkill redis-server
Redis的配置
daemonize 如果需要在后臺運行,把該項改為yes
pidfile 配置多個pid的地址 默認為 /var/run/redis.pid
bind 綁定ip 設置后只接受來自該ip的請求
port 監聽端口 默認為6379
timeout 設置客戶端連接時的超時時間 單位為秒
loglevel 分為4級 debug,verbose,notice,warning
logfile 配置log文件地址
database 設置數據庫的個數,默認使用的數據庫為0
save 設置redis進行數據庫鏡像的頻率
rdbcompression 在進行鏡像備份時,是否進行壓縮
Dbfilename 鏡像備份文件的文件名
Dir 數據庫鏡像備份的文件放置路徑
Slaveof 設置數據庫為其他數據庫的從數據庫
Masterauth 主數據庫連接需要的密碼驗證
Requirepass 設置登錄時需要使用的密碼
Maxclients 限制同時連接的客戶數量
Maxmemory 設置redis能夠使用的最大內存
Appendonly 開啟 append only 模式
Appendfsync 設置對appendonly.aof文件同步的頻率
vm-enabled 是否開啟虛擬內存支持
vm-swap-file 設置虛擬內存的交換文件路徑
vm-max-memory 設置redis使用的最大物理內存大小
vm-page-size 設置虛擬內存的頁大小
vm-pages 設置交換文件的總的page數量
vm-max-threads 設置VMIO同時使用的線程數量
Glueoutputbuf 把小的輸出緩存放在一起
hash-max-zipmap-entries 設置hash的臨界值
Activerehashing 重新hash
Redis的數據類型
strings類型及操作
string是最簡單的類型,一個key對應一個value,string類型是二進制安全的
redis的string可以包含任何數據,比如JPG圖片或序列化的對象
Set
設置key對應的值為string類型的value
例如:添加一個name=lijie的鍵值對
redis 127.0.0.1:6379> set name lijie
ok
獲取設置的name值
redis 127.0.0.1:6379> get name
Setnx
設置key 對應的值為string類型的value
如果key已經存在,返回0,nx是not exists的意思
Setex
設置key 對應的值為string類型的value 并指定此鍵值對應的有效期
例如:添加一個haircolor=red的鍵值對,并指定有效期為10秒
redis 127.0.0.1:6379> setex haircolor 10 red
Setrange
設置指定key的value值的子字符串
例如:將lijie的126郵箱替換為gmail郵箱
如果替換的字符串沒有原來的字符串長,則長于替換的字符串的字符將被保留
redis 127.0.0.1:6379> get name
"lijie@126.com"
redis 127.0.0.1:6379> setrange name 6 gmail.com
(integer) 15
redis 127.0.0.1:6379> get name
"lijie@gmail.com"
mset
一次設置多個key的值,成功返回OK表示所有的值都設置了,失敗返回0表示沒有任何值被設置
redis 127.0.0.1:6379> mset key1 lijie1 key2 lijie2
ok
redis 127.0.0.1:6379> get key1
"lijie1"
redis 127.0.0.1:6379> get key2
"lijie2"
msetnx
一次設置多個key的值,成功返回OK表示所有的值都設置了
失敗返回0表示沒有任何值被設置,但是不會覆蓋已經存在的key
如果有鍵值存在則所有值都不會被設置,返回0
get
獲取key對應的string值,如果key不存在則返回nil
getset
設置key的值,并返回key的舊值
getrange
獲取key的value值的子字符串
redis 127.0.0.1:6379> getrange name 0 5
0表示起始位置 5表示結束字符位置 就是截取0-5 的字符
mget
一次獲取多個key的值,如果對應key不存在,則對應返回nil
incr
對key的值做++操作,并返回新的值
incrby
同incr類似,加指定值,key不存在的時候會設置key,并認為原來的value是0
redis 127.0.0.1:6379> incrby key4 3 key4+3
redis 127.0.0.1:6379> incrby key4 -2 key4-2
decr
對key的值做--操作
decrby
同decr類似,減指定值
append
給指定key的字符串追加value,返回新字符串值的長度
redis 127.0.0.1:6379> append name @lijie.me
strlen
取指定key的value值的長度
del
刪除指定key的值
redis 127.0.0.1:6379> del name
(integer) 1
hashes類型
hashes類型及操作
Redis hash 是一個string類型的field和value的映射表
它的添加,刪除操作都是0(1)(平均)
hash特別適合用于存儲對象
相較于將對象的每個字段存成單個string類型,
將一個對象存儲在hash類型中會占用更少的內存 并且可以更方便的存取整個對象
hashes類型
hset
設置hash field 為指定值,如果key不存在,則先創建
redis 127.0.0.1:6379> hset myhash field1 hello
hsetnx
設置hash field 為指定值,如果key不存在,則先創建,如果存在則返回0
hmset
同時設置hash的多個field
hget
獲取指定的hash field
hget myhash field1
hmget
獲取全部指定的hash field
hincrby
指定的hash field 加上給定的值
hexists
測試指定field是否存在
hlen
返回指定hash的field數量
hdel
刪除指定hash的field
redis 127.0.0.1:6379> hdel myhash age
hkeys
返回hash的所有field
redis 127.0.0.1:6379> hkeys myhash
hvals
返回hash的所有value
hgetall
獲取某個hash中全部的field以及value
redis 127.0.0.1:6379> hgetall myhash
lists類型
lists類型及操作
list是一個鏈表結構,主要功能是push,pop,獲取一個范圍的所有值等等
操作中key理解為鏈表的名字
redis的list類型起始就是一個每個子元素都是string類型的雙向鏈表
可以通過push,pop操作從鏈表的頭部或者尾部添加刪除元素
這樣list既可以做棧,又可以作為隊列
lists類型
lrange
獲取給定key范圍的list元素
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
lpush
在key對應list的頭部添加字符串元素
redis 127.0.0.1:6379> lpush mylist "word"
(integer) 1
redis 127.0.0.1:6379> lpush mylist "hello"
(integer) 2
redis 127.0.0.1:6379> lrange mylist 0 -1 // lrange 0表示從頭部取,-1表示到尾部
1) "hello"
2) "world"
rpush
在key對應list的尾部添加字符串元素
redis 127.0.0.1:6379> rpush mylist2 "world"
(integer) 1
redis 127.0.0.1:6379> rpush mylist2 "hello"
(integer) 2
redis 127.0.0.1:6379> lrange mylist2 0 -1
1) "world"
2) "hello"
linsert
在key對應list的特定位置前或后添加字符串
redis 127.0.0.1:6379> rpush mylist3 "world"
(integer) 1
redis 127.0.0.1:6379> linsert mylist3 before "world" "hello"
(integer) 2
redis 127.0.0.1:6379>lrange mylist3 0 -1
1) "hello"
2) "world"
Lset
設置list中指定下標的元素值
redis 127.0.0.1:6379> rpush mylist4 "hello"
(integer) 1
redis 127.0.0.1:6379> lset mylist4 0 "world"
ok
redis 127.0.0.1:6379> lrange mylist4 0 -1
1) "world"
lrem
從key對應list中刪除n個和value相同的元素 n<0 從尾刪除 n=0 全部刪除
redis 127.0.0.1:6379> rpush mylist5 "hello"
(integer) 1
redis 127.0.0.1:6379> rpush mylist5 "hello"
(integer) 2
redis 127.0.0.1:6379> lrem mylist5 1 "hello"
(integer) 1
ltrim
保留指定key的值范圍內的數據
redis 127.0.0.1:6379> rpush mylist8 "one"
(integer) 1
redis 127.0.0.1:6379> rpush mylist8 "two"
(integer) 2
redis 127.0.0.1:6379> ltrim mylist8 1 -1
(integer) 1
redis 127.0.0.1:6379> lrange mylist8 0 -1
1) "two"
lpop
從list的頭部刪除元素,并返回刪除元素
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
redis 127.0.0.1:6379> lpop mylist
"hello"
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "world"
rpop
從list的尾部刪除元素,并返回刪除元素
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
redis 127.0.0.1:6379> rpop mylist
"world"
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
rpoplpush
從第一個list的尾部移除元素并添加到第二個list的頭部
redis 127.0.0.1:6379> lrange mylist5 0 -1
1) "three"
2) "hello"
redis 127.0.0.1:6379> lrange mylist6 0 -1
1) "hello"
2) "foo"
redis 127.0.0.1:6379> rpoplpush mylist5 mylist6
"hello"
redis 127.0.0.1:6379> lrange mylist5 0 -1
1) "three"
redis 127.0.0.1:6379> lrange mylist6 0 -1
1) "hello"
2) "hello"
3) "foo"
lindex
返回名稱為key的list中index位置的元素
redis 127.0.0.1:6379> lrange mylist5 0 -1
1) "three"
2) "foo"
redis 127.0.0.1:6379> lindex mylist5 0
"three"
redis 127.0.0.1:6379> lindex mylist5 1
"foo"
llen
返回key對應list的長度
redis 127.0.0.1:6379> llen mylist5
(integer) 2
Sets類型
sets類型及操作
set是集合,它是string類型的無序集合
set是通過hash table實現的,
添加、刪除和查找的復雜度都是0(1)
對集合我們可以取交集、并集、差集
通過這些操作我們可以實現SNS中的好友推薦和blog的tag功能
sadd
向名稱為key的set中添加元素
redis 127.0.0.1:6379> sadd myset "hello"
(integer) 1
redis 127.0.0.1:6379> sadd myset "world"
(integer) 1
redis 127.0.0.1:6379> sadd myset "world"
(integer) 0
redis 127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
smembers
獲取名稱為key的set中所有元素
redis 127.0.0.1:6379> smembers myset
1) "hello"
1) "world"
srem
刪除名稱為key的set中的元素
redis 127.0.0.1:6379> sadd myset2 "one"
(integer) 1
redis 127.0.0.1:6379> sadd myset2 "two"
(integer) 1
redis 127.0.0.1:6379> srem myset2 "one"
(integer) 1
spop
隨機返回并刪除名稱為key的set中一個元素
redis 127.0.0.1:6379> sadd myset3 "one"
(integer) 1
redis 127.0.0.1:6379> sadd myset3 "two"
(integer) 1
redis 127.0.0.1:6379> spop myset3
"two"
sdiff
返回所有給定key與第一個key的差集
redis 127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
redis 127.0.0.1:6379> smembers myset3
1) "two"
2) "one"
redis 127.0.0.1:6379> sdiff myset2 myset3
1) "three"
sdiffstore
返回所有給定key與第一個key的差集,并將結果存為另一個key
redis 127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
redis 127.0.0.1:6379> smembers myset3
1) "two"
2) "one"
redis 127.0.0.1:6379> sdiffstore myset4 myset2 myset3
(integer) 1
redis 127.0.0.1:6379> smembers myset4
1) "three"
sinter
返回所有給定key的交集
redis 127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
redis 127.0.0.1:6379> smembers myset3
1) "two"
2) "one"
redis 127.0.0.1:6379> sinter myset2 myset3
1) "two"
sinterstore
返回所有給定key的交集,并將結果存為另一個key
redis 127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
redis 127.0.0.1:6379> smembers myset3
1) "two"
2) "one"
redis 127.0.0.1:6379> sinterstore myset4 myset2 myset3
(integer) 1
redis 127.0.0.1:6379> smembers myset4
1) "two"
sunion
返回所有給定key的并集
redis 127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
redis 127.0.0.1:6379> smembers myset3
1) "two"
2) "one"
redis 127.0.0.1:6379> sunion myset2 myset3
1) "three"
2) "one"
3) "two"
sunionstore
返回所有給定key的并集
redis 127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
redis 127.0.0.1:6379> smembers myset3
1) "two"
2) "one"
redis 127.0.0.1:6379> sunionstore myset 4 myset2 myset3
(integer) 3
redis 127.0.0.1:6379> smembers myset4
1) "three"
2) "one"
3) "two"
smove
從第一個key對應的set中移除member并添加到第二個對應的set中
redis 127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
redis 127.0.0.1:6379> smembers myset3
1) "three"
2) "one"
redis 127.0.0.1:6379> smove myset2 myset7 three
(integer) 1
redis 127.0.0.1:6379> smembers myset2
1) "two"
redis 127.0.0.1:6379> smembers myset7
1) "three"
scard
返回名稱為key的set的元素個數
redis 127.0.0.1:6379> scard myset2
(integer) 1
sismember
測試member是否是名稱為key的set的元素
redis 127.0.0.1:6379> smembers myset2
1) "two"
redis 127.0.0.1:6379> sismember myset2 two
(integer) 1
redis 127.0.0.1:6379> sismember myset2 one
(integer) 0
srandmember
隨機返回名稱為key的set的一個元素,但不刪除元素
redis 127.0.0.1:6379> smembers myset3
1) "two"
2) "one"
redis 127.0.0.1:6379> srandmember myset3
"two"
redis 127.0.0.1:6379> srandmember myset3
"one"
sorted sets 類型及操作
sorted set 是set的一個升級版本,它在set的基礎上增加了一個順序屬性
這一屬性在添加修改元素的時候可以指定
每次指定后,zset會自動重新按新的值調整順序
可以理解為有兩列的MySQL表,一列存value,一列存順序,操作中key理解為zset的名字
zadd
向名稱為key的zset中添加元素member,score用于排序,如果該元素存在,則更新其順序
redis 127.0.0.1:6379> zadd myzset 1 "one"
(integer) 1
redis 127.0.0.1:6379> zadd myzset 2 "two"
(integer) 1
redis 127.0.0.1:6379> zadd myzset 3 "two" // 添加未成功,但是順序號更新
(integer) 0
redis 127.0.0.1:6379> zrange myzset 0 -1 withscores // withscores 輸出順序號
1) "one"
2) "1"
3) "two"
4) "3"
zrem
刪除名稱為key的zset中的元素member
redis 127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "3"
redis 127.0.0.1:6379> zrem myzset two
(integer) 1
redis 127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "one"
2) "1"
zincrby
如果再名稱為key的zset中已經存在元素member,則該元素的score增加increment
否則向該集合中添加該元素,其score的值為increment
redis 127.0.0.1:6379> zadd myzset2 1 "one"
(integer) 1
redis 127.0.0.1:6379> zadd myzset2 2 "two"
(integer) 1
redis 127.0.0.1:6379> zincrby myzset2 2 "one"
"3"
redis 127.0.0.1:6379> zrange myzset2 0 -1 withscores
1) "two"
2) "2"
3) "one"
4) "3"
zrank
返回名稱為key的zset中member元素的排名(按score從小到大排序)即下標
redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "five"
8) "5"
redis 127.0.0.1:6379> zrank myzset3 two
(integer) 1
zrevrank
返回名稱為key的zset中member元素的排名(按score從大到小排序)即下標
redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "five"
8) "5"
redis 127.0.0.1:6379> zrevrank myzset3 two
(integer) 2
zrevrange
返回名稱為key的zset(按score從大到小順序)中的index從start到end的所有元素
redis 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores
1) "five"
2) "5"
3) "three"
4) "3"
5) "two"
6) "2"
7) "one"
8) "1"
zrangebyscore
返回集合中score在給定區間的元素
redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
redis 127.0.0.1:6379> zrangebyscore myzset3 2 3 withscores
1) "two"
2) "2"
3) "three"
4) "3"
zcount
返回集合中score在給定區間的數量
redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "five"
8) "5"
redis 127.0.0.1:6379> zcount myzset3 2 3
(integer) 2
zcard
返回所有元素個數
redis 127.0.0.1:6379> zcard myzset3
(integer) 4
zremrangebyrank
刪除集合中排名在給定區間的元素
redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
redis 127.0.0.1:6379> zremrangebyrank myzset3 1 1
(integer) 1
redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
1) "one"
2) "1"
zremrangebyscore
刪除集合中score在給定區間的元素
redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
redis 127.0.0.1:6379> zremrangebyscore myzset3 1 2
(integer) 2
redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
1) "three"
2) "3"
redis常用命令
1.鍵值相關命令
keys
返回滿足給定pattern的所有key
表達式 代表取出所有的key
redis 127.0.0.1:6379> keys
1) "myzset2"
2) "myzset3"
3) "mylist"
4) "myset2"
5) "myset3"
6) "myset4"
7) "k_zs_1"
exists
確認一個key是否存在 存在返回1 不存在返回0
redis 127.0.0.1:6379> exists name
(integer) 0
redis 127.0.0.1:6379> exists age
(integer) 1
del
刪除一個key
redis 127.0.0.1:6379> del age
(integer) 1
redis 127.0.0.1:6379> exists age
(integer) 0
expire
設置一個key的過期時間
在本例中,我們設置addr這個key的過期時間是10秒
然后我們不斷的用ttl來獲取這個key的有效時長,直至為-1
說明此值已過期
redis 127.0.0.1:6379> expire addr 10
(integer) 1
redis 127.0.0.1:6379> ttl addr
(integer) 8
redis 127.0.0.1:6379> ttl addr
(integer) 1
redis 127.0.0.1:6379> ttl addr
(integer) -1
move
將當前數據庫中的key轉移到其它數據庫中
數據庫有16個,從0-15
select 0 表示選擇第0個數據庫,默認的就是第0個數據庫
redis 127.0.0.1:6379> select 0
redis 127.0.0.1:6379> set age 20
redis 127.0.0.1:6379> get age
1) "20"
redis 127.0.0.1:6379> move age 1
redis 127.0.0.1:6379> get age
(nil)
redis 127.0.0.1:6379> select 1
redis 127.0.0.1:6379> get age
1) "20"
redis 127.0.0.1:6379> select 0
persist
移除給定key的過期時間 結果中的-1代表取消過期時間,而不是已經過期
redis 127.0.0.1:6379> expire age 300
(integer) 1
redis 127.0.0.1:6379> ttl age
(integer) 294
redis 127.0.0.1:6379> persist age
(integer) 1
redis 127.0.0.1:6379> ttl age
(integer) -1
randomkey
隨機返回key空間的一個key
redis 127.0.0.1:6379> randomkey
"mylist7"
redis 127.0.0.1:6379> randomkey
"mylist5"
rename
重命名key
redis 127.0.0.1:6379> keys
1) "age"
redis 127.0.0.1:6379> rename age age_new
OK
redis 127.0.0.1:6379> keys
1) "age_new"
type
返回值的類型
redis 127.0.0.1:6379> type addr
string
redis 127.0.0.1:6379> type myzset2
zset
redis 127.0.0.1:6379> type mylist
list
2.服務器相關命令
ping
測試連接是否存活
該案例 第一個ping時,說明此連接正常
第二個ping之前,將redis服務器停止,那么ping是失敗的
第三個ping之前,將redis服務器啟動,那么ping是成功的
redis 127.0.0.1:6379> ping
PONG
redis 127.0.0.1:6379> ping
Could not connect to Redis at 127.0.0.1:6379:Connect refused
not connected>ping
PONG
redis 127.0.0.1:6379>
echo
在命令行打印一些內容
redis 127.0.0.1:6379> echo lijie
"lijie"
select
選擇數據庫 redis數據庫編號從0-15
我們可以選擇任意一個數據庫來進行數據的存取
redis 127.0.0.1:6379> select 1
ok
redis 127.0.0.1:6379[1]> select 16
(error) ERR invalid DB index
redis 127.0.0.1:6379[16]>
當選擇16時,報錯,說明沒有編號為16的這個數據庫
quit
退出連接
redis 127.0.0.1:6379> quit
[root@localhost redis-2.2.12]#
dbsize
返回當前數據庫中key的數目
redis 127.0.0.1:6379> dbsize
(integer) 18
結果說明此庫中有18個key
info
獲取服務器的信息和統計
config get
實時傳儲收到的請求
redis 127.0.0.1:6379> config get addr
1) "dir"
2) "/root/4setup/redis-2.2.12"
本例中我們獲取了dir這個參數配置的值
如果想獲取全部參數的配置值,只需要執行 config get ,即可將全部的值都顯示出來
flushdb
刪除當前選擇數據庫中的所有key
redis 127.0.0.1:6379> dbsize
(integer) 18
redis 127.0.0.1:6379> flushdb
ok
redis 127.0.0.1:6379> dbsize
(integer) 0
在本例中我們將0號數據庫中的key都清除了
flushall
刪除所有數據庫中的所有key
在本例中先查看了一個1號數據庫中有一個key
然后切換到0號數據庫執行flushall命令
結果1號庫中的key也清除了
redis 127.0.0.1:6379[1]> dbsize
(integer) 1
redis 127.0.0.1:6379[1]> select 0
ok
redis 127.0.0.1:6379> flushall
ok
redis 127.0.0.1:6379> dbsize
(integer) 0
redis 127.0.0.1:6379> select 1
ok
redis 127.0.0.1:6379[1]> dbsize
(integer) 0
Redis 高級實用特性
1.安全性
設置客戶端連接后進行任何其他指定前需要使用的密碼
警告:因為redis速度相當快,所以在一臺比較好的服務器下,一個外部的用戶可以在一秒鐘進行150K次的密碼嘗試
這意味著你需要指定非常非常強大的密碼來防止暴力破解
修改密碼:
在redis-conf配置文件中修改
requirepass foobared
requirepass beijing
修改密碼后需要重啟redis
關閉redis
pkill redis-server
啟動一個客戶端
[root@localhost redis-2.2.12]# src/redis-cli
redis 127.0.0.1:6379> keys
(error) ERR operation not permitted
這里顯示權限被禁止,我們來設置一下權限
redis 127.0.0.1:6379> auth beijing
ok
redis 127.0.0.1:6379> keys
1) "name"
如果不想每次執行命令的時候都輸入授權信息
在登陸的時候就指定授權信息
[root@localhost redis-2.2.12]# src/redis-cli -a beijing
redis 127.0.0.1:6379> keys *
1) "name"
2.主從復制
Redis 主從復制配置和使用都非常簡單
通過主從復制可以允許多個slave server 擁有和 master server 相同的數據庫副本
Redis主從復制特點:
1)master可以擁有多個slave
2)多個slave可以連接同一個master外,還可以連接到其他slave
3)主從復制不會阻塞master,在同步數據時,master可以繼續處理client請求
4)提高系統的伸縮性
redis主從復制過程:
1)slave與master建立連接,發送sync同步命令
2)master會啟動一個后臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令并緩存
3)后臺完成保存后,就將此文件發送給slave
4)slave將此文件保存到硬盤上
配置主從服務器:
配置slave服務器很簡單,只需要在slave的配置文件中加入如下配置:
slaveof 192.168.1.1 6379 # 指定master的ip和端口
masterauth lamp # 這是主機的密碼
如何判斷哪個是master哪個是slave
只需要調用info就可以得到主從的信息
在從庫執行info
redis 127.0.0.1:6379> info
role:slave
master_host:localhost
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
db0:keys=1,expires=0
主服務器上執行info
role:master
3.事務處理
redis對事務的支持目前還比較簡單,redis只能保證一個client發起的事務中的命令可以連續的執行
而中間不會插入其他client的命令
當一個client在一個連接中發出multi命令時,這個連接會進入一個事務上下文
該連接后續的命令不會立即執行
而是先放到一個隊列中,當執行exec命令時,redis會順序的執行隊列中的所有命令
簡單事務處理
redis 127.0.0.1:6379> get age
"33"
redis 127.0.0.1:6379> multi
ok
redis 127.0.0.1:6379> set age 10
QUEUED
redis 127.0.0.1:6379> set age 20
QUEUED
redis 127.0.0.1:6379> exec
1) ok
2) ok
redis 127.0.0.1:6379> get age
"20"
如何取消一個事務
該案例可以發現這次2個 set age 命令都沒有被執行
discard命令其實就是清空事務的命令隊列并退出事務上下文
也就是我們常說的事務回滾
redis 127.0.0.1:6379> get age
"20"
redis 127.0.0.1:6379> multi
ok
redis 127.0.0.1:6379> set age 33
QUEUED
redis 127.0.0.1:6379> set age 10
QUEUED
redis 127.0.0.1:6379> discard
ok
redis 127.0.0.1:6379> get age
"20"
redis的事務,如果事務中某個命令出現錯誤不會回滾
樂觀鎖復雜事務控制
樂觀鎖:大多數是基于數據版本(version)的記錄機制實現的
即為數據增加一個版本標識,在基于數據庫表的版本解決方案中,
一般是通過為數據庫表增加一個version字段來實現讀取出數據時,
將此版本號一同讀出,之后更新時,對此版本號加1
此時,將提交數據的版本號與數據庫表對應記錄的當前版本號進行比對
如果提交的數據版本號大于數據庫當前版本號,則予以更新,否則認為是過期數據
redis樂觀鎖實例:
假設有一個age的key,我們開2個session來對age進行賦值操作,我們來看一下結果如何
(1) 第1步 session1
redis 127.0.0.1:6379> get age
"10"
redis 127.0.0.1:6379> watch age # 代表對age進行監控
ok
redis 127.0.0.1:6379> multi
ok
(2) 第2步 session2
redis 127.0.0.1:6379> set age 30
ok
redis 127.0.0.1:6379> get age
"30"
(3) 第3步 session1
redis 127.0.0.1:6379> set age 20
QUEUED
redis 127.0.0.1:6379> exec
(nil)
redis 127.0.0.1:6379> get age
"30"
watch命令會監視給定的key,當exec時候,如果監視的key從調用watch后發生過變化
則整個事務會失敗
也可以調用watch多次監視多個key,這樣就可以對指定的key加樂觀鎖了
注意:watch的key 是對整個連接有效的,事務也一樣
如果連接斷開,監視和事務都會被自動清除
當然了exec,discard,unwatch命令都會清除連接中的所有監視
事務回滾
redis的事務實現是如此簡單,當然會存在一些問題
第一個問題是redis只能保證事務的每個命令連續執行
但是如果事務中的一個命令失敗了,并不回滾其他命令
比如使用的命令類型不匹配
4.持久化機制
redis是一個支持持久化的內存數據庫,也就是說redis需要經常將內存中的數據同步到硬盤來保證持久化
redis支持2種持久化方式:
1)snapshotting(快照)也是默認方式
2)Append-only file (縮寫aof)的方式
Snapshotting方式
快照是默認的持久化方式
這種方式是將內存中數據以快照的方式寫入到二進制文件中
默認的文件名為dump.rdb
可以通過配置設置自動做快照持久化的方式
我們可以配置redis在n秒內如果超過m個key被修改就自動做快照
save 900 1 # 900秒內如果超過1個key被修改,則發起快照保存
save 300 10 # 300秒內如果超過10個key被修改,則發起快照保存
save 60 10000
aof方式
由于快照方式是在一定間隔時間做一次的,所以如果redis意外down掉的話,就會丟失最后一次快照后的所有修改
aof比快照方式有更好的持久化性,
是由于在使用aof時,redis會將每一個收到的寫命令都通過write函數追加到文件中
當redis重啟時會通過重新執行文件中保存的寫命令來在內存中重建整個數據庫的內容
當然,由于os會在內核中緩存write做的修改,
所以可能不是立即寫到磁盤上,這樣aof方式的持久化也還是有可能會丟失部分修改
可以通過配置文件告訴redis我們想要通過fsync函數強制os寫入到磁盤的時機
appendonly yes // 啟用aof持久化方式
appendfsync always // 收到寫命令就立即寫入磁盤,最慢,但是保證完全的持久化
appendfsync everysec // 每秒鐘寫入磁盤一次,在性能和持久化方面做了很好的折中
appendfsync no // 完全依賴os,性能最好,持久化沒保證
5.發布訂閱消息
發布訂閱(pub/sub)是一種消息通信模式,主要的目的是解除消息發布者和消息訂閱者之間的耦合
redis作為一個pub/sub的server,在訂閱者和發布者之間起到了消息路由的功能
訂閱者可以通過subscribe和psubscribe命令向redis server 訂閱自己感興趣的消息類型
redis將消息類型稱為通道(channel)
當發布者通過publish命令向redis server發送特定類型的信息時
訂閱該信息類型的全部client都會收到此消息
6.虛擬內存的使用
redis的虛擬內存與操作系統的虛擬內存不是一回事
但是思路和目的都是相同的
就是暫時把不經常訪問的數據從內存交換到磁盤中,從而騰出寶貴的內存空間用于其他需要訪問的數據
尤其是對于redis這樣的內存數據庫,內存總是不夠用的
除了可以將數據分割到多個redis server外
另外能夠提高數據庫容量的辦法就是使用虛擬內存把那些不經常訪問的數據交換到磁盤上
虛擬內存配置
下面是vm相關配置
vm-enabled yes # 開啟vm功能
really-use-vm yes
vm-swap-file /tmp/redis.swap # 交換出來的value保存的文件路徑
vm-max-memory 1000000 # redis使用的最大內存上線
vm-page-size 32 # 每個頁面的大小32字節
vm-pages 134217728 # 最多使用多少頁面
vm-max-threads 4 # 用于執行value對象換入緩存的工作線程數量
php支持redis
首先下載phpredis源碼包
解壓縮 tar zxvf phpredis.tar.gz
進入phpredis文件夾
給phpredis準備一個編譯環境
/usr/local/php/bin/phpize
如果出現錯誤:
編譯安裝
./configure --with-php-config=/usr/local/php/bin/php-config
make
/usr/local/php/include/php/Zend/../TSRM/TSRM.h:165:26: error: redefinition of pa rameter ‘tsrm_ls’
遇到這個錯誤
沒解決,好惆悵 :-(
make install
cd /usr/local/php//lib/php/extensions/no-debug-zts-20121212/
找到 redis.so
打開php.ini
加上
extension=redis.so
保存退出,重啟