【what】
一、概念
1、Redis是远程的、基于内存的、非关系型数据库。
2、应用场景:(1)缓存;(2)队列;(3)数据存储;
3、与其他key - value 缓存产品区别:
(1)Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
(2)Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
(3)Redis支持数据的备份,即master-slave模式的数据备份。
4、优势:
(1)性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
(2)丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
(3)原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。(4)多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
(5)丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

二、安装
1、安装环境:
(1)Linux/CentOS release6.8
(2)Redis版本(2.8.13 http://download.redis.io/releases/)
(3)预装软件:(gcc、tcl)

Windows下安装:https://github.com/MSOpenTech/redis/releases
(1)Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到任意磁盘,解压后,将文件夹重新命名为 redis。
image.png
打开文件夹,内容如下:
image.png
打开一个 cmd 窗口 使用 cd 命令切换目录到 D:\Program Files (x86)\Redis 运行,或者直接在Redis目录下按住shift键打开cmd窗口/powershell窗口运行如下命令:
.\redis-server.exe redis.windows.conf(win10环境powershell窗口下)
image.png

这时候另启一个 cmd 窗口,原来的不要关闭,不然就无法访问服务端了。
切换到 redis 目录下运行:
.\redis-cli.exe -h 127.0.0.1 -p 6379
设置键值对:
set myKey abc
取出键值对:
get myKey
image.png

2、服务端安装使用:
(1)tar-xf redis-2.8.13.tar.gz;
(2)make;
(3)sudo make install;
3、客户端使用:
image.png

三、数据类型
image.png

1、String:可以是字符串、整数或浮点,统称为元素。
image.png
(1)set:set string1 yejianfeng
(2)get:get string1
(3)incr:incr string2 自增
(4)decrby:decrby string2 2 减去2

2、List:一个序列集合且每个节点都包好了一个元素。
image.png

(1)lpush:lpush list1 12;lpush list1 13;push操作
(2)rpop:rpop list1;pop操作
ps:list里的值不要求唯一,可重复;

3、set:各不相同的元素;
image.png
(1)sadd:sadd set1 12;插入元素
(2)scard:scard set1;查看元素
(3)sismember :sismember set1 12;检查元素是否在set中
(4)srem:srem set1 12;删除set中的元素

4、hash:有key-value的散列组,其中key是字符串,value是元素;
image.png
(1)hset:hset hash1 key1 12;插入元素
(2)hget:hget hash1 key1;查看插入的元素
(3)hlen:hlen hash1;查看hash1的长度
(4)hmget:hmget hash1 key1 key2;获取所有元素

5、sort set:带分数的score-value有序集合,其中score为浮点,value为元素。
image.png
(1)zadd:zadd zset1 10.1 val1;增加一个元素
(2)zcard:zcard zset1;查看元素个数
(3)zrange:zrange zset1 0 2 withscores;查看元素排名
(4)zrank:zrank zset1 val2;查看制定元素的排名

【how】
一、PHP的Redis扩展安装
image.png
image.png

二、PHP操作Redis的五种类型
image.png
image.png

image.png
image.png
image.png
image.png
image.png

1.2 Redis特性:

1、速度快:

(1)Redis的所有数据都是存放在内存中的;

(2)Redis是用C语言实现的;

(3)Redis使用了单线程架构

(4)作者对于Redis源代码的精打细磨

2、基于键值对的数据结构服务器

Redis中的值不仅可以是字符串还可以是具体的数据结构
主要提供字符串、哈希、列表、集合、有序集合等五种数据结构,同时在字符串的基础之上演变出了位图(Bitmaps)和HyperLogLog

3、丰富的功能

(1)提供了键过期功能,可以用来实现缓存;

(2)提供了发布订阅功能,可以用来实现消息系统;

(3)支持Lua脚本功能,可以利用Lua创造出新的Redis命令;

(4)提供了简单的事务功能,能在一定程度上保证事务特性;

(5)提供了流水线功能,这样客户端能将一批命令一次性传到Redis,减少了网络的开销。

4、简单稳定

(1)代码量相对来说少;

(2)使用单线程模型;

(3)不需要依赖于操作系统的类库,自己实现了事件处理的相关功能;

5、客户端语言多

6、持久化

(1)RDB

(2)AOF

image.png

7、主从复制

image.png

8、高可用和分布式

2.8实现了Redis Sentinel ,保证节点的故障发现和故障自动转移。
3.0实现了Redis Cluster提供高可用、读写和容量的扩展性。

1.3Redis使用场景

1、Redis可以做什么

(1)缓存:

加快访问速度,有效降低后端数据源的压力(键值过期时间设置、灵活控制最大内存和内存溢出的淘汰策略)

(2)排行榜系统

列表和有序集合数据结构,方便构建排行榜系统

(3)计数器应用

浏览数、数据实时性;计数功能和计数性能非常好

(4)社交网络

数据结构适合解决访问量大的业务;

(5)消息队列系统

业务解耦、非实时业务削峰等;提供了发布订阅功能和阻塞队列的功能;一般的消息队列功能基本可以满足;

2、Redis不可以做什么?

站在数据规模来看:大规模数据、小规模数据;大规模经济成本相当高;
站在数据冷热角度来看:热数据、冷数据;冷数据不适合存放在Redis中
Redis不是万金油

1.4、用好Redis的建议

1、切勿当做黑盒使用,开发与运维同样重要。

2、阅读源码。

1.5、正确安装并启动Redis

(1)安装Redis

1)在Linux上安装Redis

