什么是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解决传统数据库无法快速计算集合中交、并、差集功能)
  • 数据过期处理(可以精确到毫秒)
  • 内存数据库(例如:登录信息、购物车信息、用户浏览记录等)
  • 支持发布订阅的消息模式

Redis学习(1)---Redis概述的更多相关文章

  1. Redis学习笔记~Redis主从服务器,读写分离

    回到目录 Redis这个Nosql的存储系统一般会被部署到linux系统中,我们可以把它当成是一个数据服务器,对于并发理大时,我们会使用多台服务器充当Redis服务器,这时,各个Redis之间也是分布 ...

  2. redis学习笔记-redis的安装

    Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择, ...

  3. Redis学习笔记-Redis内部数据结构

    Redis内部数据结构 Redis和其他key-value数据库的很大区别是它支持非字符串类型的value值.它支持的value值的类型如下: sds (simple dynamic string) ...

  4. redis学习之——redis.conf配置(基本)文件学习

    # Redis configuration file example # Note on units: when memory size is needed, it is possible to sp ...

  5. Redis学习-redis概述

    最近刚刚接触了redis技术,对此有一些了解,这是简单做一点总结. Redis简介 首先,简单了解一下NoSQL(Not only sql),不要错误的理解为:没有SQL,而是不仅仅是SQL.NoSQ ...

  6. redis学习一 大体概述

    redis 命令查找:http://doc.redisfans.com/ 1,redis 技术简介以及疑问      redis是一个开源的,内存存储的数据结构服务器.可以用做数据库,高速缓存和消息队 ...

  7. redis学习笔记——Redis过期键的删除策略

    Redis过期键的删除策略 对于过期键一般有三种删除策略 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作: 惰性删除:放任键过期 ...

  8. Redis学习笔记——Redis的基本操作

    之前介绍过如何在ubuntu安装Redis服务器:https://www.cnblogs.com/zifeiy/p/9062738.html 接下来,我们在Redis上进行一些基本的操作. 所县使用命 ...

  9. Redis学习:Redis的安装与配置

    Redis是新兴的一种内存数据库技术,在数据高速读写方面有着明显的优势.前几天,Redis3.0正式版本发布,为我们带来了Redis集群功能.这一功能很早就投入了开发,直到现在才真正走进我们的视野.可 ...

随机推荐

  1. 串口应用:遵循uart协议发送N位数据(状态优化为3个,适用任意长度的输入数据,取寄存器中的一段(用变量作为边界))

    上一节中成功实现了发送多个字节的数据.把需要发送的数据分成多段遵循uart协议的数据依次发送.上一节是使用状态机实现的,每发一次设定为一个状态,所以需要发送的数据越多,状态的个数越多,代码越长,因而冗 ...

  2. 在oracle中创建管理员密码

    1.因为在安装Oracle11g时没有设置sys和system用户的密码,导致登陆不上SQLplus,后面用sqlplus / as sysdba ,密码为:root登陆上去创建了密码. 2.如下图

  3. postgresql逻辑备份工具pg_dump和pg_resotre学习

    (一)pg_dump备份 pg提供了pg_dump和pg_dumpall命令进行数据库的备份,pg_dumpall是将整个pg集群转储到一个脚本文件中,而pg_dump命令可以选择一个数据库或者部分表 ...

  4. DolphinScheduler 线上 Meetup 视频回放(07.25)

    上周六下午 DolphinScheduler 社区联合 Doris 社区进行了 2020 年首次线上 Meetup,各位讲师都做了非常精彩的分享,也吸引了 1900 多位技术伙伴观看. 其中 Dolp ...

  5. vscode 源代码不能自动stage change

    前言 vscode的强大不用赘述了,当你开始使用自然就会爱上他.围绕着IDE的编写体验,有很多强大的自带或者第三方插件,可以做到,编码,git管理,甚至部署一条龙[我司就有这样的插件],让大家沉迷其中 ...

  6. GCC常见命令

    rwx 对于目录和文件的区别 文件 目录 r 文件的内容可以被查看.支持cat.more.head...vim 目录的内容可以被查看.ls.tree w 文件的内容可以被添加.修改.删除.vim &g ...

  7. Blazor预研与实战

    背景 最近一直在搞一件事,就是熟悉Blazor,后期需要将Blazor真正运用到项目内.前期做了一些调研,包括但不限于 Blazor知识学习 组件库生态预研 与现有SPA框架做比对 与WebForm做 ...

  8. Flutter 检测报错 Unable to locate Android SDK.

    安装好 Flutter SDK 之后,官方建议使用flutter doctor检查 Flutter SDK 的相关配置信息. 如果 Android Studio 安装 Android SDK 的时候选 ...

  9. [CF1519D] Maximum Sum of Products (暴力)

    题面 有两个长为 n n n 的序列 a a a 和 b b b,至多反转 a a a 的一个子区间,最大化 ∑ i = 1 n a i ⋅ b i \sum_{i=1}^na_i\cdot b_i ...

  10. 面向对象06---static关键字

    public class Preson { { System.out.println("匿名代码块");// 2 } static { System.out.println(&qu ...