一.Redis
1. 什么是Redis
Redis是Remote Dictionary Server(远程数据服务)的缩写
由意大利人 antirez(Salvatore Sanfilippo) 开发的一款 内存高速缓存数据库
该软件使用C语言编写,它的数据模型为 key-value
它支持丰富的数据类型(结构),比如 String list hash set sorted set。
可持久化(随时把数据备份到硬盘中一份),保证了数据安全。
同一个select 查询sql语句,每天需要被执行查询100万次,并且每次查询获得的数据还是一样的。为了减轻数据库的负载,就把查询好的数据给缓存起来(存储在内存中),第一个用户执行从mysql中获得数据并存储到内存中,第二个 到 第100万次查询就直接从内存中获得数据。
使用缓存减轻数据库的负载。数据库是整个网站资源的“瓶颈”。
在开发网站的时候如果有一些数据在短时间之内不会发生变化,而它们还要被频繁访问,为了提高用户的请求速度和降低网站的负载,就把这些数据放到一个读取速度更快的介质上(或者是通过较少的计算量就可以获得该数据) ,该行为就称作对该数据的缓存。
该介质可以是文件、数据库、内存,内存介质经常用于数据缓存。
数据缓存经常会用在页面的具体数据里边使用
京东网站的一个页面从业务上看,数据有分类(推广商品、商品精选、普通商品),这些商品从数据库读取出来,为了降低数据库负载,可以给它们设置三个数据缓存,这样独立更新、独立读取。
二. 具体使用
redis中数据模型为:key-value
类似在php中定义变量:名称 = 值;
1. key的操作
给被存储信息取的的一个“名字”。
在redis里边,除了”\n”和空格 不能作为名字的组成内容外,其他键盘可见内容都可以作为key的名字部分。名字长度不做要求。
2. String类型操作
string是redis最基本的类型
redis的string可以包含任何数据。包括jpg图片或者序列化的对象。
单个value值最大上限是1G字节。
incr: increment增长
给变量进行数字累加一操作,类似i++
用于计数器使用
该指令可以用于新key 或 旧key的使用
① 新key:创建该key,同时设置为1的信息
② 旧key:要求该key的类型严格为‘int整型’的。
decr指令操作与incr操作类似,减一操作,具体使用可以参考incr指令。
incrby decrby 是按照指定的幅度进行累加操作,具体使用参考incr指令。
substr key start end //内容截取,内容下标从0开始,截取的内容包括start和end位置。
3. 数据类型List链表
list类型其实就是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素。
这使得list既可以用作栈,也可以用作队列。
上进上出 (下进下出):栈
上进下出 (下进上出):队列
该list链表类型应用场合:
获得最新的10个登录用户信息: select * from user order by logintime desc limit 10;
以上sql语句可以实现用户需求,但是数据多的时候,全部数据都要受到影响查询,对数据库的负载比较高。必要情况还需要给关键字段(id或logintime)设置索引,索引也比较耗费系统资源
如果通过list链表实现以上功能,可以在list链表中只保留最新的10个数据,每进来一个新数据就删除一个旧数据。链表内部只保留最新登录系统的10个用户信息。每次就可以从链表中直接获得需要的数据。极大节省各方面资源消耗。
通过list链表保存登录系统的最新5个用户信息:
jim xiaoli jack xiaoming linken mary tom
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
list链表内部有多个元素,彼此有顺序。
set集合内部有多个元素,彼此没有顺序。
tom对linken取差集:结果只有tom的,没有linken的
linken对tom取差集:结果只有linken的,没有tom的
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帖子信息
排序集合中的每个元素都是值、权的组合
(之前的set集合类型每个元素就只是一个 值)
我们只做一个sort set排序集合,里边只保留5个元素信息,该5个元素是回复量最高的,
每个帖子被回复的时候,都有机会进入该集合里边,但是只有回复量最高的前5个帖子会存在于在集合,回复量低的就被删除。
三. 持久化功能
redis(nosql产品)为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边。
数据保存到硬盘的过程就称为“持久化”效果。
1. snap shotting快照持久化
该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中,如果数据非常多(10-20G)就不适合频繁进行该持久化操作。
该持久化备份的频率和触发机制:
save 900 1 #900 秒内如果超过 1 个 key 被修改,则发起快照保存
save 300 10 #300秒超过10个key被修改,发起快照
save 60 10000 #60秒超过10000个key被修改,发起快照
上述三个save备份的考虑:
数据变化快的时候,备份频率就快高一些[数据相对安全、服务器负载高些]
数据变化慢,备份的频率就低一些[服务器负载也低]
1.1 手动发起快照持久化
手动发起一次快照持久化:
> ./redis-cli [-h 主机名ip -p 端口号码] bgsave
(-h -p 参数可以给其他服务器做快照持久化)
2. append only file (AOF持久化)
本质:把用户执行的每个“写”指令(添加、修改、删除)都备份到文件中,还原数据的时候就是执行具体写指令而已(与mysql的备份还原类似)。
2.1开启aof持久化
(第一次开启该aof持久化会清空redis的全部数据):
为了修改的配置文件生效,需要重启服务:
2.2. 该aof持久化备份频率
# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用,【数据最安全,服务器性能最低】
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐 【数据相对安全,服务器性能折中】
# appendfsync no //完全依赖 os,性能最好,持久化没保证
【数据安全性低,服务器性能最高】
2.3 为aof备份文件做优化压缩处理
例如:可以把多个incr指令设置为一个set指令。
redis相关操作指令:
四. redis的主从模式
mysql为了降低每个服务器负载,可以设置读写分类(有写服务器、有读取服务器)
select查询 / insert、update、delete写入操作 == 7 / 1
把原先一台redis服务器做的工作 现在交给多个服务器去完成,可以明显降低每台服务器的工作量。
为了降低每个redis服务器的负载,可以多设置几个,并做主从模式
一个redis服务器负载“写”(添加、修改、删除)数据,其他服务器负载“读”数据
主服务器数据会“自动”同步给从服务器
redis.conf配置文件修改后需要重启进程(杀掉旧进程,启动新进程)
此时就可以看到主服务器给从服务器自动同步的数据。