周会-Redis简介
*为什么提本话题:Maps优化的时候,大部分时间都花在数据库查询上,并且不是某一个SQL执行时间特别长,而是很多小SQL总体时间很长。
当时就在想有没有那么些数据,特别是不经常变动的数据,但是经常查询,把它们保存起来,做一个中央缓存。
然后就想到Redis,一个比较流行的缓存应用。*
Redis简介
关系型数据库 与 非关系型数据库 (SQL 与 NoSQL)
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;(对比MongoDB)
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是键值对或者文档等。
优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器(内存)作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;(Redis可以保证单个客户端执行的多条命令是原子性的,类似于事务)
3、数据结构相对复杂,复杂查询方面稍欠。
为什么Maps中没有使用Redis
Redis一般是作为缓存使用,解决的是高并发下数据库IO瓶颈的问题(主要是查询)。
Maps是客户端应用,用户少,并发不高,与Web项目不同。并且Maps系统中有分库的机能,数据库一般不会达到瓶颈(缺点就是系统变复杂)。
但是Maps中有一部分数据也是可以使用Redis的,在调用一个接口前,查询的数据库对应信息、用户认证信息等等(日志中体现的),就可以使用Redis做一个中央缓存。
Redis为什么快
主要原因有两个:
1、数据在内存中(但是有持久化机制)
2、采用的是IO多路复用机制(也就是NIO)
关于NIO和阻塞式IO可以看这个:浅析NIO https://www.cnblogs.com/lixin-link/p/11279448.html
Redis数据类型
Redis本身是key-value形式的数据库,这里说的数据类型指的是value中的类型。
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
Redis常见应用场景
Redis常见的应用场景有
1、会话缓存(最常用)
2、消息队列(支付)
3、活动排行榜或计数
4、发布,订阅消息(消息通知)
Redis过期时间
有时候放在Redis中的数据,想让它时间到了自动消失,比如缓存、手机验证码这样的数据,可以设置过期时间。
Redis淘汰策略
Redis可设置的内存空间是512G,物理内存不够的时候:
1、volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
2、volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
3、volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
4、allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
5、allkeys-random:从数据集中任意选择数据淘汰
6、no-enviction(驱逐):禁止驱逐数据
默认设置是6:禁止驱逐数据,也就是说内存满了后再添加值会出错。
常用设置是4:淘汰最少使用。
Redis持久化
两种持久化方式:
RDB:定期将内存中的信息写成文件
AOF:定期将执行的写删更新命令记录成文件
有了持久化之后,服务重启之后Redis可以快速回复数据,不用重新添加缓存。
扩展
Redis与服务器数据的一致性、缓存穿透、缓存击穿、缓存雪崩等问题、
小结
“如无必要,勿增实体”
Redis可以解决一些问题,但是也会让系统更加复杂。