Redis学习笔记

来源:互联网 发布:mysql被攻击 编辑:程序博客网 时间:2024/06/08 12:38

一,Redis学习笔记系列博客

  • Redis持久化
  • Redis复制和哨兵

二,Redis简介

这里写图片描述
Redis,REmote DIctionary Server(远程字典服务) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
同时Redis的诸多高层级功能使其可以胜任消息队列、任务队列等不同的角色。

Redis数据库中的所有数据都存储在内存中。由于内存的读写速度远快鱼硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势,在一台普通的笔记本电脑上,Redis可以在一秒内读写超过10万个键值。
将数据存储在内存中也有问题,比如程序退出后内存中的数据会丢失。不过Redis提供了对持久化的支持,即可以将内存中的数据异步写入到硬盘中,同时不影响继续提供服务。

关于Redis和Memcached优劣的讨论一直是一个热门的话题。在性能上Redis是单线程模型,而Memcached支持多线程,所以在多核服务器上后者的性能理论上相对更高一些。然而,前面已经介绍过,Redis的性能已经足够优异,在绝大部分场合下其性能都不会成为瓶颈,所以在使用时更应该关心的是二者在功能上的区别。相比Memcached,Redis支持更多的数据结构。随着Redis3.0的推出,标志折Memcached 几乎所有功能都成为Redis的子集。同时,Redis对集群的支持使得Memcached原有的第三方集群工具不再成为优势。因此,在新项目中使用Redis代替Memcached将会是非常好的选择。

Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,也可以说,Redis的锁级别就是整个数据库。

官网:https://redis.io/
中文官方网站:http://www.redis.cn/
Redis 命令参考:http://redisdoc.com/


三,Redis入门

Redis的常规操作网上有很多入门资料,例如菜鸟教程的Redis教程就是一个不错的选择。
http://www.runoob.com/redis/redis-tutorial.html

1,Redis键名命名提示

可以使用冒号(:)来分割键名的不同部分。例如一个文档系统,就可以使用article:123 来做键名,通过冒号分隔单词article和文章的ID号123,以此构建命名空间。使用:作为分隔符是Redis的常见方式,还有一些常见的分隔符,如英文句号(.),斜线(/),有些人甚至会使用管道符号(|)。无论使用哪个符号来做分隔符,都要保持分隔符的一致性。

2,启动Redis

直接运行redis-server即可启动Redis

redis-server

Redis服务器默认会使用6379端口,通过–port参数可以自定义端口号:

redis-server --port 6380

通过-h和-p参数可以自定义地址和端口号

redis-server -h 127.0.0.1 -p 6379

3,停止Redis

redis-cli shutdown

4,多数据库

Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的关系数据库中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。
每个数据库对位都是以一个从0开始的递增数字命名,Redis默认支持16个数据库,可以通过配置参数database来修改这一数字。客户端与Redis监理连接后自动选择0号数据库,不过可以随时使用select命令更换数据库,如选择1号数据库:
这里写图片描述
然而这些以数字命名的数据库又与我们理解的数据库有所区别。首先,Redis不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。另外Redis也不支持每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。最重要的一点是多个数据库之间并不是完全隔离的,比如flushall命令可以清空一个Redis实例中所有数据库的数据。
由于Redis非常轻量级,一个空Redis实例占用的内存只有1MB左右,所以不用担心多个Redis实例会额外占用很多内存。

5,耗时命令日志

当一条命令执行时间超过限制时,Redis会将该命令的执行时间等信息加入耗时命令日志(slow log)以供开发者查看。配置文件的slowlog-log-slower-than 10000 设置了限制时间,单位是微妙。耗时命令日志存储在内存中,可以通过配置文件的slowlog-max-len 128 参数限制记录的条数。

redis> SLOWLOG GET1) 1) (integer) 12                      # 唯一性(unique)的日志标识符   2) (integer) 1324097834              # 被记录命令的执行时间点,以 UNIX 时间戳格式表示   3) (integer) 16                      # 查询执行时间,以微秒为单位   4) 1) "CONFIG"                       # 执行的命令,以数组的形式排列      2) "GET"                          # 这里完整的命令是 CONFIG GET slowlog-log-slower-than      3) "slowlog-log-slower-than"

6,命令监控

Redis提供了monitor命令监控Redis执行的所有命令。
在redis-cli中执行monitor命令
这里写图片描述
打开另一个redis-cli执行命令
这里写图片描述
之前执行monitor的redis-cli会输出如下内容
这里写图片描述
monitor命令非常影响Redis的性能,一个客户端使用monitor命令会降低Redis将近一半的负载能力。所以monitor命令只适合用来调试和纠错。
redis-faina,一个基于monitor命令的Redis查询分析程序,可以根据monitor命令的监控结果分析出最常用的命令、访问最频繁的键等信息,对了解Redis的使用情况帮助很大。
GitHub地址:https://github.com/facebookarchive/redis-faina

7,rdbtools3

rdbtools3是一个Redis的快照文件分析器,它可以根据快照文件导出json数据文件、CSV文件,用于分析Redis中每个键的占用空间情况等。
GitHub地址:https://github.com/popravich/rdbtools3

8,Redis分布式锁

http://www.redis.cn/topics/distlock.html
http://blog.csdn.net/yuxxz/article/details/52551357

9,事件

Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:
文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端(或者其他服务器)的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。
时间事件(time event):Redis服务器中的一些操作需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。

10,客户端

Redis服务器是典型的一对多服务器:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接受并处理客户端发送的命令请求,并向客户端返回命令回复。

通过使用由I/O多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。

对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redisClient结构(客户端状态),这个结构保存了客户端当前的状态信息,以及执行相关功能时需要用到的数据结构。

Redis服务器状态结构的clients属性是一个链表,这个链表保存了所有与服务器连接的客户端的状态结构,对客户端执行批量操作,或者查找某个指定的客户端,都可以通过遍历clients链表来完成。

下图展示了一个与三个客户端进行连接的服务器。
这里写图片描述

下图则展示了这个服务器的clients链表的样子。
这里写图片描述

服务器状态结构使用clients链表连接器多个客户端状态,新添加的客户端状态会被放到链表的末尾。


四,可视化工具

可视化工具推荐Redis Desktop Manager
官网:https://redisdesktop.com/


五,参考资料

《Redis设计与实现》
《Redis入门指南(第2版)》
《Redis实战》
菜鸟教程 Redis

原创粉丝点击