您的位置:首页 > 数据库 > Redis

对话张冬洪 | 全面解读NoSQL数据库Redis的核心技术与应用实践

2018-02-06 16:00 363 查看
点击有惊喜


互联网和Web的蓬勃发展正在改变着我们的世界,随着互联网的不断发展和壮大,企业数据规模越来越大,并发量越来越高,关系数据库无法应对新的负载压力,随着Hadoop,Cassandra,MongoDB,Redis等NoSQL数据库的兴起,因其良好的可扩展性,弱化数据库的设计范式,弱化一致性要求,在解决海量数据和高并发的问题上明显优于关系型数据库。因而很快广泛应用于互联网业务中。


Redis作为基于K-V的NoSQL数据库,具有高性能、丰富的数据结构、持久化、高可用、分布式、支持复制等特性。从09年至今,经历8年多的锤炼,已经非常稳定,并且得到业界的广泛认可和使用,同时社区非常活跃。

今天我们有幸邀请到了Redis中国用户组主席张冬洪老师,请他分享Redis的核心技术,应用现状及发展方向等。

遇见未来

自我介绍,团队介绍



我是来自新浪微博研发中心的高级DBA 张冬洪,目前在微博带一个小组,主要负责微博平台、手机微博、话题、红包飞、开放平台、私信、以及内容管控项目的数据库产品运维和服务保障工作。工作中涉及的数据库产品主要包括MySQL、Redis、Memcached、MCQ、Kafka、Pika、Postgresql等。

目前您的团队工作重心是什么呢?

微博研发中心数据库部门主要负责全微博平台的后端资源的托管和运维,涉及的资源种类比较多,数据量比较大,业务线和资源实例数目也是非常之多,并发量巨大。而这些正是微博这种体量的公司应该具有的,微博作为当今中文社交媒体的第一品牌,拥有超过3.76亿的月活用户,也是当前社会热点事件传播的最主要平台,其中包括但不限制于大型活动(如:里约奥运会、朱日和沙场大点兵等),春晚,明星动态(如:王宝强离婚事件、女排夺冠、乔任梁去世、白百合出轨、TFBOYS生日、鹿晗关晓彤CP等)。

而热点事件往往具有不可预见性和突发性,并且伴随着极短时间内流量的数倍增长,甚至更多,有时持续时间较长。如何快速应对突发流量的冲击,确保线上服务的稳定性,是一个非常巨大的挑战和有意义的事情。为了达到这一目标,需要有一个完善的,稳定可靠的,健壮的数据库运维体系来提供支撑和管理,所以我们团队也是在领导的指导下,有目标、有计划的开展一些数据库自动化运维平台的建设工作。



在业余的时间我和其他几大互联网公司的朋友一起发起了Redis中国用户组(简称CRUG),也欢迎大家加入我们。

Redis在过去的版本演进中,比较重大的变化包括哪些呢?在最新4.0版本上,您认为最核心的变化是什么呢?您关注的新特性有哪些,可以简单介绍下吗?

我最早接触应该是在12年的时候,当时最新的版本应该是2.6.x。那个时候也没有在线上用,只是学习Linux的时候了解过。所以知道Redis的版本号命名规则借鉴了Linux的方式,版本号第二位如果是奇数,则为非稳定版本,如果为偶数,则为稳定版本。

这里我说下稳定版本的一些主要改进吧:

Redis2.6

1)键的过期时间支持毫秒

2)从节点提供只读功能

3)服务端支持Lua脚本

4)放开客户端连接数的硬编码限制

5)去掉虚拟内存相关功能等

 Redis2.8

1)完善主从复制功能,实现增量复制

2)Redis设置明显的进程名,在系统中ps命令即可查看

3)发布/订阅添加pub/sub命令

4)Redis Sentinel第二版发布,较Redis 2.6更加完善,可以线上使用

5)可以通过config set命令设置maxclients等

Redis3.0

1)推出Redis的分布式集群 Redis Cluster

2)全新的embedded string对象编码结果,优化小对象的内存访问,在特定的工作负载下能大幅度提升性能

3)LRU算法提升

4)config set 设置maxmemory的时候可以设置不用的单位

5)新的Client pause命令,在指定时间内停止处理客户端请求等

Redis3.2

1)添加GEO功能

2)新的List编码类型quicklist 

3)SDS在速度和节省空间上都做了优化

4)Lua脚本功能增强

5)新的RDB格式,仍兼容旧版RDB,同时加载速度上也有提升

6)Cluster nodes命令加速等

