Redis入门学习



1. 什么是Redis

Redis是Remote Dictionary Server(远程数据服务)的缩写

由意大利人 antirez(Salvatore Sanfilippo) 开发的一款 内存高速缓存数据库

该软件使用C语言编写,它的数据模型为 key-value

它支持丰富的数据类型(结构),比如 String list hash set sorted set。

可持久化(随时把数据备份到硬盘中一份),保证了数据安全。

同一个select 查询sql语句,每天需要被执行查询100万次,并且每次查询获得的数据还是一样的。为了减轻数据库的负载,就把查询好的数据给缓存起来(存储在内存中),第一个用户执行从mysql中获得数据并存储到内存中,第二个 到 第100万次查询就直接从内存中获得数据。

使用缓存减轻数据库的负载。数据库是整个网站资源的"瓶颈"。

在开发网站的时候如果有一些数据在短时间之内不会发生变化,而它们还要被频繁访问,为了提高用户的请求速度和降低网站的负载,就把这些数据放到一个读取速度更快的介质上(或者是通过较少的计算量就可以获得该数据) ,该行为就称作对该数据的缓存。

该介质可以是文件、数据库、内存,内存介质经常用于数据缓存。

缓存的两种形式:

页面缓存经常用在CMS(content manage system)内容管理系统里边(Smarty缓存)

不发生变化的新闻信息页面适合做"页面缓存",每个用户就从一个静态页面访问该新闻即可。

数据缓存经常会用在页面的具体数据里边使用

京东网站的一个页面从业务上看,数据有分类(推广商品、商品精选、普通商品),这些商品从数据库读取出来,为了降低数据库负载,可以给它们设置三个数据缓存,这样独立更新、独立读取。

安装redis

现将下载好的源码包上传到服务器或者直接在服务器端在下好!

Redis入门学习_第1张图片

Redis入门学习_第2张图片

Redis入门学习_第3张图片

Redis入门学习_第4张图片

十分钟学会Redis,就这么简单

十分钟学会Redis,就这么简单

十分钟学会Redis,就这么简单

此时redis运行目录 /usr/local/redis内部已经存在三个文件:

(redis-cli/redis-server/redis.conf)

Redis入门学习_第5张图片

Redis入门学习_第6张图片

Ctrl+C关闭该前台服务进程。

修改配置文件/usr/local/redis/redis.conf,设置后台启动redis。

Redis入门学习_第7张图片

Redis入门学习_第8张图片

Redis入门学习_第9张图片

4. 简单使用

Redis入门学习_第10张图片

2. 具体使用

redis中数据模型为:key-value

类似在php中定义变量:名称 = 值;

1. key的操作

给被存储信息取的的一个"名字"。

在redis里边,除了" "和空格 不能作为名字的组成内容外,其他键盘可见内容都可以作为key的名字部分。名字长度不做要求。

Redis入门学习_第11张图片

Redis入门学习_第12张图片

Redis入门学习_第13张图片

Redis入门学习_第14张图片

Redis入门学习_第15张图片

16个数据库通过下标标志:0 1 2 3 。。。。。 15

Redis入门学习_第16张图片

Redis入门学习_第17张图片

2. String类型操作

string是redis最基本的类型

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

单个value值最大上限是1G字节。

Redis入门学习_第18张图片

incr: increment增长

给变量进行数字累加一操作,类似i++

用于计数器使用

该指令可以用于新key 或 旧key的使用

① 新key:创建该key,同时设置为1的信息

② 旧key:要求该key的类型严格为'int整型'的。

decr指令操作与incr操作类似,减一操作,具体使用可以参考incr指令。

incrby decrby 是按照指定的幅度进行累加操作,具体使用参考incr指令。

substr key start end //内容截取,内容下标从0开始,截取的内容包括start和end位置。

Redis入门学习_第19张图片

Redis入门学习_第20张图片

Redis入门学习_第21张图片

3. 数据类型List链表

list类型其实就是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素。

这使得list既可以用作栈,也可以用作队列。

上进上出 (下进下出):栈

