NoSql之Redis数据库
一.NoSql之Redis数据库
1.Redis简介
Redis是Remote Dictionary Server(远程数据服务)的缩写,它是NoSql中一款非常出色的产品,由意大利人 antirez(Salvatore Sanfilippo) 开发的一款内存高速缓存数据库同时支持持久化设置。该软件使用C语言编写,它的存储格式也是key-value然而它支持丰富的数据结构,具体一共有5种数据类型,还有1中服务器命令类型(key类型,不支持windows)
String(字符串类型)
list(链表)
hash(哈希表类型)
set(无序的集合)
sorted set(有序集合,缩写为zset)。
而且redis通过简单的配置把数据从内存保存到硬盘当中进行持久保存。
Redis为高并发而生,是NoSql中的佼佼者
2.Redis的特点
1)高速读取数据(in-memory)
2)减轻数据库负担
3)有集合计算功能(优于普通数据库和同类别产品)
4)多种数据结构支持
下面是官方的bench-mark数据测试数据:
1.测试完成了50个并发执行100000个请求。
2.设置和获取的值是一个256字节字符串。
3.Linux box是运行Linux 2.6,这是X3320 Xeon 2.5 ghz。
4.文本执行使用loopback接口(127.0.0.1)。
结果:读的速度是110000次/s,写的速度是81000次/s 。
3.Redis的缺点
Redis虽然具有安全认证机制,但Redis的安全认证机制是明文的密码,所以Redis并不安全,据说这是因为它的开发者并不擅长安全加密领域,所以只能简单地赋予Redis一个明文的安全认证和本地安全访问机制,Redis是一个个人开发者提供的开源产品,并没有正式官方支持它的发展
二.Redis和Memcache的对比和区别
memcache不支持数据持久化,软件运行和安装都较小。Memcache是存内存存储的数据库,memcache没有能力把数据保存到硬盘中进行持久化保存,单个key只能保存1M的数据,默认最大的内存存储量是64M,使用当中,memcache可以直接设置超时时间,Memcache具有分布式的算法功能。
redis 支持数据持久化和内存存储两种方式,软件运行比memcache大一点,设置超时的key,需要使用另外的函数,redis集群是一个主从模式的,主服务器可用来读写,从服务器只能用来读。redis没有内置的分布式算法功能。Redis单个key可以存储最大空间为1G,而总存储容量可以视硬盘的大小而定。
在PHP的官方当中Memcache具有Memcache类和Memcached类。而Redis没有PHP官方的支持,Redis的PHP扩展是其开发作者编写的。
在国内使用php+redis架构的公司,新浪微博,微信朋友圈
三.Redis的安装和启动
1.Redis的安装操作系统说明
redis是一款开源产品,主要开发平台为linux,所以原生的代码在linux下运行是最好的。
redis作者不愿意开发windows版本下的redis,微软技术小组,在redis源码的基础上,进行了开发windows版的redis,主要提供给ASP.NET使用,所以你也可以安装windows版本的redis程序。在本阶段当中,我们主要学习redis在Linux下的应用为主。
2.在Linux下安装Redis
安装命令:yum -y install redis
Reids的命令行工具是非常人性化,所以我们可以使用xshell工具来操作Redis,安装的步骤如下图所示:
回车就可以安装redis.成功安装出现的界面如下图所示
当安装完成之后,我们可以使用rpm -ql redis查看redis所有的安装目录和文件的存放位置,效果如下图所示:
3.安装Redis的PHP扩展到PHP5.6当中
在Linux服务器中的/var/www/html下有一个文件叫phpinfo.php(这个文件是我们之前学习所建立的,你可以在memcache的课程目录code当中找回),所以你需要运行该文件来获取php当前的扩展模块信息,搜索redis关键字,发觉没有找到,证明redis没有安装,然而我们的php版本需要确定是否为php5.6,因为laravel框架找需要使用php.5.5以上的版本才能支持redis,所以你的php版本必须为php5.5以上,确定信息如下图所示:。
确认无误后,可以键入一下安装命令(该命令只能安装php5.6的redis扩展包):
yum install -y --enablerepo=remi --enablerepo=remi-php56 php-pecl-redis
安装的结果如下:
回车就可以安装,完成后,效果如下图所示:
完成了以上的安装后,我们需要重启apache服务器,命令: service httpd restart,效果如下:
重启apache后,重新在浏览器端打开phpinfo.php查看redis的扩展模块是否正确安装,效果如下图所示,代表安装成功:
然而redis的本地安全机制很坑爹,所以我们需要修改redis的配置文件,让php能正常的支持redis扩展,redis的配置文件目录在/etc/redis.conf下,所以我们可以使用vim /etc/redis.conf打开redis的配置文件,效果如下图所示:
回车打开/etc/redis.conf文件,内容如下:
这时redis的安全本地访问机制,默认情况是打开的
注释结果如下:
保存并退出(:x),注释该选项会屏蔽掉redis的本地安全访问机制,因为redis的这个机制很坑爹。这时如果你的redis处于启动的状态那么就需要重启,如果没有开启的时候需要开启,命令如下:
service redis start #开启redis服务器
service redis restart #重启redis服务器
service redis stop#停止redis服务器
service redis status#查看redis服务器的状态
把redis加入开机启动脚本当中:chkconfig redis on
4.启动并登录Redis客户端
第一步:启动redis服务器,命令:service redis start
第二步:redis安装的时候会在/usr/bin有一个叫做redis-cli的文件,具体的路径如下:
/usr/bin/redis-cli,该文件是一个redis的客户端登陆工具,我们可以直接忽略路径输入redis-cli 这个命令进入redis客户端,如下所示:
默认会启动redis的6379端口
使用exit退出redis客户端
四.Redis的数据类型和管理命令
1.Redis的String数据类型
string是redis最基本的类型
redis的string可以包含任何数据。包括jpg图片或者序列化的对象。
单个value值最大上限是1G字节。memcache单个value存储1M。
如果只用string类型,redis就可以被看作加上持久化特性(服务器重启之后,数据不丢失)的memcache
(1)set命令
该命令用于设置或者修改Redis中的键值(这个功能于Memcache的set有点类似) 命令语法:set 键名(key) 值(value)
例如:我们添加一个name=“xiaoqian”的键值对。
使用命令: set name xiaoqian
修改name的值为ningcaichen
注意:在redis当中默认使用set那么会永久存储在硬盘和内存当中,使用redis快照的方式进行存储的,redis的string类型没有所谓的过期时间命令,过期时间的命令属于服务器的key类型
(2)get命令
该命令用于获取Redis中key对应的string值,如果key不存在返回 nil,
命令语法:get 键名
1.获取一个已经存在的键名,可以得到该键名的值
2.如果一个键名不存在,那么获取该键名会返回nil
2.Redis的hash数据类型
(1)hset命令(hash set)
命令的功能:在哈希表中设置一个字段(field)和 一个字段的值(value)
命令格式: hset 哈希表的名称 字段(field) 字段值(value)
例如:存储一个名为Users:Jay,字段为name,age和jober的哈希表数据,如下:
(2)hget命令
命令的功能:在一张指定的哈希表中获取字段的值,如果字段不存在那么将返回nil
命令格式: hget 哈希表的名称 字段(field)
例如:获取一张名为Users:Jay的哈希表中获取姓名和年龄,代码如下所示:
以上使用hset和hget我们获取和设置哈希表的要一个一个的进行,比较没有效率,假设我们要一次设置多个哈希表的字段和值,那么我们应该怎么做呢?
(3)hmset命令
命令的功能:在哈希表中设置多个字段(field)和 多个字段的值(value)
命令格式: hmset 哈希表的名称 字段(field) 字段值(value)....
例如:存储一个表名为foods,字段名为food1,存放的字段值为apple,字段名为food2,存放的字段值为pear,命令如下所示:
原理图如下:
设置上表命令如下所示:
hmset Foods:Fruit foods1 apple foods2 pear
(4)hgetall命令
命令的功能:在哈希表获取所有的字段和值
命令格式: hgetall 哈希表的名称
例如:获取一个表名为Foods:Fruit的哈希表中的所有字段和值,代码如下所示:
hgetall Foods:Fruit
假设要获取Users:Jay,那么语句如下:
hset和hget的应用的范围如下:
例子1:把Users:Jay当中的age改为55岁,并且只获取其年龄,我们应该如何操作
例子2:把Users:Jay当中添加一个字段为money,值为8000元,这时应该如何做?
3.Redis的list链表数据类型
链表数据结构中的栈:先进后出的特点,其原理图如下:【索引从0开始,最后进的索引为0】
链表数据结构中的队列:先进先出【索引从0开始,第一个进的索引为0】
(1)lpush命令(跟栈相关)
命令的功能:在链表的栈中由头部压入一条数据
命令格式: lpush 链表的名称(栈名称) 值
命令如下:
例子:在一个名为list8的栈中压入数据one,two,three
以上分别在栈中头部压入的顺序为one,two,three,如下图所示
(2)rpush命令(跟队列相关)
命令的功能:在链表的队列中由尾部压入一条数据
命令格式: rpush 链表的名称(队列) 值
命令如下:
例子:在一个名为list9的队列中压入数据one,two,three
以上分别在队列中尾部压入的顺序为one,two,three,如下图所示
(3)lrange命令(跟队列和栈都相关,用于查询)
命令的功能:在链表的中获取一个范围的数据
命令格式: lrange 链表的名称 开始位置 结束位置(-1代表获取到全部)
例如:获取一个栈的所有数据,比如获取list8的链表中所有栈的数据
lrange list8 0 -1
如图所示:
例如:获取一个队列list9的所有数据
lrange list9 0 -1
如图所示:
例如:获取一个队列list9中开始位置为0,结束位置为1的数据
例如:获取一个栈list8中开始位置为1,结束位置为2的数据
(4)lpop命令(与栈和队列相关)
命令的功能:移除并返回链表 key 的头元素的值。
命令格式: lpop 链表的名称
弹出list8栈中头部数据,如下图所示:
弹出成功后,list8的栈中剩下以下数据:
使用命令: lpop list8
这时two就处于栈中的头部,如果你继续lpop就会依次弹出并删除two,one这个两个数据
弹出list9队列中的头部数据,如下图所示:
弹出成功后,list9的队列中剩下以下数据:
使用命令: lpop list9
这时two就处于队列中的头部,如果你继续lpop就会依次弹出并删除two,three这个两个数据
(5)ltrim命令(一般用于队列操作比较多)
命令的功能:让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
命令格式: ltrim 链表的名称 开始的位置 结束的位置
例子1:在list10的队列中压入元素为one,two,three,four
执行结果如下:
例子2:在list10的队列保存two和three,删除one和four
分析可知,two和three所在的索引为1和2,因此命令编写如下:
ltrim list10 1 2
执行结果如下所示:
4.Redis的Set集合数据类型(无序集合)
在现实开发当中集合一般用于社交网站或者社交软件的朋友圈功能(例如:新浪微博好友圈),如下图所示:
在现实的社交网站开发当中存在着一个好友推荐的功能,这个就是把一个用户有朋友而另一个用户没有的朋友推荐,在redis当中这种功能可以使用集合中求差集的方法进行实现
差集的定义:一个集合存在某一个元素,而另外一个集合不存在的元素,该元素就属于两个集合的差集
张三与李四差集:以张三为主,张三多出公有的部分的那一部分
交集的定义:一个集合和另外一个集合共同的元素,称为交集,在现实开发当中就是社交网站的共同好友功能
并集的定义:一个集合和另外一个集合进行合并然后去除重复的元素后所得到的结果就是并集,在实际开发当中并集的使用就是为了共享,游戏行业中的道具共享就是并集的结果
(1)sadd命令(set add)
命令的功能:在无序集合当中添加一个元素,该元素如果存在该元素不会被重复添加
命令格式: sadd 集合的名称 集合的元素
比如:创建一个zhangsan的朋友圈集合
比如:创建一个lisi的朋友圈集合
(2)smembers命令(set members)
命令的功能:获取一个无序集合中的所有元素
命令格式: smembers 集合的名称
比如:创建一个zhangsan的朋友圈集合里面的好友列表
比如:创建一个lisi的朋友圈集合里面的好友列表
(3)sdiff命令
命令的功能:以一个集合作为标准去求另外一个集合不存在的元素,我们称为差集(可以参考集合概念中差集的图片辅助理解)
命令格式: sdiff 作为标准的集合名称 求差集的集合名称
比如:以张三的朋友圈(zsFriends)作为标准去求李四朋友圈(lsFriends)中的差集,
使用命令: sdiff zsFrineds lsFriends
结果如下图所示:
比如:以李四的朋友圈(lsFriends)作为标准去求张三的朋友圈(zsFrineds)中的差集,结果如下图所示:
结果如下图所示:
(4)sinter命令
命令的功能:一个集合和另外一个集合共同的元素,我们称为交集(可以参考集合概念中交集的图片辅助理解)
命令格式: sinter 集合名称1 集合名称2
比如说:我们希望找到zsFrineds和lsFriends里面的共同好友(元素),代码如下:
①sinter zsFriends lsFriends
②sinter lsFriends zsFriends
使用命令①和命令②结果是一样的:
(5)sunion命令
命令的功能:求出两个集合合并后所有的元素并去掉重复的元素的结果称为并集(可以参考集合概念中并集的图片辅助理解)
命令格式: sunion 集合名称1 集合名称2
比如:把张三的朋友和李四的朋友合并在一起进行群聊功能就可以使用以下命令:
①sunion zsFrineds lsFriends
②sunion lsFriends zsFrineds
使用命令①和命令②结果是一样的:
(6)scard命令
命令的功能:统计集合中的元素个数,并返回总数的整型值
命令格式: scard 集合名称
比如:希望知道张三有多少个好朋友,那么就可以使用该命令:
可以知道张三一共有4个好友,如果现在再添加一个好友叫caisibei那么它就会有五个好友了:
5.Redis的Zset集合数据类型(有序集合)
sorted set是set的一个升级版本,意大利文叫zset,在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。有序列表值完成的是集合元素排序的功能,一般很少用于其他方向。
(1)zadd 命令
命令功能:向有序集合中添加元素。如果该元素存在,则更新其顺序。
在zset当中序号是顺序,索引号是下标,注意区分,按序号排序,改变序号。则会重新排序
命令格式: zadd 集合名 序号 元素
比如:添加一个明星的集合,1为林志玲(lzl),2为高圆圆(gyy),3为蔡思贝(csb)
1,2,3是元素的顺序号,而他们的索引号是0=lzl,1=gyy,2=csb
注意:如果一个元素存在,而它的序号发生改变,那么会重新更新的她的顺序,效果如下:
如果再次使用zrange stars 0 -1去查看,发觉lzl排到csb之后,因为csb的序号是3,而lzl的序号是100,由小到大排列自然是100在3的后面
(2)zrange命令
命令功能:按序号升序(由小到大)获取有序集合中的内容
命令格式:zrange 集合名称 开始位置(索引) 结束位置(索引)(-1获取全部)
比如:获取stars当中所有有序集合中的元素,用升序进行排列
使用命令:zrange stars 0 -1
(3)zrevrange命令
命令功能:按序号降序(由大到小)获取有序集合中的内容。
命令格式:zrevrange 集合名称 开始位置(索引) 结束位置(索引)(-1获取全部)
比如:获取stars当中所有有序集合中的元素,用降序序进行排列
注意:开始位置并非指代你添加序号,而是集合的索引号,zadd 添加的是序号,序号不是索引号,索引号就好比数组当中的索引号 。
五.Redis中与Key相关的命令
(1)keys * 命令
命令功能:返回当前数据库里面的键
(2)exists命令
命令功能:判断一个键是否存在。
命令格式:exists 键名
如果返回0代表该键名不存在,如果返回1代表键名存在
(3)del
命令功能:删除指定的键(key),如果返回1代表删除键名成功,返回0代表删除失败
命令格式:del 键名
删除成功查看name的键名
(4)expire
命令功能:设置键的有效期,如果不调用该命令设置键名,默认的情况下键名本身就是永远不过期。
命令格式:expire 键名 有效期(秒数)
返回nil代表为null,并且redis已经删除了name这个键名不会占据任何的内存和硬盘空间.
设置过期时间返回1代表设置成功,返回0代表设置过期时间失败。
如果我们设置了一个Key的过期时间有60秒,假设我们想知道,当前这个key还有多长时间才过期,那么我们应该做做呢?使用ttl命令,该命令返回过期的倒数时间,结果如下:
(5)type
命令功能:返回一个键的数据类型
命令格式: type 键名
六.安全认证
在默认的情况下redis不需要任何密码就可以登录,为了设置客户端连接后进行任何其他操作前需要使用的密码,我们使用Redis的安全认证,然而这个安全认证的密码是明文的。使用exit退出redis客户端
方法:打开redis的配置文件(文件位于/etc/redis.conf下)
设置安全认证的步骤如下:
第1步:使用vim打开/etc/redis.conf文件,使用末行模式搜索关键字/foobared,得到的内容如下:
第2步:把requirepass前的#去除,并且修改redis的安全认证密码为123456【这个是便于后面认证用】
设置完成后,保存并退出(:x)
第3步:如果希望redis的安全认证生效,那么需要重启redis服务器
第4步:使用redis-cli命令进行登录,发觉可以进入客户端界面但无法进行操作
这时我们需要使用exit命令(快捷键ctrl+c)退出redis的客户端,效果如下图所示:
第5步:使用安全认证密码进行登录再查看redis客户端操作结果,如下图所示:
安全认证登录命令 : redis-cli -a 安全认证密码 【redis-cli中间没有空格】
这时表示安全认证设置成功。
七.Redis的持久化AOF设置
在redis当中,redis开发设计两种持久化的模式,如下
1.Redis的快照模式(默认安装完成就会自动开启的持久化模式)可以通过以下路径查看redis的快照文件,路径为/var/lib/redis/dump.rdb
dump.rdb文件就是redis的快照文件,它保存了redis所有的数据信息和记录,如果当网站数据量变大,该文件也会随之增大,如果您操作增删改那么就有可能在一个非常庞大容量的快照文件中去完成这一项工作,效率很低。因此我们有必须去把改模式改为aof持久化模式。
2.Redis中的Aof模式:Redis的aof文件有点类型mysql的binlog日志,该文件把用户的操作记录包括查询的过程全部记录,那么当redis在运行时,数据会在redis的一个自定义内存中去访问,而Aof文件只会记录这些内存数据的操作,当服务器重启时,那么redis才会将数据从内存中保存到Aof当中,当服务器重新运行时那么aof就会根据操作的记录把数据重新还原到Redis的内存当中过去,以却保数据的完整性。我们作为应用者,只需要了解aof的持久化模式是记录用户的操作而非实时数据记录就可以了,然而我们需要知道如何开启aof持久化模式。
首先我们需要观察/var/lib/redis下有又没存在一个.aof的文件,查看结果如下图所示:
因此我们需要通过编辑/etc/redis.conf文件去开启redis的aof持久化模式,以提高网站的访问速度。设置aof持久化模式的步骤如下:
第1步:使用vim打开/etc/redis.conf文件,通过末行模式搜索/appendonly,得到以下内容:
第2步:把appendonly 的选项由no改为yes,代表开启aof持久化模式,同时需要把appendfilename选项前的#去除,修改如下图所示:
第3步:观察与aof模式相关几个配置项,并且理解这个几个配置项的作用是什么
如果aof的模式一旦启动,那么快照就会失效,redis就会把所有的数据缓存到内存当中,如果你发生重启,停止,关闭服务器等行为,那么aof文件就会把内存中数据同步到硬盘中
appendfsync always的选项代表redis的命令每一次只要运行那么就会马上写入aof操作文件当中,更选项是最没有效率的,然后它却是最具备操作记录完整性的。
appendfsync everysec 的选项是redis比较折中的选项,代表每一秒中只有由操作那么就会进行操作记录,但是如果在某一秒当中redis发生故障,那么这一秒的数据操作记录将有可能发生丢失的情况,存在一定的风险,然而这个配置的性能比较适合中,所以建议使用,因为redis一秒中内可以写81000次/s所以虽然存在一定的风险,但只要不要把一些非常重要的敏感数据至于redis当中,那么就不需要过分担心这个问题
appendfsync no 该配置的效率完全依赖您当前所在使用的操作系统和计算机的性能,如果操作系统稳定,计算机的性能强大,那么这一项是最有效率的,反而就是最差,所以一般最好不要设置该项
第4步:开启完成后,需要重启redis服务器,如下图所示:
第5步:重启完成后,必须去/var/lib/redis目录下去查看是否具有aof文件的生成
第6步:使用redis-cli -a 123456登录到redis的客户端命令行当中,插入操作一些数据记录
第7步:再次查看/var/lib/redis目录下的aof文件的变化
第8步:使用vim打开/var/lib/redis目录下的aof文件,观察到以下结果:
出现以上结果,代表aof持久化模式生效。
如果aof生效了,那么快照模式就自动失效了,如果你把aof关闭了,那么快照就会重新自动生效。
八.PHP操作Redis的基本方法
redis在php的官方里面并没有被认可,所以php的官方没有redis的php开发文档,因此对我们使用php操作redis就带来了问题,所以我们需要备用一些离线的手册作为日后开发只用。可以使用以下这个文档,也可以自己去下载自己喜欢的文档
1.使用php连接Redis
参考代码:code/connect.php,上传到/var/www/html下进行测试
浏览器的测是结果如下,出现以下界面代表连接成功了:
2.使用set方法操作redis
参考代码:code/set.php,上传到/var/www/html下进行测试
如果希望存入中,那么我们需要修改代码如下:
浏览器的测是结果如下,出现以下界面代表连接成功了:
redis命令行结果如下,发现被转成了utf-8的字节编码(不是乱码):
utf-8默认用3个字节来表达一个汉字,在redis中不能正常看到中文的显示,不过我们可以通过php的get正常获取结果如下:【有中文的,我们需要在php中设置header】
执行结果如下:
3.使用hmset和hgetall操作redis的哈希表
参考代码:code/hmset.php,上传到/var/www/html下进行测试
例子1:设置一个明星的哈希表Stars:Angela,其字段name=杨颖 born=香港 age=28
浏览器的测是结果如下,出现以下界面代表连接成功了:
redis命令行结果如下,发现被转成了utf-8的字节编码(不是乱码):
例子2:设置一个明星的哈希表Stars:Angela,添加两个字段hasChild=有,hasDear=黄晓明,修改其年龄为38岁
参考代码:code/hmset2.php,上传到/var/www/html下进行测试
测试如下:
4.使用sadd和smembers操作无序集合
参考代码:code/sAdd.php,上传到/var/www/html下进行测试
例子1:建立张三和李四的朋友圈
浏览器的测是结果如下:
例子2:分别以张三和李四作为标准,求他们各自的差集
参考代码:code/sDiff.php,上传到/var/www/html下进行测试
执行结果如下:
例子2:分别以张三和李四的共同好友,求张三和李四的交集
参考代码:code/sInter.php,上传到/var/www/html下进行测试
执行结果如下:
例子3:张三和李四的好友列表共享,求并集
执行结果如下:
5.使用zadd和zrange和zrevrange操作有序集合
参考代码:code/zAdd.php,上传到/var/www/html下进行测试
例子1:读取数据库当中的新闻列表到有序集合当中
测试结果如下;
例子2:把无序集合中的内容读取到网页当中
测试结果如下:
例子3:完善zAdd.php程序如下
为了解决的重复性记录问题,我们需要每次复制数据库记录到zset当中之前把zset的key先删除,所以修改代码如下:
九.使用TP操作Redis(拓展知识)
在thinkPHP3.2.3当中tp框架把Redis当成了缓存来对待,所以Redis在tp框架中就是一个Memcache的使用,它只能操作Redis的String数据类型,然而使用Laravel框架可以更好的使用Redis,如果消息队列等等.
在thinkPHP3.2.3当中把Redis当做缓存也就算了,但的是ThinkPHP3.2.3的Redis操作类有个小bug,因此我个人认为这个类的底层需要修改的,所以我把它修改了,因此我们现在用的这个ThinkPHP3.2.3当中Redis配置如果你放在标准的Redis下是不会生效的。如果你对这个Redis类的bug有兴趣,那么你可以参考一下路径,打开一下路径进行查看
tp\ThinkPHP\Library\Think\Cache\Driver\Redis.class.php
修改bug完成后,那么我们需要在Application/Common/Conf/config.php加入配置内容如下:
完成后,编写IndexController.class.php文件如下:
测试结果如下所示:
编写操作String数据类性的增,改和删
如果希望使用框架操作redis最好就是laravel,因为laravel的作者之一是redis原生开发者
十.使用PHP实现消息队列
(实际就是操作链表数据类型的队列)
使用php代码实现医院的模拟医生就诊叫号流程:
1)挂号(把病人的信息加入消息队列)
2)医生叫号(把病人的信息在消息队列中弹出,病人看完后医生停止就诊)
第1步:编写挂号的代码如下 :
测试结果如下所示:
第2步:是医生叫号,病人排队进入诊室,就把队列中依次弹出
测试结果如下:
继续刷新页面,医生实际中是点击了一个按钮
继续刷新页面,医生实际中是点击了一个按钮
如果医生看完了所有的病人,那么就应该显示当前当前停止就诊了
十一.Redis的16个数据库和分库操作
在默认的情况下其实Redis有16个数据库,如果您默认进入redis当中其实redis会帮你选择了一个id=0的数据库,如果你希望切换数据库,那么就可以使用一个命令叫select
命令格式:select 数据库的id(0-15)
例子1:切换到2号数据库中
假设在当前数据中操作set语句,如下:
可以成功把数据保存在当前数据库中,如果这时切换到数据库0当中
我们会发觉0数据库的name和2数据库的name分别是代表不同的值
如果我们希望清除当前的所有key那么我们可以使用flushdb命令进行清除,如下所示:
flushdb只能清除当前数据,不在当前数据库的key都可以被保留下来
在现实开发当中,我们设置不同的数据库对数据进行存放,但是同时带来一个这样的问题,如果我们当前的数据在数据库2当中,那么我们在 php中应该如何选择数据库2呢?
例子2:使用php操作指定的redis数据库
详细代码参考:code/selectdb.php
测试结果如下:
例子3:使用php操作指定的redis数据库中一个key过期
在手册中没有expire的方法,如果希望设置这个方法我们需要使用setTimeOut来进行代替
测试结果如下: