-
什么是Redis:
-
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
-
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
-
-
Redis 简介:
-
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
-
Redis 与其他 key - value 缓存产品有以下三个特点:
-
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
-
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
-
Redis支持数据的备份,即master-slave模式的数据备份。
-
-
-
Redis 优势:
-
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
-
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
-
原子 – Redis的所有操作都是原子性(跟数据库事务一样原理)的,同时Redis还支持对几个操作全并后的原子性执行。
-
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
-
-
持久化存储方式:
-
RDB持久化:
-
描述:该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘(默认)
-
配置开启:save 900 1 | save 300 10 | save 60 10000
-
配置关闭:#save 900 1 | #save 300 10 | #save 60 10000
-
-
AOF持久化:
-
描述:该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。
-
配置开启:appendonly yes
-
配置关闭:appendonly no
-
-
-
后台监控并统计执行操作:
-
redis-cli monitor >mon.txt
-
cat mon.txt |awk '{print $4" "$5}'|sort|uniq -c|sort -nr|less
-
-
redis的应用:
-
string是有sds和整数对象构成,常用作缓存,计数器,用户共享session、限流、秒杀去库存、二进制数据
-
hash是有压缩列表和字典构成,常用作关系型数据库存储(存储对象)
-
list是由双端链表和压缩列表构成,常用作消息队列和数据分页(栈、队列)
-
set是由整数集合和字典构成,常用做共同好友,标签和独立IP、抽奖、随机取
-
zset是由跳跃表、字典和压缩链表构成,常用做排行榜、权重计算
-
哈希使用 - 实现代码:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->del('hash1');
$redis->hset('hash1', 'user1', 1);
$redis->hset('hash1', 'user2', 2);
$redis->hset('hash1', 'user3', 3);
// string(1) "1"
var_dump($redis->hGet('hash1', 'user1'));
// int(3)
var_dump($redis->hLen('hash1'));
// array(3) { ["user1"]=> string(1) "1" ["user2"]=> string(1) "2" ["user3"]=> string(1) "3" }
var_dump($redis->hGetAll('hash1'));
// array(3) { [0]=> string(5) "user1" [1]=> string(5) "user2" [2]=> string(5) "user3" }
var_dump($redis->hKeys('hash1'));
// array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" }
var_dump($redis->hVals('hash1'));
// int(1)
var_dump($redis->hDel('hash1', 'user1'));
// array(2) { ["user2"]=> string(1) "2" ["user3"]=> string(1) "3" }
var_dump($redis->hGetAll('hash1'));
$redis->hset('hash1', 'user1', 1);
// int(2)
var_dump($redis->hIncrBy('hash1', 'user1', 1));
// int(1)
var_dump($redis->hIncrBy('hash1', 'user2', -1));
// float(4.1)
var_dump($redis->hIncrByFloat('hash1', 'user3', 1.1));
// array(3) { ["user2"]=> string(1) "1" ["user3"]=> string(18) "4.1000000000000001" ["user1"]=> string(1) "2" }
var_dump($redis->hGetAll('hash1'));
// bool(true)
var_dump($redis->hMset('hash1', array('user4' => 4, 'user5' => 5, 'user6' => 6)));
// array(3) { ["user4"]=> string(1) "4" ["user5"]=> string(1) "5" ["user6"]=> string(1) "6" }
var_dump($redis->hMget('hash1', array('user4', 'user5', 'user6')));
key值使用 - 实现代码:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// bool(true) string(5) "value"
var_dump($redis->set('name', 'value')); var_dump($redis->get('name'));
// int(1) bool(false)
var_dump($redis->del('name')); var_dump($redis->get('name'));
// bool(false) int(0)
var_dump($redis->exists('name')); var_dump($redis->del('name'));
// bool(true)
$set_array = array('name1' => 'value1', 'name2' => 'value2', 'name3' => 'value3');
var_dump($redis->mset($set_array));
// array(2) { [0]=> string(6) "value1" [1]=> string(6) "value3" }
$get_array = array('name1', 'name3');
var_dump($redis->mget($get_array));
// int(2)
$del_array = array('name1', 'name3');
var_dump($redis->del($del_array));
// array(3) { [0]=> bool(false) [1]=> string(6) "value2" [2]=> bool(false) }
$get_array = array('name1', 'name2', 'name3');
var_dump($redis->mget($get_array));
$set_array = array('one' => 'value1', 'tow' => 'value2', 'three' => 'value3', 'four' => 'value4');
var_dump($redis->mset($set_array));
var_dump($get_array = $redis->keys('*o*'));
var_dump($redis->mget($get_array));
var_dump($get_array = $redis->keys('t??'));
var_dump($get_array = $redis->keys('t[w]*'));
var_dump($get_array = $redis->keys('*'));
var_dump($redis->randomkey());
var_dump($redis->flushDB());
var_dump($get_array = $redis->keys('*'));
var_dump($redis->set('name', 'value', 10)); var_dump($redis->get('name'));
var_dump($redis->ttl('name'));
var_dump($redis->ttl('name1'));
列表使用 - 实现代码:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// bool(true)
var_dump($redis->del('list1'));
// int(3)
var_dump($redis->lPush('list1', 'v1', 'v2', 'v3'));
// array(3) { [0]=> string(2) "v3" [1]=> string(2) "v2" [2]=> string(2) "v1" }
var_dump($redis->lRange('list1', 0, -1));
// int(4)
var_dump($redis->rPush('list1', 'v4'));
// string(2) "v3"
var_dump($redis->lPop('list1'));
// string(2) "v4"
var_dump($redis->rPop('list1'));
// bool(false)
var_dump($redis->blPop('list1'));
// bool(false)
var_dump($redis->brPop('list1'));
// int(2)
var_dump($redis->lLen('list1'));
// string(2) "v1"
var_dump($redis->lIndex('list1', 1));
// bool(true)
var_dump($redis->lSet('list1', 1, 'v11'));
// array(2) { [0]=> string(2) "v2" [1]=> string(3) "v11" }
var_dump($redis->lRange('list1', 0, -1));
// int(0)
var_dump($redis->lRem('list1', 'v1', 2));
// bool(true)
var_dump($redis->lTrim('list1', 0, 0));
有序集合 - 实现代码:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->del("zset1");
$time = time();
// int(1)
var_dump($redis->zAdd('zset1', $time, 'v0'));
// int(1)
var_dump($redis->zAdd('zset1', $time + 1, 'v1'));
// int(1)
var_dump($redis->zAdd('zset1', $time + 2, 'v2'));
// int(1)
var_dump($redis->zAdd('zset1', $time + 3, 'v3'));
// array(4) { [0]=> string(2) "v0" [1]=> string(2) "v1" [2]=> string(2) "v2" [3]=> string(2) "v3" }
var_dump($redis->zRange('zset1', 0, -1));
// int(2)
var_dump($redis->zRem('zset1', 'v1', 'v2'));
// array(2) { [0]=> string(2) "v0" [1]=> string(2) "v3" }
var_dump($redis->zRange('zset1', 0, $time + 10));
// int(3)
var_dump($redis->zAdd('zset1', $time + 4, 'v4', $time + 5, 'v5', $time + 6, 'v6'));
// array(5) { ["v6"]=> string(10) "1488277758" ["v5"]=> string(10) "1488277757" ["v4"]=> string(10) "1488277756" ["v3"]=> string(10) "1488277755" ["v0"]=> string(10) "1488277752" }
var_dump($redis->zRevRange('zset1', 0, $time + 10, true));
// int(5)
var_dump($redis->zCount('zset1', 0, $time + 10));
// int(5)
var_dump($redis->zRemRangeByScore('zset1', 0, $time + 10));
// int(2)
var_dump($redis->zAdd('zset1', 1, 'v1', 2, 'v2'));
// int(2)
var_dump($redis->zCard('zset1'));
// float(2)
var_dump($redis->zScore('zset1', 'v2'));
// float(2)
var_dump($redis->zIncrBy('zset1', 1, 'v1'));
// array(2) { ["v2"]=> string(1) "2" ["v1"]=> string(1) "2" }
var_dump($redis->zRevRange('zset1', 0, -1, true));
无序集合 - 实现代码:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->del('set1');
$redis->del('set2');
// int(3)
var_dump($redis->sAdd('set1', 'v1', 'v2', 'v3'));
// int(3)
var_dump($redis->sCard('set1'));
// int(2)
var_dump($redis->sAdd('set2', 'v1', 'v3'));
// array(1) { [0]=> string(2) "v2" }
var_dump($redis->sDiff('set1', 'set2'));
// int(1)
var_dump($redis->sDiffStore('diff', 'set1', 'set2'));
// array(1) { [0]=> string(2) "v2" }
var_dump($redis->sMembers('diff'));
var_dump($redis->sMembers('set1'));