0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Redis在大数据中的使用,Redis封装架构讲解

电子工程师 来源:未知 作者:李倩 2018-11-16 09:21 次阅读

热场准备

熟悉的开场白,大家晚上好啊,今天给大家分享的是Redis在大数据中的使用,可能真正讲的是一些redis的使用技巧,Redis基本的一些东西。

首先给大家个地址,源码以及实例都在里面,当然今天的分享也是按照里面的实例来进行的,大家可以先进行下载

http://git.newlifex.com/NewLife/NewLife.Redis

当然这里也附上Redis的下载地址:

windows:

https://github.com/MicrosoftArchive/redis/releases

http://x.newlifex.com/Redis-x64-3.2.100.msi

Linux

https://redis.io/download

开始

Redis封装架构讲解

实际上NewLife.Redis是一个完整的Redis协议的功能的实现,但是redis的核心功能并没有在这里面,Redis的核心功能的实现是在NewLife.Core里面。这里可以打开看一下,NewLife.Core里面有一个NewLife.Caching的命名空间,里面有一个Redis类里面实现了Redis的基本功能,另一个类是RedisClient是Redis的客户端。Redis的核心功能就是有这两个类实现。RedisClient代表着Redis客户端对服务器的一个连接。

Redis真正使用的时候有一个Redis连接池,里面存放着很多个RedisClient对象。

所以我们Redis的封装有两层,一层是NewLife.Core里面的Redis以及RedisClient。另一层就是NewLife.Redis。这里面的FullRedis是对Redis的实现了Redis的所有的高级功能。这里你也可以认为NewLife.Redis是Redis的一个扩展。

Test实例讲解Redis的基本使用

实例

打开Program.cs看下代码

这里XTrace.UseConsole();是向控制台输出日志,方便调试使用查看结果。

接下来看第一个例子Test1。具体的我都在代码中进行了注释,大家可以看下

