• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • redis是什么

    redis(Remote Dictionary Server ,即远程字典服务),是使用 C语言编写的,基于内存存储,Key-Value类型的数据库。它支持网络,亦可持久化。可用作数据库,高速缓存和消息队列代理。是为了解决高并发、高扩展,大数据存储等一系列的问题而产生的数据库解决方案。

    • reids支持的数据结构,如字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets),数据流(steam)。
    • redis支持的范围查询,如 bitmaps, hyperloglogs 和地理空间(geospatial)索引半径查询。
    • redis支持的数据备份,有一种是RDB,一种是AOF
    • redis支持的运行模式,有哨兵模式(Sentinel)和自动分区的集群模式(Cluster),来提供高可用性(high availability)。
    • redis支持的运行功能,如复制(replication), LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions)。

    redis概述
    在我们日常的Web开发中,都是使用数据库来进行数据的存储,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。
    为了克服上述的问题,通常会引入NoSQL技术,这是一种基于内存的数据库,并且提供一定的持久化功能。
    Redis和MongoDB是当前使用最广泛的NoSQL,而就Redis技术而言,它的性能十分优越,可以支持每秒十几万此的读/写操作,其性能远超数据库,并且还支持集群、分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中,更让人欣慰的是它还支持一定的事务能力,这保证了高并发的场景下数据的安全和一致性。

    redis的应用场景

    • redis由于数据的读取和操作都在内存当中操作,读写的效率较高,所以经常被用来做数据的缓存。把一些需要频繁访问的数据,而且在短时间之内不会发生变化的,放入redis中进行操作。从而提高用户的请求速度和降低网站的负载,降低数据库的读写次数,就把这些数据放到缓存中。
    • 一些常用的实时计算的功能。需要实时变化和展示的功能,就可以把相关数据放在redis中进行操作。大大提高效率。
    • 消息队列,经常用来构建类似实时聊天系统的功能,大大提高应用的可用性。

    Redis与其他key-value存储有什么不同

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

    Redis优势

    • 速度快性能极高:redis数据读写速度非常快,因为它把数据都读取到内存当中操作,而且redis是用C语言编写的,是最“接近”操作系统的语言,所以执行速度相对较快。Redis能读的速度是110000次/s,写的速度是81000次/s 。
    • 丰富的数据类型:Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
    • 支持操作原子性:redis的所有操作都是原子性,支持事务,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
    • 支持丰富的特性:redis支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。Redis还支持 publish/subscribe,通知, key 过期等等特性。

    Redis缺点
    是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

    redis的官网地址 https://redis.io

    redis的作者,他叫Salvatore Sanfilippo,来自意大利的西西里岛,现在居住在卡塔尼亚。目前供职于Pivotal公司。

    Redis版本历史介绍

    Redis借鉴了Linux操作系统对于版本号的命名规则:版本号第二位如果是奇数,则为非稳定版本(例如2.7、2.9、3.1),如果是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2)。当前奇数版本就是下一个稳定版本的开发版本,例如2.9版本是3.0版本的开发版本。所以我们在生产环境通常选取偶数版本的Redis,如果对于某些新的特性想提前了解和使用,可以选择最新的奇数版本。

    1.Redis2.6
    Redis2.6在2012年正式发布,经历了17个版本,到2.6.17版本,相比于
    Redis2.4,主要特性如下:
    1)服务端支持Lua脚本。
    2)去掉虚拟内存相关功能。
    3)放开对客户端连接数的硬编码限制。
    4)键的过期时间支持毫秒。
    5)从节点提供只读功能。
    6)两个新的位图命令:bitcount和bitop。
    7)增强了redis-benchmark的功能:支持定制化的压测,CSV输出等功能。
    8)基于浮点数自增命令:incrbyfloat和hincrbyfloat。
    9)redis-cli可以使用--eval参数实现Lua脚本执行。
    10)shutdown命令增强。
    11)info可以按照section输出,并且添加了一些统计项。
    12)重构了大量的核心代码,所有集群相关的代码都去掉了,cluster功能将会是3.0版本最大的亮点。
    13)sort命令优化。


    2.Redis2.8
    Redis2.8在2013年11月22日正式发布,经历了24个版本,到2.8.24版本,
    相比于Redis2.6,主要特性如下:
    1)添加部分主从复制的功能,在一定程度上降低了由于网络问题,造
    成频繁全量复制生成RDB对系统造成的压力。
    2)尝试性地支持IPv6。
    3)可以通过config set命令设置maxclients。
    4)可以用bind命令绑定多个IP地址。
    5)Redis设置了明显的进程名,方便使用ps命令查看系统进程。
    6)config rewrite命令可以将config set持久化到Redis配置文件中。
    7)发布订阅添加了pubsub命令。
    8)Redis Sentinel第二版,相比于Redis2.6的Redis Sentinel,此版本已经
    变成生产可用。


    3.Redis3.0
    Redis3.0在2015年4月1日正式发布,相比于Redis2.8主要特性如下:
    注意
    Redis3.0最大的改动就是添加Redis的分布式实现Redis Cluster,填补了
    Redis官方没有分布式实现的空白。Redis Cluster经历了4年才正式发布也是
    有原因的,具体可以参考Redis Cluster的开发日志
    (http://antirez.com/news/79)。
    1)Redis Cluster:Redis的官方分布式实现。
    2)全新的embedded string对象编码结果,优化小对象内存访问,在特定
    的工作负载下速度大幅提升。
    3)lru算法大幅提升。
    4)migrate连接缓存,大幅提升键迁移的速度。
    5)migrate命令两个新的参数copy和replace。
    6)新的client pause命令,在指定时间内停止处理客户端请求。
    7)bitcount命令性能提升。
    8)config set设置maxmemory时候可以设置不同的单位(之前只能是字
    节),例如config set maxmemory1gb。
    9)Redis日志小做调整:日志中会反应当前实例的角色(master或者
    slave)。
    10)incr命令性能提升。


    4.Redis3.2
    Redis3.2在2016年5月6日正式发布,相比于Redis3.0主要特征如下:
    1)添加GEO相关功能。
    2)SDS在速度和节省空间上都做了优化。
    3)支持用upstart或者systemd管理Redis进程。
    4)新的List编码类型:quicklist。
    5)从节点读取过期数据保证一致性。
    6)添加了hstrlen命令。
    7)增强了debug命令,支持了更多的参数。
    8)Lua脚本功能增强。
    9)添加了Lua Debugger。
    10)config set支持更多的配置参数。
    11)优化了Redis崩溃后的相关报告。
    12)新的RDB格式,但是仍然兼容旧的RDB。
    13)加速RDB的加载速度。
    14)spop命令支持个数参数。
    15)cluster nodes命令得到加速。
    16)Jemalloc更新到4.0.3版本。


    5.Redis4.0
    可能出乎很多人的意料,Redis3.2之后的版本是4.0,而不是3.4、3.6、3.8。一般这种重大版本号的升级也意味着软件或者工具本身发生了重大变革,Redis发布了4.0-RC2,下面列出Redis4.0的新特性:
    1)提供了模块系统,方便第三方开发者拓展Redis的功能,更多模块详见:http://redismodules.com。
    2)PSYNC2.0:优化了之前版本中,主从节点切换必然引起全量复制的问题。
    3)提供了新的缓存剔除算法:LFU(Last Frequently Used),并对已有算法进行了优化。
    4)提供了非阻塞del和flushall/flushdb功能,有效解决删除bigkey可能造成的Redis阻塞。
    5)提供了RDB-AOF混合持久化格式,充分利用了AOF和RDB各自优势。
    6)提供memory命令,实现对内存更为全面的监控统计。
    7)提供了交互数据库功能,实现Redis内部数据库之间的数据置换。

    8)Redis Cluster兼容NAT和Docker。


    Redis 5

    Stream 数据结构:用来持久化消息队列。

    Redis 6
    多线程IO
    Redis的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行。所以我们不需要去考虑控制 key、lua、事务,LPUSH/LPOP 等等的并发及线程安全问题。

    Redis6.0的多线程默认是禁用的,只使用主线程。如需开启需要修改redis.conf配置文件:io-threads-do-reads yes。开启多线程后,还需要设置线程数,否则是不生效的。修改redis.conf配置文件:io-threads ,关于线程数的设置,官方有一个建议:4核的机器建议设置为2或3个线程,8核的建议设置为6个线程,线程数一定要小于机器核数。还需要注意的是,线程数并不是越大越好,官方认为超过了8个基本就没什么意义了。

    更多关于redis 6.0多线程的讲解,请查看:https://www.cnblogs.com/madashu/p/12832766.html

    SSL支持
    连接支持SSL协议,更加安全。

    ACL支持
    在之前的版本中,Redis都会有这样的问题:用户执行FLUSHAL,现在整个数据库就空了在以前解决这个问题的办法可能是在Redis配置中将危险命令进行rename,这样将命令更名为随机字符串或者直接屏蔽掉,以满足需要。当有了ACL之后,你就可以控制比如:这个连接只允许使用RPOP,LPUSH这些命令,其他命令都无法调用。

    Redis ACL是Access Control List(访问控制列表)的缩写,该功能允许根据可以执行的命令和可以访问的键来限制某些连接。它的工作方式是:在客户端连接之后,需要客户端进行身份验证,以提供用户名和有效密码:如果身份验证阶段成功,则将连接与指定用户关联,并且该用户具有指定的限制。可以对Redis进行配置,使新连接通过“默认”用户进行身份验证(这是默认配置),但是只能提供特定的功能子集。

    在默认配置中,Redis 6(第一个具有ACL的版本)的工作方式与Redis的旧版本完全相同,也就是说,每个新连接都能够调用每个可能的命令并访问每个键,因此ACL功能对于客户端和应用程序与旧版本向后兼容。同样,使用requirepass配置指令配置密码的旧方法仍然可以按预期工作,但是现在它的作用只是为默认用户设置密码。