redis的入门与应用
redis的入门与应用
第一章 课程简介
课程内容概要
- 第一部分 初识redis
- redis的概念
- redis的安装
- redis的五种数据类型
- 第二部分 操作redis
- PHP的redis扩展安装
- PHP操作redis的五种类型
什么是redis
- 首先,redis是远程的。它有客户端和服务端两个部分,客户端和服务端可以部署在不同的机器上,它们之间是通过redis自定义的协议进行传输和交互的。我们平时说的redis,通常是指的redis的服务端,只有在特殊的具体的错误定位的时候,我们才需要说redis的客户端出了什么什么问题。
- 其次,redis是基于内存的,它所有的数据和结构都是存储在内存中,所以这也就代表了redis所有的操作都是非常高速,性能远远优于硬盘数据操作。另一方面,正式因为他所有的数据跟结构都是存储在内存中,所以它也是一个比较吃内存的软件。
- 最后,redis是非关系型数据库,它的本质是一个数据库,用来存储数据的,但是它和MySQL是不同的,MySQL是关系型数据库而redis不是。关系型数据库在进行存储之前必须要定义好所谓的数据字典,后期的存储数据按照数据字典进行存储,而redis就不需要定义数据字典。
redis的应用场景
- 当做缓存来使用,如:当我们的系统接口速度比较慢的时候,我们可以将接口的某些数据缓存起来,当下次进行请求时就不需要再进行查询数据库操作,而是可以直接从redis中读取,这也是提升系统性能最常用的到方法之一。
- 其次是队列,redis中提供了一个list结构,这个结构集成了push和pop操作,redis保证了push和pop是原子性的。基于这个结构和原子性,我们就可以把redis当做队列来使用,使用push来插入队列元素,使用pop来弹出队列元素。
- 最后是数据存储,这个意思就是,我们可以直接将redis都当成数据存储来使用,所有的增删改查可以直接在redis中进行操作,不需要再借助MySQL来进行数据存储,我们可以这么做的基础是redis有非常完备的硬盘持久化的机制,它有两种持久化的机制,配合这两种持久化的机制,我们可以把我们的redis数据定期持久化到硬盘中。这样,我们就保证了redis中数据的完整性和安全性。
- 与memcached的区别
- memcached 的单个key 老版本 1M 新版本 2M 可以通过修改 memcached.h 修改 KEY_MAX_LENGTH 调整单个KEY的大小
- redis单个key 512M
- Memcached 是多线程 redis 是单线程
- Memcached 数据不能持久化 断电数据消失
- redis可以持久化 因为使用了 RDB和AOF机制
- memcached 不支持集群 但是支持 Memcached::addServers() 十台组合成1台使用
- redis支持集群 而且redis 支持库 0-15 16个库
- memcached 支持key=》value redis有多种数据类型
- redis 还可以做消息队列 比如聊天室 IM
第二章 redis的安装
redis的安装环境
-
安装环境
-
服务器环境:Linux环境 (本次使用 CentOS release 6.8 )
查看命令
cat /etc/redhat-release
-
redis 版本(3.2.9 http://download.redis.io/releases/)
-
预装软件(yum安装gcc和tcl)
gcc C语言的编译器,redis是基于C语言写的;tcl是一门语言,redis一些组件基于tcl。
-
redis服务器端安装
-
wget -c http://download.redis.io/releases/redis-3.2.9.tar.gz
-
tar -zxvf redis-3.2.9.tar.gz
-
mv redis-3.2.9 /usr/local/redis
-
cd /usr/local/redis/
-
make insatll
-
ls src/redis*
#查看刚刚生成的redis二进制文件用途 文件名称 redis-cli redis客户端 redis-server redis服务端 redis-benchmark redis 性能测试工具 redis-check-aof AOF修复工具 因为AOF Redis才能持久化存储 redis-check-rdb RDB检查工具 redis-sentinel 哨兵服务器 2.8以后才有的
-
which redis-server
#查看安装目录 -
启动redis
cd /usr/local/redis/src
./redis-server
./redis-server -v
查看版本号./redis-server /usr/local/redis/redis.conf
指定配置文件启动 以端口号区分redis服务器
-
配置开机启动。找到redis 提供的开机启动脚本/usr/local/redis/utils/redis_init_script
-
cd utils
-
cp redis_init_script redis_init_script_6379
#以端口号 区分redis服务器 -
修改redis 启动脚本
vim redis_init_script_6379
REDISPORT=6379 EXEC=/usr/local/redis/redis/src/redis-server CLIEXEC=/usr/local/redis/redis/src/redis-cli PIDFILE=/var/run/redis_${REDISPORT}.pid CONF="/usr/local/redis/redis/redis_${REDISPORT}.conf"
-
修改redis.conf
cd /usr/local/redis
cp redis.conf redis_6379.conf
vim redis_6379.conf
daemonize yes #以守护进程启动,后台启动
-
启动脚本
/usr/local/redis/utils/redis_init_script_6379 start
-
vim /etc/rc.local
写入加入开机启动脚本/usr/local/redis/utils/redis_init_script_6379 start
-
ps aux|grep redis-server
查看是否已经启动
redis客户端的安装
redis-cli
端口6379,直接就可以连接了,如果配置文件中改了默认的端口,则redis-cli -h 127.0.0.1 -p 端口号
,可以使用info
命令来查看redis-server的当前状态。
第三章 redis数据类型介绍
3-1 redis的五种数据类型
数据类型 | 存储的值 | 读写能力 |
---|---|---|
String | 可以是字符串、整数或浮点,统称为元素 | |
List | 一个序列集合且每个节点都包好了一个元素(一个有序的列表) | 序列两端推入或弹出,修剪、查找或移除元素 |
Set | 各不相同的唯一的元素 | 从集合中插入或删除元素 |
Hash | 有key-value的散列组,其中key是字符串,value是元素 | 按照key进行增加删除 |
Sort Set | 带分数的score-value有序集合,其中score为浮点,value为元素 | 集合插入,按照分数范围查找 |
3-2 string类型操作
key ----> value(string/int/float)
- 设置值
set string1 aaa
- 读取值
get string1
; set string2 4
- 自增
incr string2
- 自减
decrby string2 2
3-3 list类型操作
-
一个有序的列表
key ------> value(1) 左
value(2)
value(3) 右
-
操作
-
lpush list1 12
--->lpush list1 13
--->rpop list1
-
list 不要求集合中的元素是唯一的
lpush list2 12
--->lpush list2 13
--->lpush list2 13
--->查看集合长度llen list2
-
3-4 set类型操作
-
set提供了无序的方式来存储多个不同的元素,每个元素的值都不一样,用户可以快速的对元素中的值进行添加和删除,以及检查某个元素是否在这个集合中
key ------>value(1)
value(2)
value(3)
-
操作
- 插入
sadd set1 12
--->查看集合中有多少元素scard set1
--->sadd set1 13
--->sadd set1 13
--->scard set1
结果是2--->判断13是否在set1中sismember set 13
返回0或1 --->删除13srem set1 13
- 插入
3-5 hash 类型操作
-
hash类型也叫作散列类型,用户可以将多个键值对存储到redis一个键里面
key------> key1 value(string/int/float)
key2 value(string/int/float)
key3 value(string/int/float)
key4 value(string/int/float)
-
操作
hset hash1 key1 12
--->hget hash1 key1
--->hset hash1 key2 13
--->hset hash1 key3 13
--->hlen hash1
- 修改值
hset hash1 key3 14
- 一次性获取多值
hmget hash1 key1 key2
3-6 sort set 类型操作
-
又叫有序分数集,和hash很类似,存储的也是一个映射,它的映射是分数和元素的映射,它的分数是浮点型的,值(成员)唯一
key ------> score(10.1) value(string/int/float) rank:1
score(9.1) value(string/int/float) rank:0
score(11.2) value(string/int/float) rank:2
-
操作
zadd zset 10.1 val1
--->zadd zset 11.2 val2
--->zadd zset 9.2 val3
--->查看有多少成员zcard zset1
--->按照分数排序zrange zset1 0 2 withscores
--->查看某个值(成员)的排名zrank zset val2
- 修改成员分数
zadd zset1 12.2 val3
--->zadd zset1 12.2 val2
--->zrange zset1 0 2 withscores
如果成员的分数score值一样的话按照这两个成员的字典顺序排序。
第四章 PHP的redis扩展安装
4-1 PHP redis扩展安装环境
php -m
可以看安装了那些扩展
4-2 PHP redis扩展安装
-
git clone -b php7 https://github.com/phpredis/phpredis.git
-
cd phpredis
-
/usr/local/php7/bin/phpize
-
./configure --with-php-config=/usr/local/php7/bin/php-config
-
make && make install
-
vim /usr/local/php7/etc/php.ini
extension_dir="/usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012/" extension=redis.so
-
service php-fpm restart
第五章 PHP操作redis
5-1 redis的链接操作
-
说明:
- 文档地址:https://github.com/phpredis/phpredis
- Redis类的命名空间是根,使用时加\
- phpredis的命令和参数基本和redis.io中的实际命令对应
-
链接
<?php // phpinfo(); $redis = new Redis(); $redis->connect('127.0.0.1', 6379);
5-2 string类型操作
-
string 类型经常用在缓存JSON的结构上,因为JSON序列化完后就是一个字符串
<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //string 操作 $redis->delete('string1'); $redis->set('string1','val1'); $val = $redis->get('string1'); var_dump($val); //val1 $redis->set('string1',4); $redis->incr('string1',2); $val = $redis->get('string1'); var_dump($val); //6
5-3 list类型操作(订单)
-
队列,先进先出
<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //list 操作 $redis->delete('list1'); $redis->lpush('list1','A'); $redis->lpush('list1','B'); $redis->lpush('list1','C'); $val = $redis->rPop('list1'); var_dump($val); //A
5-4 set类型操作
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
//set 操作
$redis->delete('set1');
$redis->sAdd('set1', 'A');
$redis->sAdd('set1', 'B');
$redis->sAdd('set1', 'C');
$redis->sAdd('set1', 'C');
$val = $redis->sCard('set1');
var_dump($val); //3
$val = $redis->sMembers('set1');
var_dump($val);//array
5-5 hash类型操作(可用于存储复杂数据结构)
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
//set 操作
$redis->delete('driver1');
$redis->hset('driver1', 'name', 'xiaoming');
$redis->hset('driver1', 'age', '25');
$redis->hset('driver1', 'sex', 'boy');
$val = $redis->hGet('driver1', 'name');
var_dump($val);
$val = $redis->hMGet('driver1', array('name', 'age'));
var_dump($val); //array
5-6 sort set类型操作(常用于排行榜)
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
//set 操作
$redis->delete('zset1');
$redis->zAdd('zset1', 100, 'xiaoming'); //rank:2
$redis->zAdd('zset1', 90, 'xiaohong'); //rank:0
$redis->zAdd('zset1', 93, 'xiaowang'); //rank:1
$val = $redis->zRange('zset1', 0, -1); //从第0个开始,展示所有,从低到高
var_dump($val);
$val = $redis->zRevRange('zset1', 0, -1); //从高到低
var_dump($val);