目录
为什么要用Redis
Redis 的特点:
Redis的五种数据结构:
1.K-Value value String 字符串类型
2.Hash (哈希)
3.List
4.Set 集合
5.zset 有序集合
Redis的两种持久化方式
RDB
AOF
Redis 模式
1.单机模式
2.主从模式
3.哨兵模式
4.cluster模式
Redis数据更新
主库过期策略
从库过期策略
Redis Pipeline 批处理
Redis事务
为什么要用Redis
1.现在存在即时性要求不高的,但是访问量大且频率不高的数据这样如果把数据缓存,这样可以减少读取数据库,提高系统性能,所以需要缓冲。缓存最快的是内存缓存,是速度最快,但是现在一般都是分布式架构,内存缓存对于微服务和分布式不适应,所以需要缓存中件。所以缓存中件就需要操作性能高(读取速度快 );
2.还有在分布式里面,对很多资源的操作需要加锁来保证数据安全和性能稳定,但是本地锁不使用于分布式中。所以用Redis来实现分布式锁。
Redis是一个开源的使用C语言编写的一个kv存储系统,是一个速度非常快的非关系远程内存数据库。通过复制、持久化和客户端分片等特性,用户可以很方便地将redis扩展成一个能够包含数百GB数据和每秒处理上百万次的请求的系统。目前支持多种语言的api,方便用户使用。与关系型数据库相比,redis的命令请求不需要经过查询分析器或查询优化器进行处理,也避免了更新数据时引起的随机读\写,这些慢操作。它直接读写内存中的数据,并且数据是按照一定的数据结构存储的。所以它的速度非常快。
redis同时也内置了事务、LUA脚本、复制等功能,提供两种持久化选项,一种是每隔一段时间将数据导入到磁盘(快照模式),另一种是追加命令到日志中(AOF模式)。如果只是作为高效的内存数据库使用也可以关闭持久化功能。通过哨兵(sentinel)和自动分区(Cuuster)的方式可以提高redis服务器的高可用性。
Redis 的特点:
1.性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s;
2.Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储;
3.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;
4.Redis支持数据的备份,即master-slave模式的数据备份;
5.Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来;
6.丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis的五种数据结构:
1.K-Value value String 字符串类型
是redis中最基本的数据类型,一个key对应一个value。
String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。
写操作:set
读操作:get
删除操作:del
自增操作:incr
自减读操作:decr
运用场景:
1.接口数据缓存:Value 利用标准的Json序列化,保证可以其他数据,平台共用;
2.计数器
3.session 保存:整合SpringSession + Redis 实现seesion 共享。
2.Hash (哈希)
是一个Mapmap,指值本身又是一种键值对结构,如 value={{field1,value1},......fieldN,valueN}}
操作: 使用:所有hash的命令都是 h 开头的 hget 、hset 、 hdel 等
运用场景:
1.接口缓存;
2.经常更新且操作频繁的数据存储,如购物车数据就可以用redis来存储;
3.List
List 说白了就是链表(redis 使用双端链表实现的 List),是有序的,value可以重复,可以通过下标取出对应的value值,左右两边都能进行插入和删除数据。
使用列表的技巧
- lpush+lpop=Stack(栈)
- lpush+rpop=Queue(队列)
- lpush+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息队列)
使用场景:可以用于实现消息队列,也可以使用它提供的range命令,做分页查询功能;
4.Set 集合
集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中 1. 不允许有重复的元素,2.集合中的元素是无序的,不能通过索引下标获取元素,3.支持集合间的操作,可以取多个集合取交集、并集、差集。
命令都是以s开头的 sset 、srem、scard、smembers、sismember
使用场景:可以用作某些去重功能,例如用户名不能重复等,另外,还可以对集合进行交集,并集操作,来查找某些元素的共同点时可以用;
5.zset 有序集合
有序集合和集合有着必然的联系,保留了集合不能有重复成员的特性,区别是,有序集合中的元素是可以排序的,它给每个元素设置一个分数,作为排序的依据。
(有序集合中的元素不可以重复,但是score 分数 可以重复,就和一个班里的同学学号不能重复,但考试成绩可以相同)。
有序集合的命令都是 以 z 开头 zadd 、 zrange、 zscore
实战场景:
1.排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。
Redis的两种持久化方式
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)
RDB
在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
AOF
那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高
Redis 模式
1.单机模式
2.主从模式
3.哨兵模式
4.cluster模式
Redis数据更新
redis是单线程,收割时间也会占用线程处理时间,如果收割过于频繁,会导致读写出现卡顿;
主库过期策略
1.1、定时扫描
首先将每个设置了过期时间的key放到一个独立的hash中,默认每秒定时遍历这个hash而不是整个空间:
并不会遍历所有的key,采用一种简单的贪心策略
如果有大量的key在同一时间段内过期,就会造成数据库的集中访问,就是缓存雪崩!
1.2、惰性策略
客户端访问的时候,会对这个key的过期时间进行检查,如果过期了就立即删除。惰性策略是对定时策略的补充,因为定时策略不会删除所有过期的key
从库过期策略
redis不会扫描从库,删除主库数据的时候,在aof文件里生成一条del指令,在主从同步的时候,从库会执行这条指令,删除过期key。
Redis Pipeline 批处理
Pipeline能够将一组Redis命令组装起来,通过一次请求发给Redis服务端,Redis服务端执行完这些命令之后再将这些命令的结果一次性返回给客户端。
Redis执行一条命令分为四个步骤:
发送命令
命令排队
命令执行
返回结果
其中发送命令和返回结果两步的时间和称之为Rount Trip Time(RTT,往返时间)。假设我们以工要向Redis服务端发送 n 条消息,使用Pipeline就能帮我们节省 n - 1 次RTT时间。
Redis事务
Redis的事务实质上是命令的集合,在一个事务中要么所有命令都被执行,要么所有事物都不执行。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
需要注意的是:
1.Redis的事务没有关系数据库事务提供的回滚(rollback),所以开发者必须在事务执行失败后进行后续的处理;
2.如果在一个事务中的 命令,那么所有的命令都不会执行;
3.如果在一个事务中出现 运行 错误,那么正确的命令会被执行。