Redis学习记录

参考资料:

http://www.dengshenyu.com/%E5%90%8E%E7%AB%AF%E6%8A%80%E6%9C%AF/2016/01/09/redis-reactor-pattern.html
http://www.redis.cn/topics/data-types.html
http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.html
https://toutiao.io/posts/546542/app_preview
http://ifeve.com/redis-persistence/

0. 环境

Redis server: 3.0.3

1. 数据类型

  • 字符串(Strings)

字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任意类型的数据。一个字符串类型的值最多能存储512M字节的内容。

  • 列表(Lists)

Redis列表是简单的字符串列表,按照插入顺序排序。

  • 集合(Sets)

Redis集合是一个无序的字符串合集。添加、删除以及测试元素是否存在操作的时间复杂度为O(1)。

  • 哈希(Hashes)

Redis Hashes是字符串字段和字符串值之间的映射,所以它们是完美的表示对象的数据类型。

  • 有序集合(Sorted sets)

Redis有序集合和Redis集合类似,是不包含相同字符串的合集。但每个有序集合的成员都关联着一个评分,这个评分用于把有序集合中的成员按最低分到最高分排列。

  • Bitmaps 和 HyperLogLogs

Redis同样支持Bitmaps和HyperLogLogs数据类型,实际上是基于字符串的基本类型的数据类型,但有自己的语义。

2. Redis为什么速度快?

  • 完全基于内存
  • 单线程:CPU无需在多个线程之间来回切换
  • I/O多路复用技术:异步非阻塞IO,既不会因为线程过多导致CPU频繁切换,又能充分利用服务器资源

3. Redis超时及应对方法?

  • 慢查询:确认是否使用慢查询,可以使用slowlog get num查看相应的慢命令
  • 内存使用情况:由于Redis完全基于内存,故这个指标需要关注
  • 连接客户端数量:若连接客户端数量超过默认值容易导致超时
  • 查看redis主机是否为虚拟机,这样会有内存延迟:./redis-cli --intrinsic-latency 100这个命令可以在server端进行判断是否redis有延迟,在客户端通过-h -p 参数可以进行对比一下是否为网络上的影响
  • 一般情况下大量的删除、过期以及淘汰(由maxmemory-policy控制的)的大对象,也会造成redis阻塞,进而造成相应的延迟:经常有比较大的对象进行删除、过期和淘汰的,建议将这些对象分割成一些小对象。
  • 持久化导致延迟,因为持久化是把数据保存到磁盘中,IO操作占用大量CPU资源可能导致Redis无法得到执行时间:选择更合理的持久化方案,例如AOF + fsync every second

4. Redis持久化及其优缺点

  • RDB持久化:可以在指定的时间间隔内生成数据集的时间点快照
  • AOF持久化:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集
  优点 缺点
RDB
  1. RDB是一种表示某个即时点的Redis数据的紧凑文件。RDB文件适合用于备份。
  2. RDB非常适合于灾难恢复,作为一个紧凑的单一文件,可以被传输到远程的数据中心。
  3. RDB最大化了Redis的性能,因为Redis父进程持久化时唯一需要做的是启动(fork)一个子进程,由子进程完成所有剩余工作。父进程实例不需要执行像磁盘IO这样的操作。
  4. RDB在重启保存了大数据集的实例时比AOF要快。
  1. 当你需要在Redis停止工作(例如停电)时最小化数据丢失,RDB可能不太好。你可以配置不同的保存点(save point)来保存RDB文件(例如,至少5分钟和对数据集100次写之后,但是你可以有多个保存点)。然而,你通常每隔5分钟或更久创建一个RDB快照,所以一旦Redis因为任何原因没有正确关闭而停止工作,你就得做好最近几分钟数据丢失的准备了。
  2. RDB需要经常调用fork()子进程来持久化到磁盘。如果数据集很大的话,fork()比较耗时,结果就是,当数据集非常大并且CPU性能不够强大的话,Redis会停止服务客户端几毫秒甚至一秒。AOF也需要fork(),但是你可以调整多久频率重写日志而不会有损(trade-off)持久性(durability)。
AOF
  1. 使用AOF Redis会更具有可持久性(durable):你可以有很多不同的fsync策略:没有fsync,每秒fsync,每次请求时fsync。使用默认的每秒fsync策略,写性能也仍然很不错(fsync是由后台线程完成的,主线程继续努力地执行写请求),即便你也就仅仅只损失一秒钟的写数据。
  2. AOF日志是一个追加文件,所以不需要定位,在断电时也没有损坏问题。即使由于某种原因文件末尾是一个写到一半的命令(磁盘满或者其他原因),redis-check-aof工具也可以很轻易的修复。
  3. 当AOF文件变得很大时,Redis会自动在后台进行重写。重写是绝对安全的,因为Redis继续往旧的文件中追加,使用创建当前数据集所需的最小操作集合来创建一个全新的文件,一旦第二个文件创建完毕,Redis就会切换这两个文件,并开始往新文件追加。
  4. AOF文件里面包含一个接一个的操作,以易于理解和解析的格式存储。你也可以轻易的导出一个AOF文件。例如,即使你不小心错误地使用FLUSHALL命令清空一切,如果此时并没有执行重写,你仍然可以保存你的数据集,你只要停止服务器,删除最后一条命令,然后重启Redis就可以。
  1. 对同样的数据集,AOF文件通常要大于等价的RDB文件。
  2. AOF可能比RDB慢,这取决于准确的fsync策略。通常fsync设置为每秒一次的话性能仍然很高,如果关闭fsync,即使在很高的负载下也和RDB一样的快。不过,即使在很大的写负载情况下,RDB还是能提供能好的最大延迟保证。
  3. 在过去,我们经历了一些针对特殊命令(例如,像BRPOPLPUSH这样的阻塞命令)的罕见bug,导致在数据加载时无法恢复到保存时的样子。

5. Redis与Memcached的区别

  • 实现机制不同:Redis单进程单线程,Memcached单进程多线程
  • 持久化策略不同:Redis支持持久化,Memcached必须借助外部工具才能实现持久化
  • Redis功能比Memcached更强大,Redis不仅仅是内存数据库(例如可利用Pub/Sub实现发布订阅的消息中间件),而Memcached仅仅是内存数据库
时间: 2024-10-05 14:04:02

Redis学习记录的相关文章

一、Redis安装 Redis学习记录

Redis学习记录 一.Redis安装安装Redis环境 系统 centos1.先到Redis官网(redis.io)下载redis安装包 https://redis.io/ 1.获取redis资源wget http://download.redis.io/releases/redis-5.0.5.tar.gz Linux执行 wget命令:提示command not found的两种解决方法https://blog.csdn.net/tyyking/article/details/830840

redis 学习记录

http://www.yiibai.com/redis/redis_quick_guide.html Redis 是一款依据BSD开源协议发行的高性能Key-Value存储系统(cache and store).它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(hashes), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型. Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完

Redis学习记录之Java中的初步使用

1.关于Redis redis下载地址:<span style="font-family: Arial, Helvetica, sans-serif;">http://download.csdn.net/detail/he90227/8569855</span> Redis是什么?两句话可以做下概括: 1. 是一个完全开源免费的key-value内存数据库 2. 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings.map. list.

Redis学习记录之————微博项目

Key设计 全局相关的key: 表名 global 列名 操作 备注 Global:userid incr 产生全局的userid Global:postid Incr 产生全局的postid 用户相关的key(表): 表名 user Userid Username Password Authsecret 3 Test3 1111111 #U*Q(%_ 用户注册: /** * 用户注册信息 */ public function userRegister() { $redis = RedisIns

Redis——学习之路四(初识主从配置)

首先我们配置一台master服务器,两台slave服务器.master服务器配置就是默认配置 端口为6379,添加就一个密码CeshiPassword,然后启动master服务器. 两台slave服务器配置如下: 1.先找到配置redis.windows-service.config文件修改port 6379 为port 6380 2.然后配置master服务器地址:slaveof 127.0.0.1 6379,然后主服务有密码还需要配置密码 masterauth CeshiPassword(本

Redis——学习之路三(初识redis config配置)

我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息. 我们就从上到下来理解一下这些配置信息中的某些配置: 1.dbfilename是本地持久化存储数据库文件名,默认为dump.rdb.我可以在安装目录文件夹下找到这个文件. 2.requirepass是密码,即连接服务器的密码,默认为空.下面我来设置一个密码然后用带密码的命令连接一遍. 3.msterauth

redis入门学习记录(二)

继第一节 redis入门学习记录(一)之后,我们来学习redis的基本使用. 接下来我们看看/usr/local/redis/bin目录下的几个文件作用是什么? redis-benchmark:redis性能测试工具 redis-check-aof:检查aof日志的工具 redis-check-dump:检查rdb日志的工具 redis-cli:连接用的客户端 redis-server:redis服务进程 1.使用redis的客户端操作 我们现在往redis存储一个key = value  的数

Redis学习笔记4-Redis配置具体解释

在Redis中直接启动redis-server服务时, 採用的是默认的配置文件.採用redis-server   xxx.conf 这种方式能够依照指定的配置文件来执行Redis服务. 依照本Redis学习笔记中Redis的依照方式依照后,Redis的配置文件是/etc/redis/6379.conf.以下是Redis2.8.9的配置文件各项的中文解释. #daemonize no 默认情况下, redis 不是在后台运行的.假设须要在后台运行,把该项的值更改为 yes daemonize ye

ELK stack 学习记录

ELK日志分析平台学习记录 首先ELK主要指elasticsearch .logstash 和kibana,三个开源软件组合而成的一套日志平台解决方案.可以将平时收集到的日志,通过前台展示出来,并且可以加以分析,理论上可以解放劳动力(再也不用干上生产取日志这种活了--很搓). 最近在研究ELKstack日志分析平台,网上相关的中文资料不多.所以呢也就写了这篇文章将自己的一些学习认识总结记录下来,基本偏实战,概念理论较少,概念这块,我想以后可以再开一篇文章来做一个阐述总结. 这篇文章中会先讲一下搭