Redis详细介绍

1.数据库类型

关系型数据库: 以表的形式存储数据,以键和约束的形式维护数据类型,这样的数据库就是关系型数据库
MySQL, Oracle, SQLServer, DB2
非关系型数据库:NoSQL: Not only SQL,比如Redis,MengoDB

为什么要有非关系型数据库?
关系型数据随着数据量的增加,用户的增加,出现了一些难以解决的问题
高并发问题: 瞬间有多个读写请求要同时操作数据库,秒杀,双11,抢票,春节摇红包
高性能问题: 从海量数据里瞬间找到并操作某一条数据,微博
高扩展性问题: 数据库集群里,增加数据库节点时,要进行数据的迁移,迁移的性能很低

非关系型数据库: 数据之间没有关系了
易扩展,高性能,高可用
灵活的数据模型: 不以表的形式存储数据,可以根据自己的需求,使用合适的存储模型

为什么不抛弃关系型数据库,全部使用非关系型数据库?
因为实际开发时,业务数据之间是有关系要维护的。如果不使用关系型数据库,就需要自己编写代码、自己维护数据之后的关系;可以直接使用有关系型数据库帮我们维护。实际开发中,我们主数据库仍然是关系型数据库,非关系型数据库是作为辅助数据库使用的。比如:Redis就是作为缓存数据库使用的

2.Redis简介

Redis数据库: 是一个C语言编写的开源的高性能数据库, 是以key-value键值对的形式存储数据,数据是保存在了内存中,所以有极高的读写性能。官方数据: 读110000次/S, 写81000次/S
Redis的端口: 6379 merz

3.Redis的数据类型

Redis是键值对key-value的形式存储数据的
key的类型: 始终是字符串,不要超过1024个字符
value的类型: 有5种
string: 字符串
hash: 哈希类型
list: 链表类型
set: 无序不重复集合类型
zset (sorted set): 有序不重复集合类型

4.Redis的操作

操作string
设置数据: set key value
获取数据: get key
删除数据: del key

操作hash
设置数据: hset key field value
获取数据: hget key field
删除数据: hdel key field

操作list
从左边添加: lpush key value1 value2 value3…
从右边添加: rpush key value1 value2 value3…
查询数据: lrange key stratindex endindex
查询全部: lrange mylist 0 -1
弹出数据:
从左边弹出: lpop key, 弹出最左边那个数据
从右边弹出: rpop key, 弹出最右边那个数据

操作set
添加数据: sadd key member1 member2…
查询所有数据: smembers key
随机获取数据: srandmember key
删除数据: srem key member

5.Redis的通用key操作

keys pattern: 查询key的
keys * : 查询所有的key
keys my * : 查询所有以my开头的key
keys ??? : 查询所有三个字符的key
del key : 删除key
exists key: 判断key是否存在
type key: 判断key的类型

6. Redis持久化

持久化: Redis会定时把内存里的数据,持久保存到磁盘文件上
持久化机制有两种:
RDB模式: 快照模式,默认开启状态的
AOF模式: 需要手动开启

RDB模式
也叫作快照模式,是在某些时候,把Redis内存里的数据快速保存到磁盘文件上。当重启redis时,读取快照文件,把数据恢复到内存当中

什么时候会生成快照文件?
save 900 1
save 300 10
save 60 10000
1次变更,要900秒存一次
10次变更,要300秒存一次
10000次变更,要60秒存一次

保存的文件在什么地方?
默认保存在redis的当前目录,文件名称是dump.rdb
优点:
性能强,对性能影响不大
方便备份恢复
缺点:
可能丢失数据

AOF模式
append only file,是在某些时候,把执行的数据变更命令,追加保存到磁盘文件上。当重启时,会读取文件,按照里边的命令的顺序执行一遍,相当于:重构数据库
默认状态是关闭的
如何开启AOF模式?
修改redis.conf配置文件,设置为: appendonly yes
修改了配置文件之后,需要重启redis服务

什么时候保存变更命令到磁盘文件上?
#appendfsync always
appendfsync everysec
#appendfsync no
always: 每次执行数据变更命令,会立即把命令保存到磁盘文件上
everysec: 每秒把数据变更命令保存一次
no: 不保存

保存的文件在什么地方?
在redis的当前目录下,文件名称是: appendonly.aof
优点:
不容易丢失数据
缺点:
性能有影响
容易产生冗余数据

7.缓存在web开发里的使用方式

