Redis入门

9 篇文章 0 订阅
2 篇文章 0 订阅


1.Redis简介

简介

Redis 是完全开源免费的,基于C语言开发,遵守BSD协议,是一个高性能的key-value非关系型数据库(NoSql)。
参考:Redis教程

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

简单操作

Redis支持Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作

String类型操作

set k1 1234567 #设置键值对,k1为键,1234567为值
get k1 #根据键k1查询对应的值
getrange k1 0 2 #查询k1对应的值,并获取值的从索引0开始到2位置的内容
mget k1 k2 k3 #批量查询键k1、k2、k3的值
incr k1 #将k1的内容自增1
incrby k1 2 #将k1的内容增加2
decr k1 #k1的内容自减1
decrby k1 2 #k1的内容减少2

Hash类型操作

Hash类型是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似于一个对象对应的属性和属性值。

hmset zhangsan age 16 gender male address chengdu #设置键为zhangsan,内容有age、gender、address和对应的值
hmget zhangsan age gender #获取键为zhangsan的内容中age和gender对应的值
hgetall zhangsan #查询张三键中所有的内容

List类型操作

List是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),可将list看作一个管道,即从管道的那一口添加和查询数据。

lpush list 1 2 3 4 5 #从列表左边依次添加1,2,3,4,5
lrange list 0 5 #从左边查询列表list的内容,由于是从左边读取,因此读取结果为5,4,3,2,1
lpop list #从左边弹出第一个元素,弹出5
rpush list 0 #从右边添加内容
rpop list #弹出列表右边第一个元素

Set类型操作

Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

sadd set zhangsan lisi wangwu zhangsan #将zhangsan、lisi、wangwu添加到set中,set存储内容无序,且不重复,因此只保留一个zhangsan
smembers set #查询set的内容,并且内容随机
spop set #随机弹出一个内容

SortedSet类型操作

SortedSet和Set一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zadd english 99 zhangsan 81 lisi 66 wangwu #在有序集合中添加english键,对应内容zhangsan、lisi、wangwu的成绩(score)分别为99,81,66
zcard english #返回有序集合成员数
zcount english 80 90 #查询成绩在80到90之间的数据(90>=score>=80)
zrank english zhangsan  #返回zhangsan在english集合中的位置索引
zscore english zhangsan #返回english成员zhangsan对应的分数
zrange english 0 20 withscores #返回english中前20位的成员
zrevrange english 0 20 withscores #查看english中后20位的成员

2.Redis持久化

RDB(Redis DataBase)

在指定时间间隔内将内存中的数据(SnapShot)写入磁盘,恢复将快照读取到内存中。

Redis会单独创建(fork)一个子进程进行持久化,现将数据写入一个临时文件,待持久化过程结束,再用临时文件替换上次持久化好的文件。整个过程主进程不进行任何的IO操作,确保性能。RDB保存为dump.rdb文件。

Fork:Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。
快照时间配置:
save 900 1 	#15分钟修改一次库
save 300 10	#5分钟修改十次库
save 60 10000	#1分钟修改10000次库

注:flushall会生成dump.rdb但是该文件存的是flushall之后的数据备份,无意义,需要恢复。

1.优点

  • 适合大规模数据恢复
  • 对数据完整性和一致性要求不高

2.缺点

  • 在备份时redis如果down,就会丢失最后一次快照所有修改
  • fork时内存中的数据被克隆一份,大概2倍的膨胀性需要考虑

3.总结

RDB是紧凑的文件,RDB在保存时父进程唯一需要做的就是fork一个子进程,接下来全部工作由子进程来做,父进程不需要任何IO操作,因此RDB持久化方式可以最大化redis性能。

RDB数据丢失风险大,RDB需要经常fork子进程来保存数据到硬盘,当数据集比较大的时候,fork进程耗时,导致redis在毫秒级不能响应客户端。

AOF(Append Only File)

日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件不能改写文件。Redis启动之初会读取该文件重新构建数据,即Redis重启的话会根据日志文件将写指令从前到后执行一次完成数据恢复。AOF文件保存形式:appendonly.aof

AOF配置
1.appendonly:默认no
2.appendfilename:aof文件名
3.Appendfsync:
	Always:同步持久化,每次数据发生变更立即被记录到磁盘,性能较差但数据完整性好
	Eversec:默认配置,异步执行每秒记录,若一秒down则数据丢失
	No
4.No-appendfsync-on-rewrite:重写时是否可以运用Appendfsync,默认no
5.Auto-aof-rewrite-min-size:设置重写基准值
6.Auto-aof-rewrite-percentage:设置重写基准值

AOF的Rewrite:

AOF采取文件追加方式,文件会越来越大,为了避免此情况新增重写机制,当AOF文件大小超过设定阈值,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof
Rewrite原理:AOF文件持续过大时,会fork出一条新进程来将文件重写,即先写临时文件最后再rename,遍历新进程中的内存数据,每条记录有一条set语句。重写AOF文件的操作,并没有读取旧的AOF文件,而是将整个内存中的数据库内容用命令方式从写一个新的aof文件。
触发机制:Redis记录上次重写时AOF的大小,默认配置是当AOF文件大小是上次rewirte后大小的一倍且文件大于64MB时出发

2.优点

  • 每秒同步:同步持久化,每秒发生数据变更会被立即记录到磁盘
  • 每修改同步:异步操作,每秒秒记录修改
  • 不同步:从不同步

3.缺点

  • 相同数据集的数据而言,aof文件远大于rdb,恢复速度慢
  • AOF运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rbd相同

4.总结

AOF是一个追加的日志文件,Redis在AOF体积变大时自动对AOF进行重写,AOF文件有序的保存路对数据库的写操作,这些写操作以redis协议形式保存,通俗易懂。
对于相同数据集,AOF文件体积大于RDB,并且AOF速度可能比RDB慢

AOF和RDB的选择:建议同时开启两种持久化方式,通常情况下redis会优先载入AOF恢复数据,
因为AOF通常比RDB更完整。建议只在slave上持久化RDB并且15分钟备份一次即可

3.Redis事务

redis事务:可以一次执行多个命令,本质是一组命令的集合,一个事物中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入加塞
事务作用:一个队列中,一次性、顺序性、排他性的执行一系列命令

事务相关命令

  • DISCARD:取消事务,放弃事务块内所有命令
  • EXEC:执行所有事务块内命令
  • MULTI:标记事务开始
  • UNWATCH:取消对key的监视
  • WATCH key:监视一个或多个key,如果事务执行前这些key被其他命令改动,那么事务被打断
补充:
事务特性(ACID)
原子性:事务要么全部成功,要么失败
一致性:事务执行前后数据库状态一致
隔离性:事务不影响另一个事务执行
持久性:事务对数据库的影响时永久的

在multi开启事务之后,如果在执行语句加入队列是报错(Error),执行exec后执行语句全体失败;
若在加入队列成功(ok),执行exec后发生错误,则队列中除报错语句外其他语句执行,即redis对事务部分支持。

WATCH监视

乐观锁、悲观锁和CAS

  • 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
  • 乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量。提交版本必须大于记录的当前版本才能执行更新
  • CAS(Compare and swap,比较交换):是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操作数:需要读写的内存值 V、进行比较的值 A、拟写入的新值 B。当且仅当 V 的值等于 A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作)。一般情况下是一个自旋操作,即不断的重试。

WATCH和UNWATCH

WATCH指令类似乐观锁,事务提交时,如果key值已被别的客户端改变,比如某个list已被别的客户端push/pop,整个事务队列都不会被执行。
通过WATCH命令在事务执行之前监控了多个keys,倘若在WATCH之后有任何key的值发生变化,exec命令执行的事务都将被放弃,同时返回nill应答以通知调用者事务执行失败。
监视一个或多个key,如果事务执行前这些key被其他命令改动,那么事务被打断。取消对所有key的监视,一旦执行exec后加的所有监控锁都会被取消

Redis事务特性

  • 单独隔离操作:事务中的所有命令都会被序列化,按顺序执行,事务在执行过程中不会被其他客户端发来的请求打断
  • 没有隔离级别:队列中的所有命令没提交都不会被执行
  • 不保证原子性:Redis同一个事务中如果有一条命令执行失败,其后命令仍会执行,没有回滚

Redis发布和订阅

进程间的一种消息通信模式,发布者(pub)发送消息,订阅者(sub)接收消息
命令:

  • PSUBSCRIBE:订阅一个或多个符合给定模式的频道
  • PUBSUB:查看订阅与发布系统状态
  • PUBLISH:将信息发送到指定频道
  • PUNSUBSCRIBE:退订所有给定模式的频道
  • SUBSCRIBE:订阅给定的一个或多个频道信息
  • UNSUBCRIBE:指推定给定的频道

4.Redis主从复制

Master-Slave

主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slave机制,Master以写为主,Slave以读为主。
目的:读写分离和容灾恢复

配置方案

只配从库不配主库,从库配置:slaveof 从库IP 从库端口

一主二从

一个主节点两个从节点

从节点接替

上一个slave可以是下一个slave的master,slave同样可以接受其他slave的连接和同步请求,那么该slave作为链条中的下一个master,可以减轻master的写压力
缺点:中途变更转向会清楚之前的数据,重新建立拷贝

自动替换

使当前数据库停止与其他数据库同步,变成master

主从复制原理:
1.Slave启动成功后连接到master会发送一个sync命令
2.master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令
3.在后台进程执行完毕之后,master将传送整个数据文件到slave,已完成一次完全同步

全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中
增量复制:master继续将新的所有收集到的修改命令依次传给slave完成同步
注:主要重新连接master,一次完全同步(全量复制)就会被执行

哨兵模式

能够从后台监控主机是否故障,如果故障能自动将slave变成master,即不用手动在控制台输入slaveof指定master。故障mater重新启动后将变成slave,原来的mater不变。
复制延时:由于所有的写操作都是先在master上操作,然后同步更新到slave上,所以master同步到slave机器上有一定的延迟,当系统很繁忙的时候延迟更加严重,slave机器数量增加也会加重该问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值