2、Redis 是一个 key-value 存储系统,它支持存储的 value 类型相对更多,包括 string、list、set、zset(sorted set –有序集合)和 hash。这些数据结构都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis 支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中,Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步。
3、Redis 提供了 java、C/C++、PHP、JavaScript、Perl、Object-C、Python、Ruby、Erlang 等客户端,使用很方便。
4、Reids 支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他服务器的主服务器。这使得 Redis 可执行单层数复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
5、 在我们日常的 Java Web 开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。
[](()
二、NoSQL 技术
为了克服上述问题,java web 项目通常会引入 NoSQL 技术,这是 一种基于内存的数据库,并且提供一定的持久化功能。
Redis 和 MongoDB 是当前使用最广泛的 NoSQL,?而就 Redis 技术而言,它的性能十分优越,可以支持每秒十几万的读写操作,其性能远超数据库,并且还支持集群、。分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中,更让人欣慰的是它还支持一定的事务能力,这保证了高并发的场景下数据的安全和一致性。
三、Redis 的高并发和快速原因
-
Redis 是基于内存的,内存的读写速度非常快;
-
Redis 是单线程的,省去了很多上下文切换线程的时间;
-
Redis 使用多路复用技术,可以处理并发的连接。非 IO 内部实现采用 epoll,采用了 epoll 自己实现的简单的事件框架。epoll 的读写、关闭、连接都转化为事件,然后利用 epoll 的多路复用特性,绝不在 IO 上浪费一点时间。
四、Redis 为什么是单线程的
1、官方答案
Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络宽带。既然单线程容易实现,而且 CPU 不会成为瓶颈,那么顺理成章的采用单线程的方案。
2、详细原因
(1)不需要各种锁的性能消耗
Redis 的数据结构并不全是 key-value 形式的,还有 list,hash 等复杂的结构,