问题:
前端时间项目开始阶段,组长强烈支持使用Redis作为缓存,并且将数据库的数据存入Redis中,查询时查Redis,现在想来也找不到为什么,但是因为后来项目嗝屁了,也就不了了之,但是之后,闲暇之余,一直想尝试,自己实现像查数据库那样方便的查询Redis,后来也就动手了,具体的实现将会在另外一篇文章介绍,这里先整理下问题。项目实现之后,实际测试之后发现,这样从Redis查数据,并没有比从数据库查数据快多少(使用的是当前比较快速的数据库连接池 屎咖喱(hikari)),以下是简单的测试数据(非高并发环境测试,持久层使用的mybatis)
测试数据 | mysql | Redis |
---|---|---|
按照6万条数据主键查询一条数据 | 6-8 毫秒 | 4-7毫秒 |
按照91条查询全部数据(实际上实现是按照非唯一索引查询) | 166毫秒 | 66.25毫秒 |
上边对比发现,对于获取单条数据来说,Redis比数据库并快多少,但是对于非唯一索引来说,虽然快了100毫秒,但是维护成本却大大增加了,貌似得不偿失。
因此这里想总结下,为什么要是用Redis?
答:
1.分布式系统要使用。
2.快速查询,且是存储临时值的可以使用。
3.并发量大,数据库链接扛不住时。
4.不涉及数据库和Redis数据同步问题。
以下分析下自己答案的支撑点
Redis的优点
1.nosql 数据库
2.可数据持久化
3.支持很多数据结构
4.主从同步
5.安全存储,灾难恢复
6.支持订阅发布功能
7.支持多种语言
nosql
1.灵活的数据结构
2.快速的读写
3.不支持SQL
4.产品不够成熟
数据持久化
Redis支持落地本地文件
多种数据结构
Redis支持String、Hash、List、Set、 SortSet 类型的操作
主从同步
分布式系统中节点间需要一个公用的内存,同事,这个内存还要保证高可用,Redis正好符合以上使用场景。
订阅发布功能
以往使用订阅发布,都是使用的zookeeper的watch功能,这里还是在思考这个问题的时候发现有这个功能,没有尝试过,但确实是有,不做过多的bb.
支持多种语言
Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang
以上这么多优点,支持我使用的目前看中两点:
1.分布式
2.快
分布式确实是Redis在微服务模式下作为分布式缓存必备的良药,但是快,因为我尝试的从数据库获取跟从Redis获取,中间差距不是很大(非高并发)。这里就研究下,理论上,到底快在哪里?
快1:
数据放在内存中,纯内存访问,Redis将所有数据放在内存中,非数据同步正常工作中,是不需要从磁盘读取数据的,0次IO。内存响应时间大约为100纳秒,这是Redis速度快的重要基础
快2:
C语言实现,大学基础,不多BB
快3:
单线程
单线程简化算法的实现,并发的数据结构实现不但困难且测试也麻烦。第二,单线程避免了线程切换以及加锁释放锁带来的消耗,对于服务端开发来说,锁和线程切换通常是性能杀手。当然了,单线程也会有它的缺点,也是Redis的噩梦:阻塞。如果执行一个命令过长,那么会造成其他命令的阻塞,对于Redis是十分致命的,所以Redis是面向快速执行场景的数据库。
快4:
非阻塞多路I/O复用机制
。 。。 。。。
参考文章:https://baijiahao.baidu.com/s?id=1630328585512283051&wfr=spider&for=pc
综上说是:其实不建议将表存进Redis中,特别是没有高并发存在,或者分布式场景的,完全没有必要使用Redis来玩。好像是废话,都开始看Redis了,好像都是分布式服务了吧,那么推荐下另外一篇文章,基于mybatis插件的Redis缓存查询。:)