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,就这么简单

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4. 简单使用

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

2. 具体使用

redis中数据模型为:key-value

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

1. key的操作

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

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

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

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

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

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

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

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

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

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

2. String类型操作

string是redis最基本的类型

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

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

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

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,就这么简单

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

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

3. 数据类型List链表

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

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

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

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

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

该list链表类型应用场合:

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

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

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

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

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

jim xiaoli jack xiaoming linken mary tom

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

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

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

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

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,就这么简单

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

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

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

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

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

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

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

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

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

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

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

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

总结:

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,就这么简单

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

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

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

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

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

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

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

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

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

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

3. 持久化功能

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

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

1. snap shotting快照持久化

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

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

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

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

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

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

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

上述三个save备份的考虑:

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

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

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

1.1 手动发起快照持久化

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

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

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

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

2. append only file (AOF持久化)

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

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

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

2.1开启aof持久化

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

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

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

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

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

2.2. 该aof持久化备份频率

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

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

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

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

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

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

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

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

redis相关操作指令:

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

4. redis的主从模式

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

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

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

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

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

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

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

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

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

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

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

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

五. php与redis结合

1. 安装php的redis扩展

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

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

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

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

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

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

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

进入安装phpredis步骤:

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

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

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

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

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

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

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

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

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

2. 通过php操作redis

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

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

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

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

例如:

> set key value

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

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

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

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

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

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值