1. 程式人生 > >Redis使用與實踐

Redis使用與實踐

特點

1.遠端 2.基於記憶體 3.非關係型資料庫

優點

1.支援豐富的資料型別:String,List,Set,Sorted Set,Hash等 2.支援兩種資料持久化方式:Snapshotting(記憶體快照)和Append-Only file(日誌追加) 3.支援主從複製

應用場景

1.快取 2.佇列–使用list結構 3.資料儲存

桌面管理工具

資料型別 儲存的值 讀寫能力
String 可以是字串,整數或浮點,統稱為元素 對字串操作,對整數型別加減
List 一個序列集合且每個節點都包好了一個元素 序列兩端推入或彈出元素 修剪,查詢或移除元素
Set 各個不同的元素 從集合中插入或刪除元素
Hash 有key-value的雜湊組,其中key是字串,value是元素 按照key進行增加刪除
Sort Set 帶分數的score-value有序集合,其中score是浮點,value為元素 集合插入,按照分數範圍查詢
  • string型別
127.0.0.1:6379> set string1 demo
OK
127.0.0.1:6379> get string1
"demo"
127.0.0.1:6379> set string2 4
OK
127.0.0.1:6379> get string2
"4" 
127.0.0.1:6379> incr string2 #對整型進行自增操作
(integer) 5
127.0.0.1:6379> get string2
"5"
127.0.0.1:6379> decrby string2 2 #對整型進行減法操作,將string2減去2
(integer) 3
127.0.0.1:6379> get string2
"3"
  • List型別
127.0.0.1:6379> lpush list1 12 #lpush表示從左邊push一個元素到list1中,l表示left
(integer) 1
127.0.0.1:6379> lpush list1 13
(interger) 2
127.0.0.1:6379> rpop list1  #rpop表示從右側pop出一個元素,按照先入先出的原則
“12”
127.0.0.1:6379> lpush list2 12
(integer) 1
127.0.0.1:6379> lpush list2 13
(integer) 2
127.0.0.1:6379> lpush list2 13 #list型別不要求集合中的元素唯一,所以可以插入相同的元素,而set型別要求集合中元素必須唯一
(integer) 3
127.0.0.1:6379> llen list2 #llen命令列出list2中元素的個數
(integer) 3
  • Set型別
127.0.0.1:6379> sadd set1 12
(integer) 1
127.0.0.1:6379> scard set1 #用scard檢視set1中的元素個數
(integer) 1
127.0.0.1:6379> sadd set1 13
(integer) 1
127.0.0.1:6379> sadd set1 13
(integer) 0
127.0.0.1:6379> scard set1
(integer) 2
127.0.0.1:6379> sismember set1 13 #sismember 命令判斷13是否在set1中
(integer) 1
127.0.0.1:6379> srem set1 13  #srem命令將13從set1中刪除
(integer) 1
127.0.0.1:6379> sismember set1 13 
(integer) 0
  • Hash型別
127.0.0.1:6379> hset hash1 key1 12 #hset命令設定hash1的鍵為key1,值為12
(integer) 1
127.0.0.1:6379>  hget hash1 key1 #hget命令獲取hash1鍵名為key1的值
"12"
127.0.0.1:6379> hset hash1 key2 13
(integer) 1
127.0.0.1:6379> hset hash1 key3 13
(integer) 1
127.0.0.1:6379> hlen hash1 #hlen命令獲取hash1的長度
(integer) 3
127.0.0.1:6379> hset hash1 key3 14 #直接修改hash1中key3的值
(integer) 0
127.0.0.1:6379>  hget hash1 key3
"14"
127.0.0.1:6379>  hmget hash1 key1 key2  #hmget 命令一次獲取多個key的值
1) "12"
2) "13"
  • Sort Set型別
127.0.0.1:6379> zadd zset1 10.1 val1  #zadd命令往zset1中新增一個元素,score為10.1,value為val1
(integer) 1
127.0.0.1:6379> zadd zset1 11.2 val2
(integer) 1
127.0.0.1:6379> zadd zset1 9.1 val3
(integer) 1
127.0.0.1:6379> zcard zset1  #zcard 命令檢視zset1中的元素值
(integer) 3
127.0.0.1:6379> zrange zset1 0 2 withscores #zrange 命令打印出排名
1) "val3"
2) "9.1"
3) "val1"
4) "10.1"
5) "val2"
6) "11.19999999"
127.0.0.1:6379> zrange zset1 val2 #打印出val2的排名
(integer) 2
127.0.0.1:6379> zadd zset1 12.2 val3
(integer) 0
127.0.0.1:6379> zrange zset1 0 2 withscores
1) "val1"
2) "10.1"
3) "val2"
4) "11.19999999"
5) "val3"
6) "12.19999999"
127.0.0.1:6379> zadd zset1 12.2 val2
(integer) 0
127.0.0.1:6379> zrange zset1 0 2 withscores
1) "val1"
2) "10.1"
3) "val2"
4) "12.19999999"
5) "val3"
6) "12.19999999"

