HyperLogLog

为什么 Redis 要比 Memcached 更火?

混江龙づ霸主 提交于 2021-02-18 04:06:32
作者:Kaito 链接:kaito-kidd.com/2020/06/28/redis-vs-memcached/ 前言 我们都知道,Redis和Memcached都是内存数据库,它们的访问速度非常之快。但我们在开发过程中,这两个内存数据库,我们到底要如何选择呢?它们的优劣都有哪些? 为什么现在看Redis要比Memcached更火一些? 这篇文章,我们就从各个方面来对比这两个内存数据库的差异,方便你在使用时,做出最符合业务需要的选择。 要分析它们的区别,主要从以下几个方面对比: 线程模型 数据结构 淘汰策略 管道与 事务 持久化 高可用 集群化 线程模型 要说性能,必须要分析它们的服务模型。 Memcached处理请求采用多线程模型,并且基于IO多路复用技术,主线程接收到请求后,分发给子线程处理。 这样做好的好处是,当某个请求处理比较耗时,不会影响到其他请求的处理。 当然,缺点是CPU的多线程切换必然存在性能损耗,同时,多线程在访问共享资源时必然要加锁,也会在一定程度上降低性能。 Redis同样采用IO多路复用技术,但它处理请求采用是单线程模型,从接收请求到处理数据都在一个线程中完成。 这意味着使用Redis,一旦某个请求处理耗时比较长,那么整个Redis就会阻塞住,直到这个请求处理完成后返回,才能处理下一个请求,使用Redis时一定要避免复杂的耗时操作。 单线程的好处是

突破开源Redis的内存限制,存算分离的GaussDB到底有多能“装”?

寵の児 提交于 2021-01-21 21:04:11
摘要: GaussDB(for Redis)(下文简称 高斯Redis )是华为云数据库团队自主研发的兼容Redis协议的云原生数据库,该数据库采用计算存储分离架构,突破开源Redis的内存限制,可轻松扩展至PB级存储。 本文将从存储架构、四大特性、竞争力、应用场景等方面进行介绍。 存储架构 高斯Redis基于计算存储分离架构,计算层实现热数据缓存,存储层实现全量数据的落盘,中间通过RDMA高速网络互连,通过算法预测用户的访问规律,实现数据的自动冷热交换,最终达到极致的性能提升。 四大特性 该架构基于华为内部强大且广泛使用的自研分布式存储系统DFV,实现了一套Share Everything的云原生架构,充分发挥了云原生的弹性伸缩、资源共享的优势,使得高斯Redis具备强一致、秒扩容、低成本、超可用的四大特点,完美避开了开源Redis的主从堆积、主从不一致、fork抖动、内存利用率只有50%、大key阻塞、gossip集群管理等问题。 强一致 数据复制是存储的事情,因此专业的事情交给专业的团队来做。通过分布式存储DFV,高斯Redis轻松实现了3副本强一致,并可轻松支持6副本,为业界首创。 在强一致架构下,用户再也不用担心开源Redis的主从堆积,带来的丢数据、不一致、OOM等极端问题,更不用担心业务出错,比如计数器、限流器、访问统计、hash字段等不一致。 秒扩容

Java连接Redis测试

試著忘記壹切 提交于 2021-01-12 02:00:58
用eclipse新建一个Maven工程,在pom.xml文件里面,引入redis和junit的依赖。 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.comtop.cn</groupId> <artifactId>JavaRedis</artifactId> <version>0.0.1-SNAPSHOT</version> <name>JavaRedis</name> <description>java连接redis例子</description> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>

【Redis】二、Redis高级特性

五迷三道 提交于 2021-01-09 06:37:11
(三) Redis高级特性   前面我们介绍了Redis的五种基本的数据类型,灵活运用这五种数据类型是使用Redis的基础,除此之外,Redis还有一些特性,掌握这些特性能对Redis有进一步的了解,比如Redis事务、Redis分区、Redis的数据备份等等。 1、Redis HyperLogLog   Redis从2.8.9版本开始加入了HyperLogLog,这听起来有点陌生,实际上它是一个用来 做基数统计的算法 (基数就是数据集中不重复的元素个数,比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8},基数为5)。   Redis做基数统计有其特有的优势,在输入元素的数量或者体积非常非常大时,Redis计算基数所需的空间总是固定的、并且是很小的,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数,但是它只计算基数,并不储存输入元素本身。<div align=center> </div> 2、Redis数据备份与恢复   Redis支持数据的备份,并可以从备份中恢复数据。这主要就是涉及到一个save命令。   当输入save命令时,将在redis安装目录穿件dump.rdb文件,此文件就是备份的数据。如果想恢复数据,只需要将dump.rdb移动到安装目录下

【redis】三种特殊数据类型

大城市里の小女人 提交于 2021-01-06 08:17:52
三种特殊数据类型 geospatial 地理位置 geoadd 添加经纬度 geopos 获取经纬度 geodist 给定位置之间的距离 georadius、georadiusbymember 半径 geohash hyperloglog pfadd pfcount 统计基数数量 pfmerge 合并多个hyperloglog bitmap setbit getbit bitcount 统计 geospatial 地理位置 底层是zset实现的, 可以用zset的命令操作 geoadd 添加经纬度 GEOADD key longitude latitude member [longitude latitude member ...] geoadd 用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。 两极无法直接添加,一般会下载城市数据,直接通过java程序一次导入 127.0.0.1:6379 > geoadd china:city 16.40 39.90 beijing ( integer ) 1 127.0.0.1:6379 > geoadd china:city 121.47 31.23 shanghai ( integer ) 1 127.0.0.1:6379 > geoadd

Redis:从应用到底层,一文帮你搞定

