Redis介绍、安装及基本操作

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实现秒杀功能

第一步:生成要抢购商品的队列:


第二步:实现抢购:



命令:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • PHP-redis中文文档 phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务...
    神秘者007阅读 2,717评论 0 2
  • Redis::__construct构造函数$redis = new Redis(); connect, open...
    bycall阅读 1,396评论 0 2
  • phpredis是PHP的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系很有用;以下是redis...
    史史小子阅读 327评论 0 2
  • 春天本该是充满希冀的季节,却对抗不过我那颗萧条枯萎的心。 遥望春意,看不见那些零星的嫩绿、散落的缤纷,只剩灰蒙蒙的...
    舞梦娜阅读 186评论 0 0
  • 区块链 1.印度银行Kotak Mahindra在贸易融资中实施区块链 根据印度商业日报“经济时报”的报道,“首例...
    区块链趣事阅读 571评论 0 51