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数据库中的数据