Redis是作为缓存数据库使用的,使用的方式是: 主数据库是MySQL,缓存数据库Redis作为辅助数据库
注意:
1.什么样的数据适合使用缓存?
查询频繁,但是变更不多
对性能要求特别高的数据,可以使用缓存
2.操作缓存的代码放在服务端的哪一层?
建议放在service层
3. 如果数据变化了,缓存里的数据如何处理?
清楚掉缓存数据
4.换使用的逻辑
优先从缓存里查
如果缓存里没有:从数据库里查询得到,放到缓存里

8. Redis是单线程还是多线程?

单线程,Redis6.0之后是多线程

为什么单线程那么快?
1.完全基于内存,绝大部分请求是纯粹的内存操作,非常快速
2.数据结构简单,对数据操作也简单,Redis中的数据结构是专门设计的
3. 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多线程或者多线程的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁释放锁的操作,没有因为可能出现死锁而导致的性能消耗
4.使用多路I/O复用模型,非阻塞IO
5.使用底层模型不同,它们之间底层实现方式以及客户端之间通信的应用协议不一样,Redis使用自己的VM机制,一般的系统调用系统函数的话,会浪费一定的时间去移动和请求,redis不会

9. redis击穿,穿透,雪崩的解决办法

击穿: 单个Key在缓存中查不到,去数据库查询;如果数据库数据量大并且是高并发的情况下有可能造成数据库压力过大而崩溃; 关键词: key失效
穿透: 使用key访问,发现DB返回的都是null; 关键字:value失效
雪崩: redis的key大面积失效,造成服务瘫痪

击穿解决办法:
1.使用互斥锁
2.接口限流与熔断,升级
3.布隆过滤器
4.设置value永不过时

雪崩解决办法:
1.在缓存失效后,通过锁或队列来控制读数据库写缓存的线程数量,比如某个key的查询只允许用一个线程查询和写数据,其他线程等待
2.reload缓存机制,预先去更新缓存,在即将发生大并发访问前手动触发加载缓存
3.不同的key,设置不同的过期时间,具体值可以根据业务决定,让缓存失效的时间点尽量均匀
4.做二级缓存,或者双缓存策略。A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期(比较复杂)

10.redis集群策略

redis集群有三种模式:
1.Master主从模式:一主多从,Master主数据库可以读写操作,slave从数据库只读,从数据库同步主数据库的数据;主数据库挂了,就只能读数据了,从数据库挂了,重启后同步主数据的数据
2.Sentinel哨兵模式:建立在Master的基础上,主从模式Master挂了就无法读写了,但是Sentinel模式的Master挂了之后,会选举出新的Master,并修改其他slave数据库的配置文件指向新的Master,原来的Master重启后成为slave数据库
3.Cluster模式:是Master模式和Sentinel模式的结合体,前两个都是一主多从模式,Cluster是多主从数据库(一主一从或一主多从),数据存储量大大增加,可以增加删除节点
这三个redis集群方式,重点都在于配置文件

对于三种模式的点评:
主从模式的集群,master数据库进行读写,slave数据库可以进行读,一是实现了读写分离,分摊master的压力;二是slave数据库做了容灾备份处理,但是主数据库一旦挂了,无法进行写操作,服务基本瘫痪;
哨兵模式有主从模式的优点,多加了一个主数据库挂了变更master服务器的优势,redis 2.8之后提供了一个哨兵工具,可以自动化的系统监控和故障恢复,但是这两个模式都存在主数据库单一的弊端,假如我的数据量过大,单个数据库是无法支撑的;
那么就有了集群模式的横向扩展,集群模式没有主从数据库的概念,而是有主从分片的概念,每个数据都被存到多个分片,主从分片之间会有数据同步,但是每个数据库存储内容不一样

Redis如何实现主从同步?待补充

11.Redis的过期键删除策略

1.定时删除:实现方式,创建定时器
2.惰性删除:每次获取键时,检查是否过期
3.定期删除:每隔一段时间,对数据库进行一次检查,删除过期键,由算法决定删除多少过期键和检查多少数据库

优缺点:
1.定时删除,对内存友好,但是对cpu很不友好
2.惰性删除,对cpu友好,对内存很不友好
3.定期删除,是两种折中,但是,如果删除太频繁,将退化为定时删除,如果删除次数太少,将退化为惰性删除

12.Redis键淘汰策略

redis内存不足时的键淘汰策略: 即使有着过期策略,redis内存仍然可能不够用,这个时候就需要一个兜底措施来保证redis的内存够用

noeviction: 新写入操作会报错,这个一般没人用吧,实在是太恶心了。
allkeys-lru:在键空间中,移除最近最少使用的 key(这个是最常用的)。
allkeys-random:在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。
volatile-lru:在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
volatile-random:在设置了过期时间的键空间中,随机移除某个 key。
volatile-ttl:在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值