(三) 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 个不同元素的基数,但是它只计算基数,并不储存输入元素本身。

2、Redis数据备份与恢复

  Redis支持数据的备份,并可以从备份中恢复数据。这主要就是涉及到一个save命令。

  当输入save命令时,将在redis安装目录穿件dump.rdb文件,此文件就是备份的数据。如果想恢复数据,只需要将dump.rdb移动到安装目录下,然后重新启动redis-server即可。因此,我们使用这样的数据备份和恢复可以很方便的对数据库进行迁移。

3、Redis安全和认证

  为了保证Redis服务的安全性,可以对redis添加密码,这样当客户端连接到redis服务时就需要输入密码进行验证,通过后才能连接。

  Redis服务的密码是通过配置文件进行指定的,密码参数是配置文件中的requirepass,默认是空字符串,只需要更改此参数就可以设置密码,设置密码后需要进行auth认证才可以进行相应的操作。

4、Redis性能测试

  我们说Redis最大的一个特点是性能极高,读的速度是110000次/s,写的速度是81000次/s。Redis提供了一个性能测试工具redis-benchmark,通过同时执行多个命令来测试性能。这个测试工具有很多可选参数:-h(指定主机),-p(指定端口),-s(指定Socket),-c(指定并发连接数),-n(指定请求数),-d(指定set和get的值是多少个字节)等等。

5、Redis事务

  Redis事务允许客户端依次执行多个命令,并且符合以下规则:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

  一个事务从开始到执行会经历以下三个阶段:开始事务、命令入队、执行事务。具体地,先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令。

  单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

6、Redis发布和订阅

  在另外一篇关于Kafka的博客:【Apache Kafka】 Kafka简介及其基本原理中,介绍了什么是消息队列,并对发布-订阅这种消息模式有相关的介绍,这里我们说Redis也可以用作简单的消息队列,发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道,当有新消息发送到该频道时,客户端就可以收到消息。

7、Redis管道技术

  Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:

  • 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
  • 服务端处理命令,并将结果返回给客户端。

  Redis 管道技术可以达到这样的效果:在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。

8、Redis分区

  我们说Redis是一个分布式缓存、分布式数据库,那么到目前我们还没有看到其分布式体现在哪里,Redis数据保存在内存中,如果只有一台机器,很容易达到其存储上限。因此,Redis分区允许构建redis集群,将数据分别保存到多个Redis实例中去,每个实例保存key的一个子集,这样就可以利用更多的计算机来存储数据,从而构造更大的数据库。

  除了数据量更大,Redis分区还可以带来更强大的计算能力和更高的网络带宽。

  关于如何进行分区,Redis提供了两种类型。一种是范围分区,就是映射一定范围的对象到特定的Redis实例。比如,ID从0到10000的用户会保存到实例R0,ID从10001到 20000的用户会保存到R1,以此类推。还有一种方法是哈希分区,用一个hash函数将key转换为一个数字,对这个整数取模,转换到对应的Redis实例中的一个。

【Redis】二、Redis高级特性的更多相关文章

  1. 深入浅出Redis(二)高级特性:事务

    第一篇中介绍了Redis是一个强大的键-值仓储,支持五种灵活的数据结构.其实,Redis还支持其他的一些高级特性:事务.公布与订阅.管道.脚本等,本篇我们来看一下事务. 前一篇中我们提到,在Redis ...

  2. Redis基础、高级特性与性能调优

    本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...

  3. Redis 基础、高级特性与性能调优

    本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...

  4. redis(二)redis+TCMALLOC高性能的缓存服务器的安装配置

    安装  1准备编译环境    yum -y install gcc gcc+ gcc-c++ openssl openssl-devel pcre pcre-devel  2 下载源码包(由于goog ...

  5. redis(二)-----redis基本数据类型之字符串

    Redis的全称是REmote Dictionary Server,它主要提供了5种数据结构:字符串.哈希.列表.集合.有序集合,同时在字符串的基础之上演变 出了位图(Bitmaps)和HyperLo ...

  6. Redis(二):Redis的九大应用场景

    毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象 ...

  7. Python学习笔记(二)——高级特性

    知识点 切片 切片 取一个list或tuple的部分元素. 原理:调用__getitem__,__setitem__,__delitem__和slice函数. 根据官方的帮助文档(https://do ...

  8. Scala学习(二)——高级特性

    apply() 方法 apply方法是Scala提供的一个语法糖 类名+括号,调用对象的apply方法 对象名+括号,调用类的apply方法 对apply方法的简单测试:(其中,带 new -- cl ...

  9. Redis基础用法、高级特性与性能调优以及缓存穿透等分析

     一.Redis介绍 Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库.缓存服务或消息服务使用.Redis支持多种数据结构,包括字符串.哈希表.链表.集合.有序集合.位图.Hype ...

随机推荐

  1. ViewControl的size设为freeform

    freeform的用处是让你写一些不标准的view,比如说自定义一个cell,或者自己写一个小的VIEW,freeform的XIB是可以自己拖拽更改大小的

  2. bzoj 1924 所驼门王的宝藏

    题目大意: 有一个r*c的矩阵,上面有n个点有宝藏 每个有宝藏的点上都有传送门 传送门有三种:第一种可以传到该行任意一个有宝藏的点,第二种可以传到该列任意一个有宝藏的点,第三种可以传到周围的八连块上有 ...

  3. go语言---slice

    go语言---slice https://blog.csdn.net/cyk2396/article/details/78893420 一.数组切片的使用: //1.基于数组创建数组切片 var ar ...

  4. POJ2503 Babelfish map或者hash_map

    POJ2503 这是一道水题,用Map轻松AC. 不过,可以拿来测一下字符串散列, 毕竟,很多情况下map无法解决的映射问题需要用到字符串散列. 自己生成一个质数, 随便搞一下. #include&l ...

  5. bzoj3612 [Heoi2014]平衡——整数划分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3612 看了好久才弄清楚题意... 原来整数划分就是这样的啊:https://blog.csd ...

  6. E20180121

    signature  n. 签名; 署名; 识别标志,鲜明特征; [医] 药的用法说明;

  7. E20170602-ts

    questionnaire  n. 调查问卷; 调查表;  アンケート不是英语 collection   n. 征收; 收集,采集; 收藏品; 募捐; association   n. 联想; 协会, ...

  8. bzoj 1655: [Usaco2006 Jan] Dollar Dayz 奶牛商店【高精度+完全背包】

    居然要用高精度! 懒得operator了,转移是裸的完全背包 #include<iostream> #include<cstdio> using namespace std; ...

  9. P3207 [HNOI2010]物品调度

    传送门 完了题目看错了--还以为所有的\(x,y\)都要一样--结果题解都没看懂-- 先考虑如果已经求出了所有的\(pos\)要怎么办,那么我们可以把\(0\)也看做是一个箱子,然后最后每个箱子都在一 ...

  10. Final关键字解析

    final 在 Java 中是一个保留的关键字,可以声明变量.方法.类. 什么是final变量 / 类 / 方法? 任何变量前被 final 修饰就是 final 变量,定义的类前被 final 修饰 ...