NoSql之Redis数据库

一.NoSqlRedis数据库

1.Redis简介

Redis是Remote Dictionary Server(远程数据服务)的缩写,它是NoSql中一款很是出色的产品,由意大利人 antirez(Salvatore Sanfilippo)  开发的一款内存高速缓存数据库同时支持持久化设置。该软件使用C语言编写,它的存储格式也是key-value然而它支持丰富的数据结构,具体一共有5种数据类型,还有1中服务器命令类型(key类型,不支持windows)php

String(字符串类型)html

list(链表)mysql

hash(哈希表类型)linux

set(无序的集合)  laravel

sorted set(有序集合,缩写为zset)。redis

并且redis经过简单的配置把数据从内存保存到硬盘当中进行持久保存。算法

Redis为高并发而生,是NoSql中的佼佼者sql

2.Redis的特色

1)高速读取数据(in-memory)shell

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是一个我的开发者提供的开源产品,并无正式官方支持它的发展

二.RedisMemcache的对比和区别

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.安装RedisPHP扩展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.RedisString数据类型

string是redis最基本的类型

redis的string能够包含任何数据。包括jpg图片或者序列化的对象。

单个value值最大上限是1G字节。memcache单个value存储1M。

若是只用string类型,redis就能够被看做加上持久化特性(服务器重启以后,数据不丢失)的memcache

1set命令

该命令用于设置或者修改Redis中的键值(这个功能于Memcache的set有点相似) 命令语法:set 键名(key) (value) 

例如:咱们添加一个name=“xiaoqian”的键值对。 

使用命令: set name xiaoqian

 

 

修改name的值为ningcaichen

 

 

注意:在redis当中默认使用set那么会永久存储在硬盘和内存当中,使用redis快照的方式进行存储的,redis的string类型没有所谓的过时时间命令,过时时间的命令属于服务器的key类型

2get命令

该命令用于获取Redis中key对应的string值,若是key不存在返回 nil,

命令语法:get 键名

1.获取一个已经存在的键名,能够获得该键名的值

 

 

2.若是一个键名不存在,那么获取该键名会返回nil

 

 

 

2.Redishash数据类型

 

 

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

 

 

3zrevrange命令

命令功能:按序号降序(由大到小)获取有序集合中的内容。

命令格式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命令,该命令返回过时的倒数时间,结果以下:

 

 

 

5type

命令功能:返回一个键的数据类型

命令格式 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步:是医生叫号,病人排队进入诊室,就把队列中依次弹出

 

 

测试结果以下:

 

 

继续刷新页面,医生实际中是点击了一个按钮

 

 

继续刷新页面,医生实际中是点击了一个按钮

 

 

若是医生看完了全部的病人,那么就应该显示当前当前中止就诊了

 

 

十一.Redis16个数据库和分库操做

在默认的状况下其实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来进行代替

 

 

测试结果以下: