NoSql数据库Redis系列1——Redis简介

一、redis介绍

(一)、Redis 简介

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

(二)、Redis可以做什么

1.缓存

缓存机制几乎在所有的大型网站都有使用, 合理地使用缓存不仅可以加快数据的访问速度, 而且能够有效地降低后端数据源的压力。 Redis提供了键值过期时间设置, 并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。 可以这么说, 一个合理的缓存设计能够为一个网站的稳定保驾护航。

2.排行榜系统

排行榜系统几乎存在于所有的网站, 例如按照热度排名的排行榜, 按照发布时间的排行榜, 按照各种复杂维度计算出的排行榜, Redis提供了列表和有序集合数据结构, 合理地使用这些数据结构可以很方便地构建各种排行榜系统。

3.计数器应用

计数器在网站中的作用至关重要, 例如视频网站有播放数、 电商网站有浏览数, 为了保证数据的实时性, 每一次播放和浏览都要做加1的操作, 如果并发量很大对于传统关系型数据的性能是一种挑战。 Redis天然支持计数功能而且计数的性能也非常好, 可以说是计数器系统的重要选择。

4.社交网络

赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能, 由于社交网站访问量通常比较大, 而且传统的关系型数据不太适合保存这种类型的数据, Redis提供的数据结构可以相对比较容易地实现这些功能。

5.消息队列系统

消息队列系统可以说是一个大型网站的必备基础组件, 因为其具有业务解耦、 非实时业务削峰等特性。 Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够足够强大, 但是对于一般的消息队列功能基本可以满足

(四)、Redis不可以做什么
实际上和任何一门技术一样, 每个技术都有自己的应用场景和边界, 也就是说Redis并不是万金油, 有很多适合它解决的问题, 但是也有很多不合适它解决的问题。 我们可以站在数据规模和数据冷热的角度来进行分析。站在数据规模的角度看, 数据可以分为大规模数据和小规模数据, 我们知道Redis的数据是存放在内存中的, 虽然现在内存已经足够便宜, 但是如果数据量非常大, 例如每天有几亿的用户行为数据, 使用Redis来存储的话, 基本上是个无底洞, 经济成本相当的高。站在数据冷热的角度看, 数据分为热数据和冷数据, 热数据通常是指需要频繁操作的数据, 反之为冷数据, 例如对于视频网站来说, 视频基本信息基本上在各个业务线都是经常要操作的数据, 而用户的观看记录不一定是经常需要访问的数据, 这里暂且不讨论两者数据规模的差异, 单纯站在数据冷热的角度上看, 视频信息属于热数据, 用户观看记录属于冷数据。 如果将这些冷数据放在Redis中, 基本上是对于内存的一种浪费, 但是对于一些热数据可以放在Redis中加速读写, 也可以减轻后端存储的负载, 可以说是事半功倍。所以, Redis并不是万金油, 相信随着我们对Redis的逐步学习, 能够清楚Redis真正的使用场景。

(五)、redis特性

Redis之所以受到如此多公司的青睐, 必然有之过人之处, 下面是关于Redis的8个重要特性。
1.速度快
正常情况下, Redis执行命令的速度非常快, 官方给出的数字是读写性能可以达到10万/秒, 当然这也取决于机器的性能, 但这里先不讨论机器性能上的差异, 只分析一下是什么造就了Redis除此之快的速度, 可以大致归纳为以下四点:Redis的所有数据都是存放在内存中的,

  • Redis是用C语言实现的, 一般来说C语言实现的程序“距离”操作系统更近, 执行速度相对会更快。
  • Redis使用了单线程架构, 预防了多线程可能产生的竞争问题。
  • 作者对于Redis源代码可以说是精打细磨, 曾经有人评价Redis是少有的集性能和优雅于一身的开源代码。

2.基于键值对的数据结构服务器
几乎所有的编程语言都提供了类似字典的功能, 例如Java里的map、Python里的dict, 类似于这种组织数据的方式叫作基于键值的方式, 与很多键值对数据库不同的是, Redis中的值不仅可以是字符串, 而且还可以是具体的数据结构, 这样不仅能便于在许多应用场景的开发, 同时也能够提高开发效率。Redis的全称是REmote Dictionary Server, 它主要提供了5种数据结构: 字符串、 哈希、 列表、 集合、 有序集合, 同时在字符串的基础之上演变出了位图(Bitmaps) 和HyperLogLog两种神奇的“数据结构”, 并且随着LBS(Location Based Service, 基于位置服务) 的不断发展, Redis3.2版本中加入有关GEO(地理信息定位) 的功能, 总之在这些数据结构的帮助下, 开发者可以开发出各种“有意思”的应用。
3.丰富的功能
除了5种数据结构, Redis还提供了许多额外的功能:提供了键过期功能, 可以用来实现缓存。提供了发布订阅功能, 可以用来实现消息系统支持Lua脚本功能, 可以利用Lua创造出新的Redis命令。提供了简单的事务功能, 能在一定程度上保证事务特性。提供了流水线(Pipeline) 功能, 这样客户端能将一批命令一次性传到Redis, 减少了网络的开销。

4.简单稳定
Redis的简单主要表现在三个方面。 首先, Redis的源码很少, 早期版本的代码只有2万行左右, 3.0版本以后由于添加了集群特性, 代码增至5万行左右, 相对于很多NoSQL数据库来说代码量相对要少很多, 也就意味着普通的开发和运维人员完全可以“吃透”它。 其次, Redis使用单线程模型, 这样不仅使得Redis服务端处理模型变得简单, 而且也使得客户端开发变得简单。 最后, Redis不需要依赖于操作系统中的类库(例如Memcache需要依赖libevent这样的系统类库) , Redis自己实现了事件处理的相关功能。Redis虽然很简单, 但是不代表它不稳定。 以笔者维护的上千个Redis为例, 没有出现过因为Redis自身bug而宕掉的情况。
5.客户端语言多
Redis提供了简单的TCP通信协议, 很多编程语言可以很方便地接入到Redis, 并且由于Redis受到社区和各大公司的广泛认可, 所以支持Redis的客户端语言也非常多, 几乎涵盖了主流的编程语言, 例如Java、 PHP、Python、 C、 C++、 Nodejs等
6.持久化
通常看, 将数据放在内存中是不安全的, 一旦发生断电或者机器故障,重要的数据可能就会丢失, 因此Redis提供了两种持久化方式: RDB和AOF, 即可以用两种策略将内存的数据保存到硬盘中(如图1-1所示) , 这样就保证了数据的可持久性, 第5章我们将对Redis的持久化进行详细说明。

分享图片


图1-1 Redis内存到磁盘的持久化
7.主从复制
Redis提供了复制功能, 实现了多个相同数据的Redis副本(如图1-2所示) , 复制功能是分布式Redis的基础。 第6章我们将对Redis的复制进行详细说明。

分享图片


8.高可用和分布式
Redis从2.8版本正式提供了高可用实现Redis Sentinel, 它能够保证Redis节点的故障发现和故障自动转移。 Redis从3.0版本正式提供了分布式实现Redis Cluster, 它是Redis真正的分布式实现, 提供了高可用、 读写和容量的扩展性。

(六)、Redis 优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings,Lists,Hashes,Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe,通知,key 过期等等特性。

(七)、Redis与其他key-value存储有什么不同?

  • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
  • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

(八)、Redis在windows下的常规操作

打开一个 cmd 窗口 使用cd命令切换目录到 C:\redis 运行 redis-server.exe redis.windows.conf 。

如果想方便的话,可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个 redis.windows.conf 可以省略,如果省略,会启用默认的。输入之后,会显示如下界面:

分享图片

这时候另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。

切换到redis目录下运行 redis-cli.exe -h 127.0.0.1 -p 6379 。

设置键值对 set myKey abc

取出键值对 get myKey

分享图片

二、Redis重大版本