£可爱£侵袭症+ 提交于 2020-12-23 10:47:25
Python实战社群 Java实战社群 长按识别下方二维码, 按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群 ▲ 作者丨sowhat1412 来源丨sowhat1412(ID:sowhat9094) 高清思维导图已同步Git:https://github.com/SoWhat1412/xmindfile,关注公众号sowhat1412获取海量资源 总感觉哪里不对,但是又说不上来 1、基本类型及底层实现 1.1、String 用途: 适用于简单key-value存储、setnx key value实现分布式锁、计数器(原子性)、分布式全局唯一ID。 底层 :C语言中String用char[]数组表示,源码中用 SDS (simple dynamic string)封装char[],这是是Redis存储的 最小单元 ,一个SDS最大可以存储512M信息。 struct sdshdr{ unsigned int len; // 标记char[]的长度 unsigned int free; //标记char[]中未使用的元素个数 char buf[]; // 存放元素的坑 } Redis对SDS再次封装生成了 RedisObject ,核心有两个作用: 说明是5种类型哪一种。 里面有指针用来指向 SDS。 当你执行 set name sowhat

一文让你彻底了解Redis基础,史上最全【建议新手收藏】

时间秒杀一切 提交于 2020-12-12 12:49:44
一、Redis简介 redis简介(Remote dictionary Server 远程字典服务器): 是完全开源免费的,由C语言编写的,一个高性能的(key/value)分布式内存数据库,基于内存运行, 并支持持久化的Nosql数据库,也被称为" 数据结构服务器 "。 提前剧透、redis关于key-value的三大特点: redis是支持持久化的! 我们可以控制 数据 何时,用何种方式 保存到磁盘中,每次重启再次加载该文件,可以完成数据恢复 redis不单单支持简单的key-value数据类型,同时还可以提供list,set,hash,zset等数据类型的存储 支持数据的备份,mater-slave模式,即,当下时髦的主从复制读写分离 应用场景: 内存存储的持久化: 虽然redis是单线程实现的,但是支持异步将数据持久化到硬盘上,同时不影响继续服务 发布订阅 定时器,计时器: 我们可以把这个特性用到发短信的服务中,每次发送完短信后,就进入倒计时,在指定的时间内,决绝发送第二次,有效的缓解短信服务的压力,节流 取出最新的N个数据的操作: 比如新浪微博的评论系统,他要展示最新的10条评论,就是把最新的10条评论的id放到redis的list里面 二、安装 去官网下载压缩包 : https://redis.io/download 安装依赖、编译、安装: [ root

Redis的过期策略和内存淘汰策略

故事扮演 提交于 2020-12-05 00:59:28
Redis的过期策略和内存淘汰策略搞混淆了。 Redis的过期策略 我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。 过期策略通常有以下三种: 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。 (expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。) Redis中同时使用了惰性过期和定期过期两种过期策略

妈妈再也不用担心我不会Redis了!

痴心易碎 提交于 2020-12-04 11:29:19
前言: Redis 是如今互联网技术架构中,使用最广泛的缓存。支持 复杂的数据结构 ,支持 持久化 ,支持 主从集群 ,支持 高可用 ,支持 较大的value存储 ... 同时, Redis 也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一。特别是那些优秀的、竞争激烈的大型互联网公司(比如 Twitter、新浪微博、阿里云、腾讯云、淘宝、知乎等),通常要求面试者不仅仅掌握 Redis 基础使用,更要求深层理解 Redis 内部实现的细节原理。毫不夸张地说,能把 Redis 的知识点全部吃透,你的半只脚就已经踏进心仪大公司的技术研发部。 然而,绝大部分开发者只会拿 Redis 做数据缓存,使用最简单的 get/set 方法,除此之外几乎一片茫然,对 Redis 内部实现的细节原理知之甚少。例如: 有同学知道 Redis 的 分布式锁 ,但完全不清楚其内部实现机制 有同学知道 Redis 是 单线程结构 ,但完全不理解 Redis 缘何单线程还可以支持高并发 有同学知道 Redis 支持 主从 ,但完全不晓得内部的实现机制 于是,一位有着十年经验的互联网分布式高并发技术老兵,梳理自己多年 Redis 实践经验,写了这本书,以帮助更多工程师更快,更深入的了解 Redis 。 作者在掌阅维护着上千个 Redis 实例的集群,他在 Redis 持久化,缓存,消息队列 的各类实战经验

redis-分布式布隆过滤器(Bloom Filter)详解(初版)

随声附和 提交于 2020-11-23 19:38:59
redis-分布式布隆过滤器(Bloom Filter)详解(初版) 1 布隆过滤器(Bloom Filter)原理以及应用 假设现在有50亿个电话号码,现在有1万个电话号码,需要快速判断这些电话号码是否已经存在? 现在有3中途径 1 通过数据库查询,但是不能快速查询。 2 把电话号码预先放在一个集合中,如果用long类型存储的话,50亿 * 8字节 = 大于需要40GB(内存浪费或者严重不够) 3 使用redis的hyperloglog,但是准确度不高。 类似的问题: 垃圾邮件过滤 文字处理中的错误单词检测 网络爬虫重复URL检测 会员抽奖 判断一个元素在亿级数据中是否存在 缓存穿透 而布隆过滤器则可以解决上述问题 1 什么是布隆过滤器 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 当一个元素被加入集合时,通过 K 个 Hash 函数将这个元素映射成一个位阵列(Bit array)中的 K 个点,把它们置为 1。检索时,我们只要看看这些点是不是都是 1 就(大约)知道集合中有没有它了: 如果这些点有任何一个 0,则被检索元素一定不在; 如果都是 1,则被检索元素很可能在。