Redis概述
1.1、Redis介绍
redis是一款基于内存的缓存系统或者数据库。支持持久化。
redis支持的数据类型比较多:字符串、链表、哈希、无序集合、有序集合。
1.2、Redis与Memcache的区别
1)、memcache在服务器重启时数据会丢失,不支持技术化;redis支持持久化,当服务器重启时,会自动将数据还原到内存当中,这样数据就不会丢失。
2)、memcache键名最大长度为250个字符;redis键名长度没有限制,但是键名的长度是越短越好,做到见其名知其意。
3)、memcache每个键值存储的单位最大为1M;redis的键值存储的最大单位为512M,但是单个键值超过2M会影响redis性能。
4)、memcache只支持字符串类型;redis支持的存储类型比较多,字符串、链表、哈希、无序集合、有序集合。
5)、memcache支持多线程工作,在多核CPU下可以发挥特性;redis只支持一个CPU对其进行操作,不支持多个CPU同时操作同一个redis。
1.3、Redis安装
1.3.1、Windows版本安装
第一步:解压资料里的Redis-x64-2.8.2103-.rar文档,并且复制到e:\php\,如图:
第二步:
运行redis服务端:
此时,会占用一个窗口,很不方便。在此安装为服务来运行。使用ctrl+c来停止 运行。
第三步:安装redis为服务:
启动redis服务:
1.3.2、Linux版本的安装
第一步:将资料里的redis-2.8.24.tar.gz压缩包上传到/root/data目录下并解压redis:
如图:
第二步:编译和安装redis:
编译和安装成功,如图:
第三步:
将编译安装好的redis文件复制到/usr/local/redis目录中:
此时,redis目录下的文件可以复制到其它相同环境下的linux当中。
第四步:启动redis服务端:
此运行方式会占用一个窗口,不方便使用,可以让redis在后台运行。
可以使用ctrl+c停止运行。
第五步:让redis在后台运行:
修改redis配置文件:如图:
修改内容如下:
运行:如图:
第六步:使用redis客户端来连接redis:
此时,redis已经运行成功。
redis中的数据类型(重点)
2.1、关于key的操作(公共命令)
①exists:检查键名是否存在
格式:exists 键名
②del:删除键名
格式:del 键名
③type:检查键名的类型
格式:type 键名
④keys:查看键名
格式:keys 键名
⑤rename:将键名改名
格式:rename 旧键名 新键名
查看:如图:
⑥expire:设置键名的有效期:
格式:expire 键名 有效期
⑦expireAt:设置键名的有效期:设置键名到什么时候失效
格式:expireAt 键名 到什么时候失效(时间戳)
得到时间戳:
当时间过期后,此键名会失效:如图:
⑧ttl:查看键名还剩余的有效期
格式:ttl 键名
2.2、string数据类型
2.2.1、字符串类型介绍
最基本的数据类型。
2.2.2、字符串操作常用命令
①set key1:设置一个键名
格式:set 键名 键值
②get key1:获取键名的值
格式:get 键名
③mset key1 v1 key2 v2:设置多个键值对
格式:mset 键名1 键值1 键名2 键值2
④mget key1 key2:获取多个键名
格式:mget 键名1 键名2
⑤strlen key1:获取键值的长度
格式:strlen 键名
⑥incr key1:自增(注意:自增的值为1)
格式:incr 键名
⑦decr key1:自减
格式:decr 键名
⑧incrby key1 num:根据增量来增加键名的值
格式:incrby 键名 增量
⑨decrby key1 num:根据num来减少键名的值
格式:decrby 键名 数量
⑩append key1 value2:将value2追加到key1的值
格式:append 键名 值
2.3、链表(List)数据类型
2.3.1、链表类型介绍
轻松地实现最新消息排行等功能(比如新浪微博的TimeLine )2.消息队列
链表由多个单独的元素的个体组成的有顺序的列表或队列。
通常用于消息队列、商品抢购等场景。
2.3.2、链表常用命令
①rpush key1 value1:向链表尾追加一个元素
格式:rpush 键名 元素
示意图:
②rpop key1:弹出链表表尾元素
格式:rpop 键名
③lpush key1:向链表表头添加一个元素
格式:lpush 键名 元素
示意图:
④lpop key1:弹出链表头一个元素
格式:lpop 键名
⑤llen key1:获取链表的长度
格式:llen 键名
⑥lrange key1 start end:获取链表开始和结束位置的元素
格式:lrange 键名 开始位置 结束位置
开始位置是0 ,如果想接受全部文件的话就 结束位置用 -1
⑦ltrim key1 start end:保留链表开始和结束位置的元素
格式:ltrim 键名 开始位置 结束位置
⑧lindex key1 index:查看链表中index位置的值
格式:lindex 键名 位置
⑨lset key1 index value1:设置链表中index位置的元素的值
格式:lset 键名 位置 值
2.4、哈希数据类型
存储、读取、修改用户属性 Redis 的 Hash 结构可以使你像在数据库中 Update ,因为存的是对象结构,不用序列化。
抢购的实现,存在哈希数据类型里面。
2.4.1、介绍
hash是一个string类型的field和value的映射表。hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。
2.4.3、hash常用命令
①hset key1 field value:向hash中添加一个元素和值
格式:hset 键名 元素 元素的值
查看hash_std数据类型:
②hget key1 field:获取hash中的元素的值
格式:hget 键名 元素
③hmset key1 field1 value1 field2 value2:设置多个hash的键值对
格式:hmset 键名 元素1 值1 元素2 值2
④hmget key1 field1 field2:获取hash的多个键值
格式:hmget 键名 元素1 元素2
⑤hexists key1 field:检查元素是否在hash存在
格式:hexists 键名 元素名
⑥hdel key1 field:删除hash中一个元素
格式:hdel 键名 元素
⑦hlen key1:获取hash的长度
格式:hlen 键名
⑧hvals key1:获取键名中所有元素的值
格式:hvals 键名
⑨hgetall key1:获取键名中所有元素和值
格式:hgetall 键名
总结:哈希可以应用于做过试卷的人、抢购商品的人
示例:做过试卷id为3的人
shijuan_3 511(用户id) 1
shijuan_3 521(用户id) 1
查询某个用户是否做过试卷:
通过 hget shijuan_试卷id 用户id 得到一个值,可以用此值为判断用户是否做过试卷。
比如说读出数据库里面的数据,有一个状态码,判断状态码,
2.5、无序集合(Set)
2.5.1、介绍
set是集合,它是string类型的无序集合。
应用场景:朋友圈
1.共同好友、二度好友
2.利用唯一性,可以统计访问网站的所有独立 IP
3.好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐
2.5.3、无序集合常用命令
①sadd key1 value:向无序集合中添加一个元素
格式:sadd 键名 元素 元素2
②smembers key1:列出无序集合中的元素
格式:smembers 键名
③srem key1 value:删除无序集合中的一个元素
格式:srem 键名 元素
④spop key1:随机弹出一个元素
格式:spop 键名
⑤scard key1:统计无序集合中的元素个数
格式:scard 键名
⑥smove key1 key2 value:将无序集合key1中的元素value移动到另外一个无序集合中
格式:smove 集合1 要移动到的集合2 要移动的元素
⑦sismember key1 value:判断一个元素是否是此无序集合中的成员
格式:sismember 键名 元素
⑧sinter key1 key2:取两个无序集合的交集
格式:sinter 键名1 键名2
⑨sinterstore key3 key1 key2:将key1和key2集合的交集存放到key3当中
格式:sinterstore 存放结果的集合名称 集合1 集合2
⑩sunion key1 key2:将两个无序集合的元素合并
格式:sunion 集合1 集合2
⑾sunionstore key3 key1 key2:合并集合key1和key2的元素并存放到key3集合当中
格式:sunionstore 要存放的集合 集合1 集合2
⑿sdiff key1 key2:求两个集合的差集
格式:sdiff 集合1 集合2
⒀sdiffstore key3 key1 key2:求两个集合的差集并将结果存放到另外一个集合当中
格式:sdiffstore 要存放结果的集合 集合1 集合2
2.6、有序集合(SortedSort)
2.6.1、介绍
有序集合跟无序集合大体一样。有序集合增加了一个权重(分值或者数值),用于进行排序操作
1.带有权重的元素,比如一个游戏的用户得分排行榜
2.6.3、有序集合常用命令
提示:可以使用工资来做演示
①zadd key1 score value:添加一个元素到有序集合key1中并设置权重
格式:zadd 键名 权重 值
②zrem key1 value:删除有序集合中一个元素
格式:zrem 键名 元素
③zcard key1:获取有序集合中元素的个数
格式:zcard 键名
④zincrby key1 num value:对有序集合中元素为value加上权重
格式:zincrby 键名 要加的权重值 元素
⑤zrank key1 value:查看有序集合中元素的排名(按权重从小到大排序)
格式:zrank 键名 元素
⑥zrange key1 start end:返回有序集合中开始位置和结束位置的元素
格式:zrange 键名 开始位置 结束位置
⑦zscore key1 value:返回有序集合当中元素的权重
格式:zscore 键名 元素
[if !supportLists]1. [endif]redis持久化功能
3.1、持久化的作用
持久化:redis将内存中的数据存储到硬盘,当服务器重启或者redis重启时,将硬盘中的数据恢复到内存当中,避免数据丢失。
3.2、snap shotting快照持久化(默认方式)
3.2.1、快照数据的存储路径
3.2.2、手动创建快照
save:阻塞式的创建快照
bgsave:非阻塞式的创建快照
3.2.3、自动创建快照
save 900 1:从上一次备份开始,900秒以内有一个键值变动,就触发备份
save 300 10:从上一次备份开始,300秒内有10个键值变动,就触发备份
save 60 10000:从上一次备份开始,60秒内有10000个键值变动,就触发备份
假如:每半小时备份一次。上一次备份时间为13:30分,下一次的备份点为14点。假设到13:45分,服务器宕机了,重启后的数据会是那个时间点的?
重启后的数据是13:30分的。
3.3、AOF(Append Only File)方式
3.3.1、AOF方式介绍
由于快照方式在上一次备份后,还没到下一次备份的时候,服务器宕机了,会导致上一次备份数据后的变动的数据没有保存,会导致数据丢失。
AOF就是将修改的命令追加到一个文件当中,当服务器重启时,根据此文件的内容在内存中重建数据库。
3.3.2、开启aof备份
第一步:编辑redis.conf文件:
第二步:
第三步:重启redis:
杀掉redis-server服务端:
重启:
查看文件:
第四步:查看redis中的数据:
注意:AOF备份方式必须在部署完redis后,立即启用,不能等到redis中有数据再启用,否则会导致数据丢失。
3.3.3、关于aof写入的频率
always:只要有值变动,就立即写入
everysec:每秒写入
no:由操作系统来决定什么时候写入
[if !supportLists]1. [endif]redis主从复制
4.1、Redis Replication的工作原理
在Slave启动并连接到Master之后,它将主动发送一个SYNC命令。此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave服务器在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。
如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。
4.2、Redis Replication的特点和优势
1)同一个Master可以同步多个Slaves。
2)Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。因此我们可以将Redis的Replication架构视为一主多从结构。
3)Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
4)Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据。
5)为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成。即便如此,系统的伸缩性还是得到了很大的提高。
6)Master可以将数据保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作。
4.3、redis中实现主从复制
4.3.1、配置从服务器
注意:主从服务器,要开启两台服务器,一台作为主服务器,一台作为从服务器。
主服务器:192.168.43.195(195服务器)
从服务器:192.168.43.186(186服务器)
第一步:在主服务器上执行以下命令:
在从服务器上查看文件:
第二步:关闭防火墙
第三步:配置从服务器redis.conf文件:
第四步:启动从服务器redis服务端:
第五步:
效果:
先查看主服务器数据:如图:
查看从服务器数据:如图:
4.3.2、主服务器配置
关闭防火墙
4.3.3、测试主从复制
第一步:在主服务器上添加数据,如图:
第二步:查看从服务器上的数据,有没有同步过来:如图:
第三步:在从服务器上写入数据:如图:
查看从服务器redis.conf文件:
5、PHP操作Redis之基本操作
5.1、安装PHP的redis扩展
第一步:将资料里对应版本的php_redis.dll文件,复制到php的ext目录下:如图:
第二步:修改php.ini文件:
上图中要加的话,最好位于所有的*.dll附近
第三步:重启apache:
第四步:在网站目录下创建phpinfo.php查看redis有没有加载成功:
5.2、使用PHP操作redis
第一步:在网站目录下创建redis.php文件:
内容如下:
第二步:用浏览器访问此文件:
第三步:查看195服务器:
第四步:查看186服务器:
6、PHP操作Redis之消息队列
6.1、使用PHP操作Redis实现实时推送
示例:对队列中的手机号码发送短信通知
创建DayuController.class.php文件:
第一步:生成手机号码队列:
第二步:消耗队列并调用第三方发送手机短信:(目前没有第三方免费接口,这里只是一个示例)
6.2、使用PHP操作Redis实现秒杀功能
第一步:生成要抢购商品的队列:
第二步:实现抢购:
命令: