【云驻共创】Redis内存数据库
Redis内存数据库
大家好,今天我们的主题是“Redis内存数据库”。我们的目标是学完本次内容后,您将能够:了解Redis应用场景,掌握Redis数据类型,掌握Redis的优化方法,掌握Redis业务开发。
第1章 Redis应用场景
我们先整体上认识下Redis,Redis是一个基于网络的,高性能key-value内存数据库。Redis跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。支持在服务器端计算集合的并、交和补集(difference)等,还支持多种排序功能。Redis使用场景有如下几个特点:高性能、低时延、丰富的数据结构存取、支持持久化。
那么,Redis应用场景有哪些呢?Redis提供了灵活多变的数据结构和数据操作,主要应用于如下场景:1.取最新N个数据的操作,比如典型的取某网站的最新文章。2.排行榜应用,取TOP N操作。这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序。3.需要精准设定过期时间的应用,如用户会话信息。计数器应用,比如记录用户访问网站次数。4.构建队列系统,例如消息队列。5.缓存,如缓存关系数据库中的频繁访问的表数据。6.发布/订阅功能, pub/sub。7手机验证码,使用expire设置验证码失效时间。
第2章 Redis业务流程
接着,我们来看一下Redis业务流程。首先,我们看一下Redis架构:它是无中心自组织的结构,节点之间使用Gossip协议来交换节点状态信息,各节点维护Key->Server的映射关系。它的Client可以向任意节点发起请求,节点不会转发请求,只是重定向Client。如果在Client第一次请求和重定向请求之间,Cluster拓扑发生改变,则第二次重定向请求将被再次重定向,直到找到正确的Server为止。
Redis数据读写流程如下:1. 客户端选择集群中任意一个Server节点进行连接,并发送cluster nodes请求;2. Server节点返回集群拓扑,主要包括集群节点列表及槽位跟节点的映射关系,客户端在内存中缓存集群拓扑;3. 客户端读写数据时,根据hash(KEY)%16384计算得到KEY归属的槽位,再查槽位跟节点的映射,进一步得到KEY归属的节点Server2,直接访问该节点进行数据读写;4. Server2收到客户端的请求,检查自身是否为KEY归属的节点:若不是,则响应中告知Client需重定向的节点Server3;若是,则直接返回业务操作结果;5. 客户端收到重定向响应,重新向Server3发起读写请求;6. Server3收到请求,处理过程同步骤4。
第3章 Redis特性及数据类型
3.1 Redis的特性
Redis的特性——多数据库。它的内容:1.每个数据库对外都是以一个从0开始的递增数字命名,不支持自定义的;2.Redis默认支持16个数据库,可以通过修改databases参数来修改这个默认值;3.Redis默认选择的是0号数据库;4.SELECT 数字: 可以切换数据库;5.多个数据库之间并不是完全隔离的,比如flushall命令范围是所有数据库;6.flushall:清空Redis实例下所有数据库的数据;7.flushdb:清空当前数据库的数据。
接下来,我们学习一下Redis基础命令。如获得符合规则的键名称,判断一个键是否存在,删除键等命令。
3.2 Redis的数据类型1
然后,我们来看一下Redis的数据类型。Redis数据类型之string。字符串类型是Redis中最基本的数据类型,它能存储任何形式的内容,包含二进制数据,甚至是一张图片(二进制内容)。一个字符串类型的值存储的最大容量是1GB。
Redis数据类型之Hash。Hash类型的值存储了字段和字段值的映射,字段和字段值只能是字符串,不支持其他数据类型。Hash类型的键至多可以存储2的32次方减1个字段。另外,Hash类型适合存储对象。Redis可以为任何键增减字段而不影响其他键。
Redis数据类型之List。List是一个有序的字符串列表,列表内部实现是使用双向链表(linked list)实现的。list还可以作为队列使用。一个列表类型的键最多能容纳2的32次方减1个元素。
Redis数据类型之Set。Set集合中的元素都是不重复的,无序的,一个集合类型键可以存储至多2的32次方减1个元素。
Redis数据类型之sorted set。有序集合,在集合类型的基础上为集合中的每个元素都关联了一个分数,这样可以很方便的获得分数最高的N个元素(topN)。
3.3 Redis的数据类型2
Redis中键的生存时间 (expire)。Redis中可以使用expire命令设置一个键的生存时间,到时间后Redis会自动删除它。它的应用场景:限时的优惠活动信息;网站数据缓存(对于一些需要定时更新的数据,例如:积分排行榜);限制网站访客访问频率(例如:1分钟最多访问10次)。
Redis管道 (pipeline) 。Redis的pipeline(管道)功能在命令行中没有,但是Redis是支持管道的,在Java的客户端(jedis)中是可以使用的。
Redis中数据的排序 (sort)。sort命令可以对列表类型,集合类型和有序集合类型,进行排序。它的性能优化:尽可能减少待排序键中元素的数量;使用limit参数只获取需要的数据;如果要排序的数据数量很大,尽可能使用store参数将结果缓存。
Redis任务队列。任务队列:使用lpush和rpop可以实现普通的任务队列。优先级队列:brpop key1 key2 key3 timeout second。
Redis持久化 (persistence)。Redis支持两种方式的持久化,可以单独使用或者结合起来使用。第一种:RDB方式(Redis默认的持久化方式),第二种:AOF方式。
Redis持久化之RDB。rdb方式的持久化是通过快照完成的,当符合一定条件时Redis会自动将内存中的所有数据执行快照操作并存储到硬盘上,默认存储在dump.rdb文件中。手动执行save或者bgsave命令让redis执行快照。两个命令的区别在于,save是由主进程进行快照操作,会阻塞其它请求。bgsave是由redis执行fork函数复制出一个子进程来进行快照操作。
Redis持久化之AOF (1)。AOF方式的持久化是通过日志文件的方式。默认情况下Redis没有开启AOF,可以通过参数appendonly参数开启。Redis写命令同步的时机:appendfsync always:每次都会执行;appendfsync everysec:默认,每秒执行一次同步操作(推荐,默认);appendfsync no:不主动进行同步,由操作系统来做,30秒一次。
Redis持久化之AOF (2)。动态切换Redis持久方式,从 RDB 切换到 AOF(支持Redis 2.2及以上)。注意:当Redis启动时,如果RDB持久化和AOF持久化都打开了,那么程序会优先使用AOF方式来恢复数据集,因为AOF方式所保存的数据通常是最完整的。如果AOF文件丢失了,则启动之后数据库内容为空。注意:如果想把正在运行的Redis数据库,从RDB切换到AOF,建议先使用动态切换方式,再修改配置文件。
Redis内存占用情况。 100万个键值对(键是0到999999,值是字符串“hello world”)在32位操作系统的笔记本上用了100MB。使用64位的操作系统的话,相对来说占用的内存会多一点,这是因为64位的系统里指针占用了8个字节,但是64位系统也能支持更大的内存,所以运行大型的Redis服务还是建议使用64位服务器。
第4章 Redis优化
4.1 Redis的优化(1)
精简键名和键值。键名:尽量精简,但是也不能单纯为了节约空间而使用不易理解的键名;键值:对于键值的数量固定的话可以使用0和1这样的数字来表示,(例如:male/female、right/wrong)。当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能。
4.2 Redis优化 (2)
修改linux内核内存分配策略。向/etc/sysctl.conf添加vm.overcommit_memory = 1,然后重启服务器;或者执行sysctl vm.overcommit_memory=1(立即生效)。
4.3 Redis优化(3)
Transparent Huge Pages(THP)会造成内存锁影响Redis性能,建议关闭。
4.4 Redis优化 (4)
修改linux中tcp最大连接数。
4.5 Redis优化 (5)
限制Redis的内存大小。如果可以确定数据总量不大,并且内存足够的情况下不需要限制Redis使用的内存大小。如果数据量不可预估,并且内存也有限的话,尽量限制下Redis使用的内存大小,这样可以避免Redis使用swap分区或者出现OOM错误。
4.6 Redis优化 (6)
Redis是个单线程模型,客户端过来的命令是按照顺序执行的,所以想要一次添加多条数据的时候可以使用管道,或者使用一次可以添加多条数据的命令。
第5章 Redis应用案例
接下来,我们对Redis的应用开发案例进行分析。它的业务目标:某在线推荐业务对实时性具有较高的要求,主要体现为推荐结果的获取是跟随用户对业务的请求完成的,如果推荐结果的获取过程延时很高,势必会影响业务本身的体验。因此在线推荐业务需要考虑如何确保推荐结果获取的实时性。它的业务方案:引入Redis,增加Cache机制降低从数据库和文件系统读取数据的次数和数据量。将已经计算出的推荐结果缓存到Redis,下一次获取同一批推荐结果的时候从缓存直接读取。
它的数据结构设计:计算过程中使用的用户信息使用hash结构存取,KEY设计为userinfo-<user id>,field为用户的属性,如姓名、性别、年龄、爱好等。推荐结果(商品)由于可能存在多个,且为避免一个商品重复推荐,故使用set结果存取,KEY设计为res-<user id>。
它的数据读写原则:MR任务每天定时将用户信息从后端存储源(HBase)批量导入到Redis中。业务系统获取数据时,先从Redis中获取,获取不到再去后端HBase获取或即时计算,并同步写入到Redis。
综上所述,本次主题我们首先介绍了Redis组件的应用场景,Redis特性及数据类型,业务数据读写流程等。学完本次内容后,大家可以根据具体的业务场景,选择合适的Redis数据结构,进行Redis数据的存取。
本文参与华为云社区【内容共创】活动第19期。
https://bbs.huaweicloud.com/blogs/370132
- 点赞
- 收藏
- 关注作者
评论(0)