下载Redis指定版本的源码压缩包到当前目录;

解压缩Redis源码压缩包;

简历一个Redis目录的软连接,指向Redis-3.0.7;

进入Redis目录;

编译(编译之前确保操作系统已经安装gcc);

安装;

2)在Windows上安装Redis

(2)配置、启动、操作、关闭Redis

1)启动Redis:

默认配置

运行启动

配置文件启动:更灵活

image.png

Redis目录下都会有一个redis.conf配置文件,里面是Redis的默认配置

2)Redis命令行客户端

第一种是交互式方式:

通过redis-cli-h{host}-p{port}的方式连接到Redis服务,之后的操作都是通过交互的方式实现,不需要再执行redis-cli了。

第二种是命令方式:

用redis-cli-h{host}-p{port}{command}就可以直接得到命令的返回结果。

注:如果没有-h则默认连接127.0.0.1
没有-p则默认6379端口,都没有的话则连接127.0.0.1:6379这个Redis实例

3)停止Redis服务

shutdown命令

注意:

Redis关闭的过程:断开与客户端的链接、持久化文件生成,是一种相对优雅的关闭方式;
除了可以通过shutdown命令关闭Redis服务以外,还可以通过kill进程的方式关闭掉Redis。但不要粗暴的使用kill-9强制杀死Redis服务,不但不会做持久化操作,还会造成缓冲区等资源不能被优雅关闭,极端情况会造成AOF和复制丢失数据的情况;
*shutdown还有一个参数,代表是否在关闭Redis前,生成持久化文件:shutdown nosave|save

1.6 Redis重大版本

(1)Redis2.6

(2)Redis2.8

(3)Redis3.0

(4)Redis3.2

(5)Redis4.0

奇数为非稳定版本,偶数为稳定版本,通常使用偶数版本

2.1 预备

1、全局命令:

(1)查看所有键:keys

(2)键总数:dbsize

(3)检查键是否存在:exists key

(4)删除键:del key [key …]

(5)键过期:expire key seconds

(6)键的数据结构类型:type key

2、数据结构和内部编码

4.2 Java客户算Jedis

1、获取Jedis:

(1)直接下载目标版本的JRedis-${version}.jar包加入到项目中。

(2)使用集成构建工具。

image.png

2、JRedis的基本使用方法:

3、JRedis连接池的使用方法

image.png
image.png

image.png

9.1 基本概念

image.png

1、主从复制的问题

(1)主从复制的问题:

(2)高可用:

(3)Redis Sentinel的高可用性:

当主节点出现故障时,Redis Sentinel能自动完成故障发现和故障转移,并通知应用放,从而实现真正的高可用。

API的理解和使用

全局命令

1、查看所有键

keys *
会将所有的键输出,该命令的时间复杂度是O(n);

2、键总数

dbsize
会返回当前数据库中键的总数。不是遍历所有键,二十直接获取Redis内置的键总数变量。所以该命令的时间复杂度是O(1);

3、检查键是否存在

exists key
如果键存在则返回1,不存在则返回0;

4、删除键

del key [key …]
返回加过为成功删除的键的个数,如果删除一个不存在的键,就会返回0;
可以同时删除多个键;

5、键过期

expire key seconds
ttl命令会返回键的剩余过期时间,它有3种返回值:

(1)大于等于0的整数:键剩余的过期时间。

(2)-1:键没设置过期时间。

(3)键不存在

6、键的数据结构类型

type key
如果键不存在会返回none;

数据结构和内部编码

image.png
image.png

1、单线程架构

image.png
所有命令都会进入一个队列中,然后逐个被执行。

为什么单线程还能这么快?
(1)纯内存访问
(2)非阻塞I/O;epoll作为I/O多路复用技术的实现。image.png

(3)单线程避免了线程切换和竞态产生的消耗

2、字符串