上进下出 (下进上出):队列

Redis入门学习_第22张图片

该list链表类型应用场合:

获得最新的10个登录用户信息: select * from user order by logintime desc limit 10;

以上sql语句可以实现用户需求,但是数据多的时候,全部数据都要受到影响查询,对数据库的负载比较高。必要情况还需要给关键字段(id或logintime)设置索引,索引也比较耗费系统资源

如果通过list链表实现以上功能,可以在list链表中只保留最新的10个数据,每进来一个新数据就删除一个旧数据。链表内部只保留最新登录系统的10个用户信息。每次就可以从链表中直接获得需要的数据。极大节省各方面资源消耗。

Redis入门学习_第23张图片

通过list链表保存登录系统的最新5个用户信息:

jim xiaoli jack xiaoming linken mary tom

Redis入门学习_第24张图片

Redis入门学习_第25张图片

Redis入门学习_第26张图片

Redis入门学习_第27张图片

4. set集合类型

redis的set是string类型的无序集合。

set集合最大可以包含(2的32次方-1 int整型的数字限制)个元素。

关于set集合类型除了基本的添加、删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐功能。

注意:每个集合中的各个元素不能重复。

该类型应用场合:qq好友推荐。

tom朋友圈(与某某是好友):mary jack xiaoming wang5 wang6

linken朋友圈(与某某是好友):yuehan daxiong luce wang5 wang6

Redis入门学习_第28张图片

list链表内部有多个元素,彼此有顺序。

set集合内部有多个元素,彼此没有顺序。

Redis入门学习_第29张图片

Redis入门学习_第30张图片

Redis入门学习_第31张图片

Redis入门学习_第32张图片

tom对linken取差集:结果只有tom的,没有linken的

linken对tom取差集:结果只有linken的,没有tom的

Redis入门学习_第33张图片

Redis入门学习_第34张图片

Redis入门学习_第35张图片

Redis入门学习_第36张图片

总结:

1. 安装redis,直接make,再复制相关文件到运行目录

2. 使用

a) key操作 exists keys rename dbsize flushdb flushall select

b) String操作 set get mset mget incr decr incrby decrby append substr

c) list链表操作 lpush rpop lrange llen ltrim

d) set集合操作 sadd smembers scard sinter sdiff sunion

5. Sort Set排序集合类型

list链表类型: 内部存储的元素有排序功能、会存在多个相同的元素。

Set集合类型: 元素没有排序功能、不存在多个相同元素

该Sort Set是两种类型(list和set)的集中体现,称为排序集合类型。

Sort Set类型:元素有排序功能、不存在多个相同元素

和set一样sorted set也是string类型元素的集合,

不同的是每个元素都会关联一个

通过权/值可以有序的获取集合中的元素

权:一个集合中多个元素做排序的标准。

值:元素的具体信息。

该Sort set类型适合场合:

获得最热门(回复量)前5个帖子信息:

select * from message order by backnum desc limit 5;

(以上需求可以通过简单sql语句实现,但是sql语句比较耗费mysql数据库资源 [或者是全部记录受到影响被查询 或者 是建立索引消耗额外资源])

案例:利用sort set实现获取最热门的前5帖子信息

Redis入门学习_第37张图片

排序集合中的每个元素都是值、权的组合

(之前的set集合类型每个元素就只是一个 值)

Redis入门学习_第38张图片

我们只做一个sort set排序集合,里边只保留5个元素信息,该5个元素是回复量最高的,

每个帖子被回复的时候,都有机会进入该集合里边,但是只有回复量最高的前5个帖子会存在于在集合,回复量低的就被删除。

Redis入门学习_第39张图片

Redis入门学习_第40张图片

Redis入门学习_第41张图片

十分钟学会Redis,就这么简单

Redis入门学习_第42张图片

3. 持久化功能

redis(nosql产品)为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边。

数据保存到硬盘的过程就称为"持久化"效果。

1. snap shotting快照持久化

该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中,如果数据非常多(10-20G)就不适合频繁进行该持久化操作。

Redis入门学习_第43张图片

