Redis学习(1)---Redis概述
## 什么是NoSQL
概述
- NoSQL:Not Only SQL,意思不仅仅是SQL,它是属于非关系型数据库。那什么是关系型数据库?数据结构是一种有行有列的数据库。
- NoSQL数据库是为了解决高并发、高可用、高可扩展、大数据存储问题而产生的数据库解决方案。
- NoSQL可以作为关系型数据库的良好补充,但是不能替代关系型数据库。
- Redis就属于非关系型数据库,而传统的MySQL、Oracle、DB2、SQL Server等都是关系型数据库。
分类
- 键值存储数据库(Redis、Memcached)
- 列存储数据库(Cassandra、Hbase)
- 文档存储数据库(MongoDB、CouchDB、Couchbase)
- 图形存储数据库(Neo4j)
- 对象存储数据库(db4o)
- xml存储数据库(BaseX)
为什么需要NoSQL,主要针对以下问题
- High Performance——高并发读写
- Huge Storage——海量数据的高效率存储和访问
- High Scalablility&&High Availability——高可扩展性和高可用性
特点
- 灵活的数据模型
- 大数据量,高性能
- 易扩展
- 高可用
什么是Redis
Redis全名:Remote Dictionary Server(远程字典服务),由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis作为NoSql数据库的一种,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(有序集合(sorted set))和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集以及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同 方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
zset原为sorted set。为了避免sorted set简写sset导致命令冲突,所以改为zset。
Redis的出现,很大程度补偿了memcached这类key/value数据库存储的不足,在部分场合可以对关系型数据库起到很好的补充作用。它提供了Java、C/C++、C#、PHP、JavaScript、Perl、Object-C、Python、Ruby、Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
Redis的优势
- 性能极高——Redis的读取速度是110000次/s,写入速度是81000次/s 。
- 丰富的数据类型——Redis支持二进制案例的 Strings、Lists、Hashes、Sets以及Ordered Sets数据类型操作。
- 原子——Redis的所有操作都是原子性的。意思就是要么成功执行要么失败完全不执行。单个操作是原子性的,多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性——Redis还支持publish/subscribe(发布-订阅模式)、通知、key过期等特性。
Redis性能
下面是官方的bench-mark数据:
测试完成了50个并发执行100000个请求。
设置和获取的值是一个256字节字符串。
Linux box是运行Linux 2.6,这是X3320 Xeon 2.5 ghz。
文本执行使用loopback接口(127.0.0.1)。
结果:读的速度是110000次/s,写的速度是81000次/s 。
更多详细数据请见官方bench-mark page(http://code.google.com/p/redis/wiki/Benchmarks)
影响Redis性能的因素
- 网络带宽和延迟。在执行基准测试前使用ping快速检测客户端和服务器端的延迟是一个良好的做法。对于带宽,比较好的做法是估计Gbits/s 的吞吐量和网络的理论带宽值比较。在很多实际的情况,Redis的吞吐量在网络之前会受限于CPU。
- CPU也会是一个重要因素。由于单线程的,Redis受益于快速的含有巨大缓存的CPU。
- 内存的速度和容量对于小的对象影响不大。但对于大于10KB的对象,可能对需要注意。通常购买昂贵的快速内存模块并不是真正的很有效。
- Redis在虚拟机上运行慢。虚拟化对很多普通操作来说代价太高了,Redis并没有增加多少开销在所需的系统调用和网络中断上。
- 客户端和服务器在一台机器运行,对于基准测试TCP/IP回送和UNIX域套接字都可以使用。取决于平台,但UNIX域套接字比TCP/IP回送增加50%的吞吐量。
- 当大量使用pipelining时,UNIX域套接字获得的性能好处会减少。
- 当以太网访问Redis时,在数据大小小于以太网数据包的大小(大约1500字节)时,聚集命令使用pipelining会非常有效。
- 在多CPU套接字服务器,Redis的表现变得依赖于NUMA配置和处理位置。
- 在高端配置,客户端连接的数量也是一个重要的因素。基于epool/kqueue模型,Redis的事件循环是相当可伸缩的。
- 在高端的配置,通过调优NIC(s)配置和相关中断可能取得高吞吐量。
- 根据平台,Redis编译可以使用不同的内存分配器,这可能有不同的行为在原始速度、内部和外部的碎片方面
Redis的应用场景
- 缓存(例如:数据查询、短连接、新闻内容、商品内容等)
- 消息队列(例如:秒杀、抢购、12306等)
- 分布式锁(例如:String类型setnx方法,只有不存在时才能添加成功,返回true)
- 解决分布式集群架构中的Session分离问题(例如:Session共享)
- 计数器(例如:文章的阅读量、微博点赞数,允许一定的延迟,先写入Redis再定时同步到数据库)
- 位统计(例如:使用Redis的bitmaps统计用户留存率、活跃用户量等)
- 排行榜(例如:使用使用zset(sorted set)和一个计算热度的算法便可以轻松打造一个热度排行榜)
- 限流(例如:以访问者的ip和其他信息作为key,访问一次增加一次计数,超过次数则返回false)
- 商品筛选、好友关系、用户关注(例如:使用Redis来通过set解决传统数据库无法快速计算集合中交、并、差集功能)
- 数据过期处理(可以精确到毫秒)
- 内存数据库(例如:登录信息、购物车信息、用户浏览记录等)
- 支持发布订阅的消息模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!