redis基础及redis特殊场景使用描述

String set list hash zset

redis原理

单线程:redis是单线程+io多路复用:检查文件描述的就绪状态

对比memchached:多线程+锁

redis优势

解决应用服务器的cpu和内存压力

减少io的读操作,减轻io的压力

关系型数据库的扩展性不强,难以改变表结构

nosql数据库没有关联关系,数据结构简单,拓展表比较容易;nosql读取速度快,对较大数据处理快;

主要是从两个角度去考虑:性能和并发。当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并不是非要使用redis。因此,这个问题主要从性能和并发两个角度去答。

性能:我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。

并发:在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。

redis持久化

RDB——redis database

在指定时间间隔内,将内存中的数据作为一个快照文件(snapshot)写入到磁盘,读取的时候也是直接读取snapshot文件到内存中

① 持久化过程:redis单独创建(fork)一个进程来持久化,会先将数据写入临时文件中,待上次持久化结束后,会将该临时文件替换上次持久化文件,比aof高效,但是最后一次数据可能会丢失

② Fork:在linux中,fork()会产生一个跟主进程一样的子进程,出于效率考虑,主进程和子进程会公用一段物理内存,当发生改变的时候,才会把主进程“”写时复制”一份给子进程

Redis备份的文件:在redis.conf中设置,dbfilename默认为:dump.rdb

④ Rdb保存策略:

900s 1 file change 300s 10file change 60s 10000file change

⑤Rdb的备份:

config get dir 得到备份的文件夹 复制备份文件

⑥Rdb恢复:

关闭redis 将备份文件复制到工作目录下 启动redis,自动加载

AOF——append of file

以日志形式记录每个写操作,启动时通过日志恢复操作

开启AOF:默认不开启,进入redis.conf找到appendonly yes打开 修复AOF:redis-check-aof –fix appendonly.aof 同步频率:每秒记录一次,如果宕机该秒记可能失效 Rewrite:bgrewriteaof 因为日志是追加方式,文件会越来越大,当超过了设置的阈值时,日志文件会压缩,保留仅可以恢复的日志

RDB vs AOF

RDB
优点:
* 节省磁盘空间
* 恢复速度快

缺点:
* 数据太大时,比较消耗性能
* 一段时间保存一次快照,宕机时最后一次可能没有保存

AOF
优点:
* 备份机制更加稳健
* 可读的日志文件,通过aof恢复更加稳健,可以处理失误

缺点:
* 比RDB更占磁盘
* 备份速度较慢
* 每次都同步日志,有性能压力

RDB和AOF哪个好
* 官方推荐都启用
* 对数据不敏感,单独用RDB
* 不建议单独使用AOF
* 若作为纯缓存使用,可以都不开启

集群

实现对redis的水平拓展,启动n’的redis节点,将整个数据分布在这n个节点中

配置conf文件:

拷贝多个redis.conf文件

 

开启daemonize yes

Pid文件名字

指定端口

Log文件名字

Dump.rdb名字

Appendonly 关掉或者换名字

配置cluster文件:

cluster-enable yes 打开集群模式

cluster-config-file xxx.conf 设置生成的节点配置文件名

cluster-node-timeout 15000设置节点失联时间,超多该时间(毫秒),集群自动进入主从切换

分布式架构——session共享

session共享

缓存——热数据

热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相比于memcached还提供了丰富的数据类型可以使用,另外,内存中的数据也提供了AOF和RDB等持久化机制可以选择,要冷、热的还是忽冷忽热的都可选。

结合具体应用需要注意一下:很多人用spring的AOP来构建redis缓存的自动生产和清除,过程可能如下:

Select 数据库前查询redis,有的话使用redis数据,放弃select 数据库,没有的话,select 数据库,然后将数据插入redis

update或者delete数据库钱,查询redis是否存在该数据,存在的话先删除redis中数据,然后再update或者delete数据库中的数据

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpssxg.html