该持久化备份的频率和触发机制:

Redis入门学习_第44张图片

save 900 1 #900 秒内如果超过 1 个 key 被修改,则发起快照保存

save 300 10 #300秒超过10个key被修改,发起快照

save 60 10000 #60秒超过10000个key被修改,发起快照

上述三个save备份的考虑:

数据变化快的时候,备份频率就快高一些[数据相对安全、服务器负载高些]

数据变化慢,备份的频率就低一些[服务器负载也低]

Redis入门学习_第45张图片

1.1 手动发起快照持久化

手动发起一次快照持久化:

> ./redis-cli [-h 主机名ip -p 端口号码] bgsave

(-h -p 参数可以给其他服务器做快照持久化)

Redis入门学习_第46张图片

2. append only file (AOF持久化)

本质:把用户执行的每个"写"指令(添加、修改、删除)都备份到文件中,还原数据的时候就是执行具体写指令而已(与mysql的备份还原类似)。

Redis入门学习_第47张图片

Redis入门学习_第48张图片

2.1开启aof持久化

(第一次开启该aof持久化会清空redis的全部数据):

Redis入门学习_第49张图片

为了修改的配置文件生效,需要重启服务:

Redis入门学习_第50张图片

Redis入门学习_第51张图片

2.2. 该aof持久化备份频率

Redis入门学习_第52张图片

# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用,【数据最安全,服务器性能最低】

appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐 【数据相对安全,服务器性能折中】

# appendfsync no //完全依赖 os,性能最好,持久化没保证

【数据安全性低,服务器性能最高】

2.3 为aof备份文件做优化压缩处理

例如:可以把多个incr指令设置为一个set指令。

Redis入门学习_第53张图片

redis相关操作指令:

Redis入门学习_第54张图片

4. redis的主从模式

mysql为了降低每个服务器负载,可以设置读写分类(有写服务器、有读取服务器)

select查询 / insert、update、delete写入操作 == 7 / 1

把原先一台redis服务器做的工作 现在交给多个服务器去完成,可以明显降低每台服务器的工作量。

为了降低每个redis服务器的负载,可以多设置几个,并做主从模式

一个redis服务器负载"写"(添加、修改、删除)数据,其他服务器负载"读"数据

主服务器数据会"自动"同步给从服务器

Redis入门学习_第55张图片

Redis入门学习_第56张图片

redis.conf配置文件修改后需要重启进程(杀掉旧进程,启动新进程)

Redis入门学习_第57张图片

此时就可以看到主服务器给从服务器自动同步的数据。

Redis入门学习_第58张图片

五. php与redis结合

1. 安装php的redis扩展

Redis入门学习_第59张图片

十分钟学会Redis,就这么简单

十分钟学会Redis,就这么简单

Redis入门学习_第60张图片

Redis入门学习_第61张图片

Redis入门学习_第62张图片

Redis入门学习_第63张图片

进入安装phpredis步骤:

Redis入门学习_第64张图片

Redis入门学习_第65张图片

Redis入门学习_第66张图片

十分钟学会Redis,就这么简单

在php.ini配置文件中引入redis扩展:

Redis入门学习_第67张图片

十分钟学会Redis,就这么简单

Redis入门学习_第68张图片

Redis入门学习_第69张图片

2. 通过php操作redis

redis在php里边就是一个操作类,名称为"Redis"

据使用redis,就是创建一个对象,对象调用方法即可,

Redis类的各种方法的名称 与 redis大部分指令的名称一致,

方法的参数 就 是指令的参数。

例如:

> set key value

php: $obj->set(key,value);

Redis入门学习_第70张图片

/usr/local/http2/htdocs/redis.php

Redis入门学习_第71张图片

Redis入门学习_第72张图片

3. php中redis的可操作方法有哪些

利用"反射Reflection"获得一个类中所有的可操作方法。

反射在oop面向对象里边的一点作用:

① 可以感知类中全部的可以操作方法

② 可以感知类的方法是否是public、protected、private、finall

Redis入门学习_第73张图片

你可能感兴趣的:(java)