在Redis4.0版本上,我认为最核心的功能应该是支持了module,这极大的丰富的Redis的功能,使得许多Redis本身不具有的,第三方开发者拓展的功能也能加载到Redis中当一个功能进行使用,比如RediSearch、ReJSON、Redis-ML等。除此之外,还看到有很多新特性:

1)psync2.0,优化了之前版本主从节点切换必然引起全量复制的问题

2)提供全新的缓存剔除算法LFU,并对已有算法进行了优化

3)提供了非阻塞del和flushall和flushdb功能,有效解决了删除bigkey可能造成的Redis阻塞

4)提供了RDB-AOF混合持久化格式

5)提供memory命令,实现对内存的更为全面的监控统计

6)Redis Cluster 兼容NAT和Docker

7)引入Jemalloc库,优化内存访问等等

 您能介绍一下Redis中的数据类型和它们的使用场景吗?

Redis之所以能够被广泛的应用于企业的架构中,而且是不可或缺的重要组成部分,也可以说是标配吧,其中很重要的一点就是得益于它具有丰富的数据结构,这也是它逐渐替代Memcached,备受青睐的重要原因。那么Redis都提供哪些数据类型呢?

相信对Redis有了解过的同学都知道,它的数据类型有:String、Hash、List、Set、Zset、Bitmaps、HyperLogLog、GEO等。



随着互联网的兴起和Redis技术的不断完善和发展,它已经被广泛应用于各行各业中,应用场景也是百花齐放。比如:会话缓存(Session cache)、全页缓存(FPC)、手机验证码、访问频率限制/黑白名单、消息队列、发布与订阅、消息通知、排名/排行榜/最新列表、计数器(比如微博的转评赞计数、阅读数(浏览数,视频播放计数)、博文数(发帖数)、粉丝数、关注数(喜欢商品数)、未读数(动态数))、共同好友/喜好/标签、推送、下拉刷新、私信、商品库存管理(限时的优惠活动信息)、证券指标实时计算,发号器/UUID、以及随着LBS(基于位置服务)的发展,加入的GEO(地理信息定位)的功能和基于Lua自定义命令或功能等等。大家在使用过程中,需要结合自己的业务场景,选择正确的数据类型。

Redis数据库有哪些主要的特点和优势?使用时有什么需要关注的点,可能会带来哪些问题,可否通过实践案例详细描述一下?

Redis作为基于K-V的NoSQL数据库,具有高性能、丰富的数据结构、持久化、高可用、分布式、支持复制等特性。从09年至今,经历8年多的锤炼,已经非常稳定,并且得到业界的广泛认可和使用,同时社区非常活跃,开发者又很严谨,这使得Redis版本非常精简,bug fix非常高效。根据similarweb.com的统计,中国Redis用户占全球Redis用户的40.96%,所以我们在使用的过程中遇到的问题,大部分可能都有解决方案。

需要关注的点比较多,之前在CRUG深圳站活动的分享中也提到过一些,下面举一些例子吧:

1)安全问题:Redis用非root用户启动,并且运行在内网,尽可能不要暴露在外网,配置认证requirepass
xxx,减少被攻击的风险;开启危险命令认证(keys-need-auth yes   rename-command KEYS MY_KEYS)

2)容量问题:合理评估;合理使用内存分配策略(no-enviction、allkeys-random、allkeys-lru、volatile-random、volatile-ttl、volatile-lru);检查是否有内存碎片;选择合适的服务类型(Redis
cluster或者pika);水平拆分;性能满足的条件下选择诸如ziplist类的内部编码

3)big-key问题:可能会引起慢查或者带宽瓶颈,按照业务逻辑拆成小key或者业务解耦剥离big-key或直接改用其他存储方式

4)hot-key问题:Redis是单进程,节点实例很容易成为系统的短板,垂直扩容;增加local
cache;如果只是简单的k-v结构,可以考虑使用Memcached

5)使用姿势问题:避免使用阻塞操作(如:flushall、flushdb、keys
*等);尽量使用Pipeline,减少syscall带来的网络IO,但要注意限制数据量大小;对多个元素操作时,像使用SORT、LREM、SUNION,计算复杂度为O(N), 避免线上乱用;尽可能使用最新的版本

6)Key过期问题:合理设置过期时间;如果存在许多该过期的key而没被及时删除,可以通过命令scan、hscan、sscan、zscan、keys
*遍历一遍key的方式实现

7)配置上:建议开启tcp-keepalive,tcp-backlog,从库设置readonly
yes

8)系统设置:关闭NUMA;关闭transparent _hugepage;
关闭swap

等等,大家有问题的时候可以相互交流。

Redis如何做消息队列?

Redis做消息队列,有两种实现方式:

第一种:通过数据结构List来实现



点击有惊喜

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库