伺服器相關命令

// 1. ping 測試連線是否存活
redis 127.0.0.1:6379> ping
PONG
// 2. echo 在命令列列印一些內容
redis 127.0.0.1:6379> echo Helloworld
"Helloworld"
// 3. 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]>
// 4. quit 退出連線
redis 127.0.0.1:6379> quit
[[email protected] redis-2.2.12]#
// 5.  dbsize 返回當前資料庫中 key 的數目
redis 127.0.0.1:6379> dbsize
(integer) 18
redis 127.0.0.1:6379>
// 6.  info 獲取伺服器的資訊和統計
redis 127.0.0.1:6379> info
# Server
redis_version:3.2.100
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:dd26f1f93c5130ee
redis_mode:standalone
os:Windows
arch_bits:64
multiplexing_api:WinSock_IOCP
process_id:2528
.
.
redis 127.0.0.1:6379>
// 7. config get  獲取伺服器配置資訊, config get * 表示獲取全部
redis 127.0.0.1:6379> config get dir
1) "dir"
2) "/root/4setup/redis-3.2.100"
redis 127.0.0.1:6379>
// 8. 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
// 9. flushall 刪除所有資料庫中的所有 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> select 1
OK
redis 127.0.0.1:6379[1]> dbsize
(integer) 0
redis 127.0.0.1:6379[1]>

PHP操作Redis

//普通set/get操作
$redis->set('library', 'predis');
$retval = $redis->get('library');
echo $retval; //顯示 'predis'
 echo "<hr/>";
//setex set一個儲存時效
$redis->setex('str', 10, 'bar'); //表示儲存有效期為10秒
echo $redis->get('str');

//setnx/msetnx相當於add操作,不會覆蓋已有值
var_dump($redis->setnx('foo',12)); //true
var_dump($redis->setnx('foo',34)); //foo已經存在,無法覆蓋,所以返回false

//getset操作,set的變種,結果返回替換前的值
echo $redis->getset('foo',56);//返回12
echo $redis->get('foo');//返回56
echo "<hr/>";

// incrby/incr/decrby/decr 對值的遞增和遞減
echo $redis->incr('foo'); //foo為57
echo $redis->incrby('foo',2); //foo為59
echo "<hr/>";

//exists檢測是否存在某值
var_dump($redis->exists('foo'));//true
//del 刪除
var_dump($redis->del('foo'));//true
echo $redis->get('foo');//空

//type 型別檢測,字串返回string,列表返回 list,set表返回set/zset,hash表返回hash
var_dump($redis->type('foo'));//不存在,返回0

$redis->set('str','test');
//append 連線到已存在字串
$redis->append('str','_123'); //返回累加後的字串長度8,此進str為 'test_123'
echo $redis->get('str'); //test_123
echo "<hr/>";

//substr 部分獲取操作
echo $redis->substr('str',0,2);//表示從第0個起,取到第2個字元,共3個,返回'tes'

//strlen 獲取字串長度
echo $redis->strlen('str'); //str為test_123,字元長度為8


//setbit/getbit 位儲存和獲取
echo $redis->setbit('binary',31,1); //表示在第31位存入1,這邊可能會有大小端問題?不過沒關係,getbit 應該不會有問題
echo $redis->getbit('binary',31); //返回1

//keys 模糊查詢功能,支援*號以及?號(匹配一個字元)
$redis->set('foo1',123);
$redis->set('foo2',456);
print_r($redis->keys('foo*')); //返回Array ( [0] => foo1 [1] => foo2 ) 
print_r($redis->keys('f?o?')); //同上Array ( [0] => foo1 [1] => foo2 ) 

//randomkey 隨機返回一個key
echo $redis->randomkey(); //可能是返回 'foo1'或者是'foo2'及其它任何一存在redis的key

//rename/renamenx 對key進行改名,所不同的是renamenx不允許改成已存在的key
$redis->rename('str','str2'); //把原先命名為'str'的key改成了'str2'

//expire 設定key-value的時效性,ttl 獲取剩餘有效期,persist 重新設定為永久儲存
$redis->expire('foo', 1); //設定有效期為1秒
$redis->ttl('foo'); //返回有效期值1s
echo "<br>";
//dbsize 返回redis當前資料庫的記錄總數
echo $redis->dbsize();