Redis借鉴了Linux操作系统对于版本号的命名规则: 版本号第二位如果是奇数, 则为非稳定版本(例如2.72.93.1) , 如果是偶数, 则为稳定版本(例如2.62.83.03.2) 。 当前奇数版本就是下一个稳定版本的开发版
本, 例如2.9版本是3.0版本的开发版本。 所以我们在生产环境通常选取偶数版本的Redis, 如果对于某些新的特性想提前了解和使用, 可以选择最新的
奇数版本。介绍一门技术的版本是很多技术图书的必备内容, 通常读者容易忽略,但随着你对这门技术深入学习后, 会觉得备感亲切, 而且通常也会关注新
版本的特性, 本小节将对Redis发展过程中的一些重要版本及特性进行说明。
1.Redis2.6
Redis2.62012年正式发布, 经历了17个版本, 到2.6.17版本, 相比于
Redis2.4, 主要特性如下:
1) 服务端支持Lua脚本。
2) 去掉虚拟内存相关功能。
3) 放开对客户端连接数的硬编码限制。
4) 键的过期时间支持毫秒。
5) 从节点提供只读功能。
6) 两个新的位图命令: bitcountbitop
7) 增强了redis-benchmark的功能: 支持定制化的压测, CSV输出等功
能。
8) 基于浮点数自增命令: incrbyfloathincrbyfloat
9redis-cli可以使用--eval参数实现Lua脚本执行。
10shutdown命令增强。
11info可以按照section输出, 并且添加了一些统计项。
12) 重构了大量的核心代码, 所有集群相关的代码都去掉了, cluster
能将会是3.0版本最大的亮点。
13sort命令优化。
2.Redis2.8
Redis2.820131122日正式发布, 经历了24个版本, 到2.8.24版本,
相比于Redis2.6, 主要特性如下:
1) 添加部分主从复制的功能, 在一定程度上降低了由于网络问题, 造
成频繁全量复制生成RDB对系统造成的压力。
2) 尝试性地支持IPv6
3) 可以通过config set命令设置maxclients
4) 可以用bind命令绑定多个IP地址。
5Redis设置了明显的进程名, 方便使用ps命令查看系统进程。
6config rewrite命令可以将config set持久化到Redis配置文件中。
7) 发布订阅添加了pubsub命令。
8Redis Sentinel第二版, 相比于Redis2.6Redis Sentinel, 此版本已经
变成生产可用。
3.Redis3.0
Redis3.0201541日正式发布, 截止到本书完成已经到3.0.7版本,
相比于Redis2.8主要特性如下:
注意
Redis3.0最大的改动就是添加Redis的分布式实现Redis Cluster, 填补了
Redis官方没有分布式实现的空白。 Redis Cluster经历了4年才正式发布也是
有原因的, 具体可以参考Redis Cluster的开发日志
http://antirez.com/news/79) 。
1Redis ClusterRedis的官方分布式实现。
2) 全新的embedded string对象编码结果, 优化小对象内存访问, 在特定
的工作负载下速度大幅提升。
3lru算法大幅提升。
4migrate连接缓存, 大幅提升键迁移的速度。
55
5migrate命令两个新的参数copyreplace
6) 新的client pause命令, 在指定时间内停止处理客户端请求。
7bitcount命令性能提升。
8config set设置maxmemory时候可以设置不同的单位(之前只能是字
节) , 例如config set maxmemory1gb
9Redis日志小做调整: 日志中会反应当前实例的角色(master或者
slave) 。
10incr命令性能提升。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表模型)基础上,一般面向于记录SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作主流的关系数据库包括Oracle、Mysql、SQL Server、Microsoft Access、DB2等非关系型数据库NoSQL(nOSQL=Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型主流的NoSQ.._redis是非关系型数据库吗
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒杀是很常见的营销场景,在一定时间内有大量的用户访问商场下单,主要需要解决的问题有两个:1. 高并发对数据库产生的压力;2. 竞争状态下如何解决商品库存超卖;高并发对数据库产生的压力对于第一个问题,使用缓存来处理,避免直接操作数据库,例如使用 Redis。竞争状态下如何解决商品库存超卖对于第二个问题,需要重点说明。常规写法:查询出对应商品的库存,判断库存数量否大于 0,然后执行生成订单等操作,但是在判断库存是否大于 0 处,如果在高并发下就会有问题,导致库存_php库存结余并发
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,MongoRepository的方式访问较为简单,MongoTemplate方式较为灵活,这两种方式在Java对于MongoDB的运用中相辅相成。_springboot插入指定的mongodb数据库
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的特点是可以存储非结构化的数据,并且可以处理大量的数据。HBase是一个分布式、可扩展的列式存储系统,它是基于Google的Bigtable设计的。HBase是一个开源的NoSQL数据库,它的核心功能是提供高性能的随机读写访问。在本文中,我们将对比HBase与其他NoSQL数据库,例如Redis、MongoDB、Cass...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn-scram-sha-1
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无法获取数据,只能试试monstache抽取mongodb数据,但是monstache需要mongodb replica set 模式才能采集数据。############monstache-compose文件。#replicas set 启动服务。# 默认备份节点不能读写,可以设置。# mydb指的是需要同步的数据库。#登录主mongodb初始化rs。#primary 创建用户。# ip地址注意要修改。# ip地址注意要修改。_monstache csdn
文章浏览阅读913次,点赞4次,收藏5次。storage:fork: trueadmin登录切换数据库注意: use 代表创建并使用,当库中没有数据时默认不显示这个库删除数据库查看表清单> show tables # 或者 > show collections表创建db.createCollection('集合名称', [options])table1字段类型描述capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。_mongodb5
文章浏览阅读862次。Centos7.9设置MongoDB开机自启(超全教程,一条龙)_mongodb centos开机启动脚本
文章浏览阅读1.3k次,点赞6次,收藏21次。NoSQL数据库使用场景以及架构介绍
文章浏览阅读856次,点赞21次,收藏20次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的设计目标是为了解决传统关系型数据库(如MySQL、Oracle等)在处理大量不结构化数据方面的不足。NoSQL数据库可以处理大量数据,具有高性能、高可扩展性和高可用性。但是,与关系型数据库不同,NoSQL数据库没有固定的模式,数据结构也不一定是表格。在NoSQL数据库中,数据存储和查询都是基于键值对、列族、图形等不同的...
文章浏览阅读416次。NoSQL定义:非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。由c++编写的开源、高性能、无模式的基于分布式文件存储的文档型数据库特点:高性能、高可用性、高扩展性、丰富的查询支持、可替换已完场文档某个指定的数据字段应用场景:社交场景:使用mongodb存储用户信息游戏场景:用户信息,装备积分物流场景:订单信息,订单状态场景操作特点:数据量大;读写操作频繁;价值较低的数据,对事物性要求不高开源、c语言编写、默认端口号6379、key-value形式存在,存储非结构化数据。_nosql
文章浏览阅读1.5k次,点赞3次,收藏2次。Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket. at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:110) at redis.clients.jedis.Connection.connect(Conne_redis.clients.jedis.exceptions.jedisconnectionexception: failed to create so
文章浏览阅读6.5k次,点赞3次,收藏12次。readAnyDatabase(在所有数据库上都有读取数据的权限)、readWriteAnyDatabase(在所有数据库上都有读写数据的权限)、userAdminAnyDatabase(在所有数据库上都有管理user的权限)、dbAdminAnyDatabase(管理所有数据库的权限);:clusterAdmin(管理机器的最高权限)、clusterManager(管理和监控集群的权限)、clusterMonitor(监控集群的权限)、hostManager( 管理Server);_mongodb创建用户密码并授权
文章浏览阅读593次。Redis是一个基于内存的键值型NoSQL数据库,在实际生产中有着非常广泛的用处_搭建本地redis
文章浏览阅读919次。Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。_redis高级实战
文章浏览阅读1.2k次。MongoDB 递归查询_mongodb数据库 递归
文章浏览阅读1.2k次。通过实际代码例子介绍:如何通过MongoTemplate和MongoRepository操作数据库数据_springboot操作mongodb
文章浏览阅读687次,点赞7次,收藏2次。首先欢迎大家阅读此文档,本文档主要分为三个模块分别是:Redis的介绍及安装、RedisDesktopManager可视化工具的安装、主从(哨兵)模式的配置。_redis 主从配置工具
文章浏览阅读764次。天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server。有人说,组 CP,除了要了解她外,还要给机会让她了解你。那么,作为开发工程师的你,是否愿意认真阅读此心法抓住机会来了解我,运用到你的系统中提升性能。我遵守 BSD 协议,由意大利人 Salvatore Sanfilippo 使用 C 语言编写的一个基于内存实现的键值型非关系(NoSQL)..._redis 7.2 源码
文章浏览阅读2k次。MongoDB 的增删改查【1】_mongodb $inc