第一章 简介
Redis 是一个高性能的key-value数据库。和Memcached类似,它支持存储的value类型相对更多。
历史:Redis是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。VMware 公司从2010年开始赞助Redis的开发。作者 Salvatore Sanfilippo(塞尔瓦托) 和 pieter noordhuis (彼得)也分别从3月、5月加入VMware 全职开发 Redis。
Redis有三个主要特点,使它优越于其它键值数据存储系统
- Redis将其数据库完全保存在内存中,使用磁盘进行持久化。
- 与其它键值数据存储相比,Redis有一组相对丰富的数据类型。
- Redis可以将数据复制到任意数量的从机中。
Redis官方网网站是:http://www.redis.io
Redis的特性
-
存储结构 - Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题。
-
内存与持久化
- Redis数据库中所有数据都存储在内存中,固然Redis读写速度非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。
- 对于内存中数据易丢失问题,Redis 提供了对持久化的支持,即将内存中数据异步写入到硬盘中,同时不影响继续提供服务。
-
功能丰富 - Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等。
-
简单稳定 - Redis 中使用命令来读写数据,就相当于SQL语句。Redis 提供了几十种不同的编程语言客户端库,这些库很好地封装了Redis命令,使得在程序中Redis进行交互变得更容易。
举个例子:获取 posts 表内 id 为 1 的记录的title字段。
## SQL
SELECT title FROM posts WHERE id = 1 LIMIT 1
## Redis
HEGET post:1 title
注解:HGET 就是一个命令,Redis 提供了100多个命令,但是常用的却只有十几个。
Redis 命令文档:http://www.redis.cn/commands.html
第二章 准备与安装
安装环境准备
## 查看系统版本
cat /etc/redhat-release
## 安装编译工具
gcc tcl
Redis 安装
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
cd redis-3.2.8
## 编译
make
## 安装-可执行程序会被复制到/usr/local/bin 目录
make install
文件名 | 说明 |
---|---|
redis-server | Redis 服务器 |
redis-cli | Redis 命令行客户端 |
redis-benchmark | Redis 性能测试工具 |
redis-check-aof | AOF 文件修复工具 |
redis-check-rdb | RDB 文件检测工具 |
查看 redis 安装位置
which redis-server
which redis-cli
启动和停止
启动 Redis 服务
redis-server --help
## 直接启动
redis-server
## 自定义端口号
redis-server --port 6380
启动 Redis 客户端
redis-cli --help
redis-cli -h 127.0.0.1 -p 6379
## 查询服务信息
127.0.0.1:6379> info
# Server
redis_version:3.2.8
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:d0f77cfbe45511d0
第三章 入门
Redis数据类型
字符串-string
127.0.0.1:6379> set str bing
OK
127.0.0.1:6379> get str
"bing"
127.0.0.1:6379> del str
(integer) 1
127.0.0.1:6379> get str
(nil)
## 递增与递减操作
127.0.0.1:6379> set num 7
OK
127.0.0.1:6379> decr num
(integer) 6
127.0.0.1:6379> incr num
(integer) 7
127.0.0.1:6379> incrby num 2
(integer) 9
官方命令:https://redis.io/commands#string
列表-list
Redis列表只是字符串列表,按插入顺序排序。可以在列表的头部或尾部添加Redis列表中的元素。队列:先进先出
redis 127.0.0.1:6379> lpush alist redis
(integer) 1
redis 127.0.0.1:6379> lpush alist mongodb
(integer) 2
redis 127.0.0.1:6379> lpush alist sqlite
(integer) 3
集合-set型
Redis集合是唯一字符串的无序集合。 唯一值表示集合中不允许键中有重复的数据。
127.0.0.1:6379> sadd teacher bing
(integer) 1
127.0.0.1:6379> sadd teacher lau
(integer) 1
127.0.0.1:6379> sadd teacher bing
(integer) 0
127.0.0.1:6379> scard teacher
(integer) 3
127.0.0.1:6379> smembers teacher
1) "bin"
2) "bing"
127.0.0.1:6379> sismember teacher bing
(integer) 1
127.0.0.1:6379> srem teacher bing
(integer) 1
127.0.0.1:6379> sismember teacher bing
(integer) 0
注意 - 在上面的示例中,bing被添加了两次,但是由于集合的唯一属性,所以它只算添加一次。
- sadd - 添加一个或多个指定的元素到某集合中。
- scard - 返回某集合元素的数量。
- smembers - 查看某个集合所有数据
- sismember - 判断某个值是否存在与某集合(存在:1;不存在:0)。
- srem - 在某集合中移除指定的元素
- SINTER key1 [key2] - 相交多个集合
- SDIFF key1 [key2] - 减去多个集合
哈希/散列-hash
理解:哈希/散列型,是将多个键值对存储到一个键里面。
127.0.0.1:6379> hset info name braem
(integer) 1
127.0.0.1:6379> hset info user braem
(integer) 1
127.0.0.1:6379> hset info age 18
(integer) 1
127.0.0.1:6379> hget info user
"braem"
127.0.0.1:6379> hmget info name user age
1) "braem"
2) "braem"
3) "18"
127.0.0.1:6379> hlen info
(integer) 3
127.0.0.1:6379> hset info name bing
(integer) 0
127.0.0.1:6379> hmget info name user age
1) "bing"
2) "braem"
3) "18"
- hset 设置 key 指定的哈希集中指定字段的值。
- 如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。
- 如果字段在哈希集中存在,它将被重写。
- hget - 返回 key 指定的哈希集中该字段所关联的值
- hlen - 返回 key 指定的哈希集包含的字段的数量。
- hmget - 返回 key 指定的哈希集中指定字段的值。
- 其他命令 http://www.redis.cn/commands/hset.html
可排序集合-sorted set
Redis可排序集合类似于Redis集合,是不重复的字符集合。
不同之处在于,排序集合的每个成员都与分数相关联,这个分数用于按最小分数到最大分数来排序的排序集合。
127.0.0.1:6379> zadd score 100 xming
(integer) 1
127.0.0.1:6379> zadd score 90 xhong
(integer) 1
127.0.0.1:6379> zadd score 59.9 xhei
(integer) 1
127.0.0.1:6379> zcard score
(integer) 3
127.0.0.1:6379> zrange score 0 5 withscores
1) "xhei"
2) "59.899999999999999"
3) "xhong"
4) "90"
5) "xming"
6) "100"
127.0.0.1:6379> zrevrange score 0 5 withscores
...
127.0.0.1:6379> zrevrank score xming
...
...
注意:某个有序集中成员是唯一的,但分数值可以重复。
- zadd - 将所有指定成员添加到键为key有序集合(sorted set)里面。
- zcard - 返回某个有序集元素个数。
- zrank - 获得成员按score值递增(从小到大)排列的排名
- zrange - 返回有序集key中,指定区间内的成员。其中成员的位置按score值递减(从小到大)来排列
- zrevrange - 与 zrange 排序相反。
- zrevrank - 获得成员按score值递增(从大到小)排列的排名
- 其他 http://www.redis.cn/commands/zadd.html
PHP 操作 Redis
Window 下安装Redis扩展
下载地址:https://pecl.php.net/package/redis/3.1.2/windows
一步、两步;一步、两步。
Linux 下编译Redis扩展
cd /usr/local/src/
wget https://pecl.php.net/get/redis-3.1.2.tgz
tar zxvf redis-3.1.2.tgz
cd redis-3.1.2
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/
将编译出的扩展文件 redis.so,添加至 php.ini
vim /usr/local/php7/lib/php.ini
重启php-fpm
,再打印phpinfo
中搜索 Redis
,看到如下那么恭喜您已经完成PHP与Redis整合:
连接到 redis 服务
文档地址:https://github.com/phpredis/phpredis#class-redis
//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
//查看服务是否运行
echo "Server is running: " . $redis->ping();
string-字符串
## set
$redis->set("str", "this is string");
## get
$redis->get("str");
## exists
$redis->exists('key'); /* TRUE OR FALSE*/
## incr, incrBy
$redis->incr('key1'); /* key1 didn't exists, set to 0 before the increment */
/* and now has the value 1 */
$redis->incr('key1'); /* 2 */
$redis->incrBy('key1', 10); /* 12 */
## incrByFloat
$redis->incrByFloat('key1', 1.5); /* key1 didn't exist, so it will now be 1.5 */
$redis->incrByFloat('key1', 1.5); /* 3 */
$redis->incrByFloat('key1', -1.5); /* 1.5 */
## decr, decrBy
$redis->decr('key1'); /* key1 didn't exists, set to 0 before the increment */
/* and now has the value -1 */
$redis->decr('key1'); /* -2 */
$redis->decrBy('key1', 10); /* -12 */
## delete
$redis->delete('key1', 'key2'); /* return 2 */
$redis->delete(array('key3', 'key4')); /* return 2 */
实用手册:https://github.com/phpredis/phpredis#keys
中文手册:http://www.runoob.com/redis/redis-strings.html
list-队列
- lLen, lSize - Get the length/size of a list
- lPop - Remove and get the first element in a list
- lPush - Prepend one or multiple values to a list
- lSet - Set the value of an element in a list by its index
- ......
https://github.com/phpredis/phpredis#lists
$redis->lPush('alist','A');
$redis->lPush('alist','B');
$redis->lPush('alist','C');
echo $redis->rPop('alist'); /* return A */
$redis->rPush('blist','A');
$redis->rPush('blist','B');
$redis->rPush('blist','C');
echo $redis->lPop('blist'); /* return A */
set-集合
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
- sAdd - Add one or more members to a set
- sCard, sSize - Get the number of members in a set
- sIsMember, sContains - Determine if a given value is a member of a set
- sMembers, sGetMembers - Get all the members in a set
更多参考: https://github.com/phpredis/phpredis#sets
## sAdd
$redis->sAdd('key1' , 'member1');
$redis->sAdd('key1' , 'member2');
$redis->sAdd('key1' , 'member2');
$redis->sAdd('key1' , 'member3'); /* 'key1' => {'member1', 'member2', 'member3'}*/
## sCard
$redis->sCard('key1'); /* 3 */
$redis->sCard('keyX'); /* 0 */
## sIsMember
$redis->sIsMember('key1', 'member1'); /* TRUE */
$redis->sIsMember('key1', 'memberX'); /* FALSE */
## sMembers
var_dump($redis->sMembers('key1'));
array (size=3)
0 => string 'member2' (length=7)
1 => string 'member1' (length=7)
2 => string 'member3' (length=7)
hash-哈希
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
- hGet - Get the value of a hash field
- hGetAll - Get all the fields and values in a hash
- hKeys - Get all the fields in a hash
- hLen - Get the number of fields in a hash
- hMGet - Get the values of all the given hash fields
- hMSet - Set multiple hash fields to multiple values
- hSet - Set the string value of a hash field
- ......
更多参考:https://github.com/phpredis/phpredis#hashes
$redis->delete('info');
$redis->hSet('info','name','bing');
$redis->hSet('info','age',18);
$redis->hSet('info','sex','男');
$redis->hGet('info','name'); /* bing */
var_dump($redis->hMGet('info',['name','age']));
array (size=2)
'name' => string 'bing' (length=4)
'age' => string '18' (length=2)
var_dump($redis->hGetAll('info'));
array (size=3)
'name' => string 'bing' (length=4)
'age' => string '18' (length=2)
'sex' => string '男' (length=3)
sorted-sets-有序集合
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
- zAdd - Add one or more members to a sorted set or update its score if it already exists
- zCard, zSize - Get the number of members in a sorted set
- zRange - Return a range of members in a sorted set, by index
- zRank, zRevRank - Determine the index of a member in a sorted set
- zRevRange - Return a range of members in a sorted set, by index, with scores ordered from high to low
更多参考:https://github.com/phpredis/phpredis#sorted-sets
$redis->zAdd('score',100,'老刘');
$redis->zAdd('score',90,'小明');
$redis->zAdd('score',59.9,'BING');
var_dump($redis->zSize('score'));
var_dump($redis->zCard('score'));
var_dump($redis->zCount('score',90,100));
var_dump($redis->zRange('score',0,-1));
var_dump($redis->zRange('score',0,-1,true));
echo $redis->zRank('score','BING');
echo '<hr>';
echo $redis->zRevRank('score','BING');