staticvoidTest1(){varic=Redis.Create("127.0.0.1:6379",3);//创建Redis实例,得到FullRedis对象//varic=newFullRedis();//另一种实例化的方式//ic.Server="127.0.0.1:6379";//ic.Db=3;//Redis中数据库ic.Log=XTrace.Log;//显示日志,进行Redis操作把日志输出,生产环境不用输出日志//简单操作Console.WriteLine("共有缓存对象{0}个",ic.Count);//缓存对象数量ic.Set("name","大石头");//SetK-V结构,Set第二个参数可以是任何类型Console.WriteLine(ic.Get("name"));//Get泛型,指定获取的类型ic.Set("time",DateTime.Now,1);//过期时间秒Console.WriteLine(ic.Get("time").ToFullString());Thread.Sleep(1100);Console.WriteLine(ic.Get("time").ToFullString());//列表varlist=ic.GetList("list");list.Add(DateTime.Now);list.Add(DateTime.Now.Date);list.RemoveAt(1);Console.WriteLine(list[list.Count-1].ToFullString());//字典vardic=ic.GetDictionary("dic");dic.Add("xxx",DateTime.Now);Console.WriteLine(dic["xxx"].ToFullString());//队列varmq=ic.GetQueue("queue");mq.Add(new[]{"abc","g","e","m"});vararr=mq.Take(3);Console.WriteLine(arr.Join(","));//集合varset=ic.GetSet("181110_1234");set.Add("xx1");set.Add("xx2");set.Add("xx3");Console.WriteLine(set.Count);Console.WriteLine(set.Contains("xx2"));Console.WriteLine("共有缓存对象{0}个",ic.Count);}

1、Set的时候如果是字符串或者字符数据的话Redis会直接保存起来(字符串内部机制也是保存二进制),如果是其他类型会默认进行json序列化然后再保存起来

2、Get的时候如果是字符串或者字符数据会直接获取,如果是其他类型会进行json反序列化

3、Set第三个参数过期时间单位是秒。

4、vs调试小技巧,按F5或者直接工具栏“启动”会编译整个解决方案会很慢(VS默认),可以选中项目然后右键菜单选择调试->启动新实例。会只编译将会用到的项目,这样对调试来说会快很多。

5、大家运行调试后可以看到控制台输出的内容:向右的箭头=》是ic.Log=XTrace.Log输出的日志

6、字典的使用:对象的话需要把json全部取出来然后转换成对象,而字典的话就可以直接取某个字段。

7、队列是List结构实现的,使用场景可以上游数据太多,下游处理不过来的时候,那么就可以使用这个队列。上游的数据发到队列,然后下游慢慢的消费。另一个应用,跨语言的协同工作,比方说其他语言实现的程序往队列里面塞数据,然后另一种语言来进行消费处理。哈,这种方式类似mq的概念,虽然有点low,但是也很好用。

8、集合,用的比较多的是用在一个需要精确判断的去重功能。像我们每天有三千万订单,这三千万订单可以有重复,这时候我想统计下一共有订单,这时候直接数据库group by是不大可能的,因为数据库中分了十几张表,这里分享个实战经验:比方说揽收,商家发货了,网点要把件收回来,但是收回来之前网点不知道自己有多少货啊,这时候我们做了一个功能,也就是订单会发送到我们公司来,我们会建一个time_site的key的集合,而且集合本身有去重的功能,而且我们可以很方便的通过set.Count功能来统计数量,当件被揽收以后,我们后台把这个件从集合中Remove掉.然后这个Set中存在的就是网点还没有揽收的件,这时候通过Count就会知道这个网点今天还有多少件没有揽收。实际使用中这个数量比较大,因为有几万个网点。

9、Redis中布隆过滤器,去重的,面试的时候问的比较多

10、小经验分享:

数据库中不合法的时间处理:判断时间中的年份,是否大于2000年。如果小于2000就认为不合法。习惯大于小于号不习惯用等于号,这样可以处理很多意外的数据

Set的时候最好指定过期时间防止有些需要删除的数据,我们忘记删了

Redis异步尽量不用,因为Redis延迟本身很小,大概在100us-200us,再一个就是Redis本身是单线程的,异步任务切换的耗时比网络耗时还要大。List用法:物联网中数据上传,量比较大时,我们可以把这些数据先放在Redis的List中,比如说一秒钟1万条,然后再批量取出来然后批量插入数据库中。这时候要设置好key,可以前缀+时间,对于已经处理的List可以进行remove移除。

压力测试

接下来看第四个例子,我们直接做压力测试,代码如下:

staticvoidMain(String[]args){XTrace.UseConsole();//激活FullRedis,否则Redis.Create会得到默认的Redis对象FullRedis.Register();Test4();Console.ReadKey();}staticvoidTest4(){varic=Redis.Create("127.0.0.1:6379",5);//varic=newMemoryCache();ic.Bench();}

运行的结果如下图所示:

测试就是进行get,set remove,累加等的操作。大家可以看到在我本机上轻轻松松的到了六十万,多线程的时候甚至到了一百多万。为什么会达到这么高的ops呢,下面给大家说一下。

Bench 会分根据线程数分多组进行添删改压力测试。

rand 参数,是否随机产生key/value。

batch 批大小,分批执行读写操作,借助GetAll/SetAll进行优化。

Redis中NB的函数来提升性能

上面的操作如果大家都掌握的基本算Redis入门了,接下来进行进阶。会了基本比别人更胜一筹了。

1、GetAll()与SetAll()

GetAll:比方说我要取十个key,这个时候可以用getall。这时候redis就执行了一次命令。比方说我要取10个key那么用get的话要取10次,如果用getall的话要用1次。一次getall时间大概是get的一点几倍,但是10次get的话就是10倍的时间,这个账你应该会算吧。强烈推荐大家用getall。

setall 跟getall相似。批量设置K-V.

setall与getall性能很恐怖,官方公布的ops也就10万左右,为什么我们的测试轻轻松松到五十万甚至上百万,因为我们就用了setall,getall。

如果get,set两次以上,建议用getall,setall

2、Redis管道Pipeline

比如执行10次命令会打包成一个包集体发过去执行,这里实现的方式是StartPipeline()开始,StopPipeline()结束中间的代码就会以管道的形式执行。这里推荐使用我们的更强的武器,AutoPipeline自动管道属性。管道操作到一定数量时,自动提交,默认0。使用了AutoPipeline,就不需要StartPipeline,StopPipeline指定管道的开始结束了!

3、Add与Replace

Add:Redis中没有这个Key就添加,有了就不要添加,返回false

Replace:有则替换,还会返回原来的值,没有则不进行操作

Add跟Replace就是实现Redis分布式锁的关键

Redis使用技巧,经验分享

在项目的Readme中,这里摘录下:

特性

在ZTO大数据实时计算广泛应用,200多个Redis实例稳定工作一年多,每天处理近1亿包裹数据,日均调用量80亿次

低延迟,Get/Set操作平均耗时200~600us(含往返网络通信

大吞吐,自带连接池,最大支持1000并发

高性能,支持二进制序列化(默认用的json,json很低效,转成二进制性能会提升很多)

Redis经验分享

在Linux上多实例部署,实例个数等于处理器个数,各实例最大内存直接为本机物理内存,避免单个实例内存撑爆(比方说8核心处理器,那么就部署8个实例)

把海量数据(10亿+)根据key哈希(Crc16/Crc32)存放在多个实例上,读写性能成倍增长

采用二进制序列化,而非常见的Json序列化

合理设计每一对Key的Value大小,包括但不限于使用批量获取,原则是让每次网络包控制在1.4k字节附近,减少通信次数(实际经验几十k,几百k也是没问题的)

Redis客户端的Get/Set操作平均耗时200~600us(含往返网络通信),以此为参考评估网络环境和Redis客户端组件(达不到就看一下网络,序列化方式等等)

使用管道Pipeline合并一批命令

Redis的主要性能瓶颈是序列化、网络带宽和内存大小,滥用时处理器也会达到瓶颈

其它可查优化技巧以上经验,源自于300多个实例4T以上空间一年多稳定工作的经验,并按照重要程度排了先后顺序,可根据场景需要酌情采用!

缓存Redis的兄弟姐妹

Redis实现ICache接口,它的孪生兄弟MemoryCache,内存缓存,千万级吞吐率。各应用强烈建议使用ICache接口编码设计,小数据时使用MemoryCache实现;数据增大(10万)以后,改用Redis实现,不需要修改业务代码。

提问环节聊聊大数据中Redis使用的经验,问题

1、一条数据多个key怎么设置比较合理?

如果对性能要求不是很高直接用json序列化实体就好,没必要使用字典进行存储。

2、队列跟List有什么区别?左进右出的话用List还是用队列比较好?

队列其实就是用List实现的,也是基于List封装的。左进右出的话直接队列就好。Redis的List结构比较有意思,既可以左进右出,也能右进左出。所以它既可以实现列表结构,也能队列,也能实现栈

3、存放多个字段的类性能一样吗?

大部分场景都不会有偏差,可能对于大公司数据量比较大的场景会有些偏差

4、可否介绍一下使用Redis进行数据计算、统计的场景?

略。自己看视频吧!o(∩_∩)o 哈哈!(因为我没听清!)

5、大数据写入到数据库之后 比如数据到亿以上的时候 统计分析这块 查询这块 能不能分享些经验。

分表分库,拆分到一千万以内。

6、CPU为何暴涨?

程序员终极理念:CPU达到百分百,然后性能达到最优,尽量不要浪费。最痛恨的是:如果cpu不到百分百,性能没法提升了,说明代码有问题!

视频地址

视频已经上传至百度云,大家可以自行下载观看链接:https://pan.baidu.com/s/1sOW_PLjxQE8C2msbDfizeA提取码:c7dp观看指南(笑笑提供)

总结

虽然Redis会用,但是没有像大石头这样的大数据使用场景。今天的视频收获颇丰,可能大部分人跟我一样,没有大石头的使用场景,但是值得借鉴的经验还是很丰富的!期待下一次的精彩分享。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 封装
    +关注

    关注

    123

    文章

    7095

    浏览量

    140898
  • 服务器
    +关注

    关注

    12

    文章

    8013

    浏览量

    82209
  • Redis
    +关注

    关注

    0

    文章

    350

    浏览量

    10466

原文标题:Redis 基本使用及百亿数据量中的使用技巧

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    企业打开Redis的正确方式,来自阿里云云数据库团队的解读

    数据库。自2009年发布最初版本以来,Redis的热度只增不减,除了经常位居DB-Engines的最受欢迎Key-Value数据库榜首之外,也多家调查报告
    发表于 02-07 14:06

    Redis Stream应用案例

    互联网服务作为Cache和KV存储广泛应用,Redis下一个大放异彩的领域也许就在物联网。上面这个图,就是一个典型的物联网设备信息采集,分析,展示的架构Redis作为一个嵌入式的存
    发表于 06-26 17:15

    详解Redis的列表类型list

    Redis入门(四)Redis数据类型之列表类型list
    发表于 05-08 08:16

    redis概述

    REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统。redis和大名鼎鼎的Memcached缓存服务软件很像,但是redis
    发表于 07-17 07:38

    Redis的特点和优势

    Redis 数据类型
    发表于 08-26 07:58

    浅析Redis的过期机制

    Redis数据过期策略详解
    发表于 10-12 15:12

    Spring bootRedis的使用

    【本人秃顶程序员】springboot专辑:Spring bootRedis的使用
    发表于 03-27 11:42

    Redis-数据结构与对象

    Redis-数据结构与对象-对象
    发表于 06-01 17:28

    如何使得redis数据不再有

    ,原因是redis的持久化功能导致的,所谓的持久化就是redis系统关闭的时候把数据存储到硬盘,在下一次启动的时候,在从硬盘恢复到
    发表于 11-05 08:50

    labview读写操作REDIS

    本帖最后由 SevenLi8408 于 2022-9-15 08:07 编辑 分享一个好用的非关系型缓存数据库的使用方法。REDIS桌面管理软件https://github.com
    发表于 08-15 10:32

    什么是 Redis

      —   1  — 什么是 RedisRedis(REmote DIctionary Service)是一个开源的键值对数据库服务器。 Redis 更准确的描述是一个
    的头像 发表于 05-22 15:32 590次阅读
    什么是 <b class='flag-5'>Redis</b>

    Redis的主从、哨兵、Redis Cluster集群

    + MyBatis Plus + Vue 另外一个就是保证 Redis服务不中断 。 对于尽量减少数据丢失,可以通过AOF和RDB保证。 对于保证服务不中断的话,Redis就不能单点部署,这时候我们先看下
    的头像 发表于 06-12 14:58 455次阅读
    <b class='flag-5'>Redis</b>的主从、哨兵、<b class='flag-5'>Redis</b> Cluster集群

    Redis架构演化之路

    这个架构非常简单,你的业务应用可以把 Redis 当做缓存来使用,从 MySQL 中查询数据,然后写入到 Redis 中,之后业务应用再从 Redi
    的头像 发表于 08-03 16:54 286次阅读
    <b class='flag-5'>Redis</b><b class='flag-5'>架构</b>演化之路

    Redis数据清理策略

    本文整理 Redis数据清理策略所有代码来自 Redis version :5.0, 不同版本的 Redis 策略可能有调整
    发表于 09-19 14:24 121次阅读
    <b class='flag-5'>Redis</b> 的<b class='flag-5'>数据</b>清理策略

    redis容器内怎么查看redis日志

    redis是一款流行的开源内存数据库,常用于缓存、消息队列、任务管理等场景。在使用redis时,了解如何查看redis日志对于排查问题、监控性能和分析应用程序行为非常重要。在本文中,我
    的头像 发表于 12-05 10:10 1053次阅读