技术实践|Redis基础知识及集群搭建(上)
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。本篇文章围绕Redis基础知识及集群搭建相关内容进行了分享,希望与各位同仁交流探讨。
一、Redis基础知识
1. Redis简介
Redis是什么?
Redis,典型的NoSQL数据库服务器,采用Key-Value存储结构,可以作为服务程序独立运行于自己的服务器主机,同时作为内存数据库,不用IO读取硬盘数据,能够快速响应请求。
Redis有什么特点?
支持持久化、支持多种数据结构、支持主从复制、免费。
与关系型数据库比较
redis由于其存储结构相对简单,因此并不能对复杂的逻辑关系提供很好的支持,然而在适用于Redis的场景中,我们却可以由此获得效率上的显著提升。
2. Redis的数据结构
作为NoSQL数据库之一的Redis,除了支持基本Key-Value方式,还支持结构化存储,以适应各类应用场景:
■String:字符串类型
■List::链表类型
■Hashes:哈希类型
■Set:集合类型
■Sorted-Sets:有序集合类型
字符串类型:String
String是最常用的一种数据类型,普通的Key/ Value存储都可以归为此类。当然,也可以存储图片,视频等序列化对象,Value最多可以容纳的数据长度是512M。
编辑
链表类型:List
List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。
编辑
场景:LIST可以作为消息队列,LPUSH链表头作为生产者插入消息,RPOP作为消费者取得消息。
哈希类型:Hashes
我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。
编辑
场景:AIOP中用户标签信息使用HASHMAP存储,存储结构为user:phone tag1 val1 tag2 val2 ,AIOP传递客户手机号,即可通过HGET user:phone tag1 tag2 取出标签值。
集合类型:Sets
在Redis中,我们可以将Set类型看作为没有排序的字符集合,就像什锦果冻,只是聚集在一起,没有顺序,这和List类型不一样,另外要注意Set集合中不允许出现重复的元素,而且Set支持多个Sets之间的差、并、交集操作。
编辑
场景:COC中将符合标签的用户进行聚类,存放到Set中,比如set1存放学生标签用户、set2存放低消费用户、set3存放非合约用户,那么取出可能购买小米的低消非合约学生用户群:
■ SINTERSTORE aset set1 set2
■ SDIFF aset set3
有序集合类型:Sorted-Sets
有序集合中也不允许有重复数据,它比Set多了一个score,Redis正是通过score来为集合中的成员进行从小到大的排序。需要注意的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。
编辑
场景:可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP TEN的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息。
3. 其他操作
以上各类数据类型的操作全部是针对于Key关联的Value操作,Redis也提供了单独对Key值的操作。
编辑
Redis在设计之初就被定义为长时间不间断运行的服务进程,因此大多数系统配置参数都可以在不重新启动进程的情况下立即生效,本文用到的有:
■ Slaveof host port 修改主从关系
■ Info 当前系统信息
■ shutdown 关闭redis
■ flushall 清空所有keys
■ flushdb 清空当前数据库key
4. Redis主从复制
Redis主从复制的优势
①支持一主多从
②支持级联复制:master-slave-slave,分载master同步压力
③支持非阻塞式数据同步:数据同步与对外服务能力分离,互不影响
④支持slave只读模式
编辑
5. Redis持久化
RDB持久化
该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。
优点:①只有一份rdb文件,可随时备份
②比AOF文件小,加载效率高
③只提供fork子进程,不阻塞主进程,IO操作比较少
AOF持久化
该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。
优点:①每改动同步数据安全性好
②APPEND方式追加日志,不会对旧日志文件产生影响
无持久化
可以通过配置的方式禁用Redis服务器的持久化功能,这样就可以将Redis视为一个功能加强版的memcached了。
同时应用AOF和RDB
6. Redis持久化2
RDB持久化
Dump快照的机制:
①Redis先fork子进程。
②子进程将快照数据写入到临时RDB文件中。
③当子进程完成数据写入操作后,再用临时文件替换老的文件。
redis.conf配置修改:
save 900 1 #在900秒后,如果至少有1个key发生变化,则dump内存快照。
save 300 10 #在300秒后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒之后,如果至少有10000个key发生变化,则dump内存快照。
(注释1:可以配置多个条件组成持久化策略)
(注释2:fork进程开销大,数据量太大时,消耗cpu和内存资源,影响父进程不能及时响应)
AOF持久化
redis.conf配置修改:
appendonly yes
appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no #从不同步。高效但是数据不会被持久化。
(注释:一般选择always每修改同步,保证数据安全)
7. Redis内存优化思考
Redis作为内存数据库,所有数据都从内存中拿,省去读写磁盘的消耗(持久化是由fork子进程处理,主服务对外能力不受影响),响应速度极快。但我们不可能将所有的数据都读到内存中,所以内存资源显得非常可贵,我们就要优化存储结构,使得好钢用在刀刃上。
尽量使用hash
COC中每个客户会对应上千个标签,每个客户就是一个对象,我们如何存储它?
编辑
存储结构比较
①序列化对象:要求在Redis存储前对对象进行序列化操作,每次取出后还要执行反序列化操作,开销太大;如果只想取对象的某一个值,也需要将整个对象取出,还要解决并发、数据一致性、加锁等复杂问题。
②K-V模式:phone字段冗余
③HASHMAP:phone字段只出现一次,避免数据冗余
内存优化效果
比较K-V结构与HASHMAP结构对内存的影响:
前提假设COC有1千万用户对象,每个用户对象有1000个标签,Redis存储的phone_no格式为185XXXXXXXX。
①根据ASCII编码,每位数字占用单字节字符,每个phone_no占用11Byte
②K-V结构中,存放一个完成对象,每个phone_no需要重复1000次,所以存放1千万个对象phone_no为1000*1千万,所占空间为:1000次*10000000个*11B/1024/1024=102.45G
根据业务场景,考虑使用BITMAP
前面我们在讲String的时候提到过两个命令:setbit key offset 0/1和getbit key offset,这两个命令是在位上进行0/1赋值和取值。假设还是1000W用户,每个用户有1000个0/1标签,我们可以使用bitmap来存放这些数据:
编辑
所有标签总占用的内存为:0.000119MB*1000W=1.19GB,如果使用Key-Value结构(包括Hashes),内存占用至少是它的8倍。
BITMAP使用总结
①只适合01型标签
②需要位移位与标签的字典表,属于额外开销,但相对而言字典表Offset数字可共享Redis数字池,比直接存字符串要省空间。
③牺牲时间换空间:(1)维护字典表;(2)入库需要对应转化;(3)出库计算也需要转换
Redis基础总结
①本次Redis基础知识中,我们介绍了基本的数据结构及常用命令、数据类型的场景举例、Redis主从复制机制、持久化机制、以及内存优化。
②无论是数据结构选择还是内存优化,都要结合具体的业务场景和业务要求,没有通用的最佳推荐模式,只有最符合需求的模式,所以我们需要我们不断尝试、不断优化。(未完待续)
技术实践|Redis基础知识及集群搭建(上)的更多相关文章
- ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建
在上一个小系列文章<ASP.NET Core on K8S学习初探>中,通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境,并初步尝试将ASP.NE ...
- 【原创 Hadoop&Spark 动手实践 5】Spark 基础入门,集群搭建以及Spark Shell
Spark 基础入门,集群搭建以及Spark Shell 主要借助Spark基础的PPT,再加上实际的动手操作来加强概念的理解和实践. Spark 安装部署 理论已经了解的差不多了,接下来是实际动手实 ...
- Redis单机安装以及集群搭建
今天主要来看一下Redis的安装以及集群搭建(我也是第一次搭建). 环境:CentOS 7.1,redis-5.0.7 一.单机安装 1.将Redis安装包放置服务器并解压 2.进入redis安装目录 ...
- Redis 3.0.2集群搭建以及相关问题汇总
Redis3 正式支持了 cluster,是为了解决构建redis集群时的诸多不便 (1)像操作单个redis一样操作key,不用操心key在哪个节点上(2)在线动态添加.删除redis节点,不用停止 ...
- 转:Redis 3.2.1集群搭建
Redis 3.2.1集群搭建 一.概述 Redis3.0版本之后支持Cluster. 1.1.redis cluster的现状 目前redis支持的cluster特性: 1):节点自动发现 2) ...
- Redis 5.0.5集群搭建
Redis 5.0.5集群搭建 一.概述 Redis3.0版本之后支持Cluster. 1.1.redis cluster的现状 目前redis支持的cluster特性: 1):节点自动发现 2):s ...
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- 分布式缓存技术redis系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- redis基础之redis-cluster(集群)(七)
前言 redis的主流高可用集群模式为redis-cluster.从redis3.0+版本后开始支持,自带集群管理工具redis-trib.rb. 安装redis 参考:https://www.cnb ...
随机推荐
- Word、Excel办公书的资源下载
我是清华社编辑,下载资源没有版权问题,可供读者个人学习用,但不允许商用. 微信扫描,清华社网盘,可转自己邮箱下载.安全,无风险. <Word/Excel/PPT 2019商务办公从入门到精通&g ...
- HOG算法的笔记与python实现
这两篇[1][2]博客写的都非常详细.这里做个笔记记录一下. HOG称为方向梯度直方图(Histogram of Oriented Gradient),主要是为了对图像进行特征提取.所以在传统目标检测 ...
- 墨天轮沙龙 | 北京大学李文杰:面向知识图谱应用的图数据库系统gStore
在6月8日举办的[墨天轮数据库沙龙第七期-开源生态专场]中,北京大学重庆大数据研究院图数据库与知识图谱实验室副主任.北京大学王选计算机研究所全职博士后 李文杰老师分享了<面向知识图谱应用的图数据 ...
- python中模块的概念以及常用模块
模块的概念:为了减少常用代码重复输入,同时方便多人协作,python中定义了模块一词. 模块是一些函数的集合.在python中可以使用import导入某一模块的单个或者所有功能. python中的模块 ...
- 我被 .NET8 JIT 的一个BUG反复折磨了半年之久
很久很久没有写过博客了, 正好最近园子又挣得一线生机, 必须得凑个热闹水一篇. 事情是这样的, 在今年的早些时候, 把公司的一部分api服务器的.net版本从6升级到了8, 毕竟6马上就是EOL了(. ...
- 入门级别 Nginx 常用配置清单
本文为转发文章,转发来自"https://mp.weixin.qq.com/s/ipUHaFPcDfIM9MsyqDGSEg",觉得不错分享给大家 Nginx 是一个高性能的 HT ...
- python+ffmpeg视频转码转格式
本文转发来自:https://blog.csdn.net/KH_FC/article/details/115771126 废话 python目前自己也是在学习当中,对python也不是特别精通,写视频 ...
- vue之JavaScript封装
导入js文件有很多种方式,我喜欢使用这种,感觉跟框架导入很相似.没有多余的沉湎. 定义一个js文件,比如util.js import Vue from "vue"; //===== ...
- typescript 编译报错 不能用于索引类型
Element implicitly has an 'any' type because expression of type 'any' can't be used to index type 't ...
- [Windows]文件搜索利器Everything(附zip)
前言 写代码过程中,老大突然发一条信息 老大:这周周报发一下. 我:好的. 然后我就 显示桌面 打开-我的电脑 找到E盘,找到周报文件夹 寻找到所有周报中今天的周报 复制发送 当我用上Everythi ...