一,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 GET
1) 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服务器是典型的一对多服务器:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接受并处理客户端发送的命令请求,并向客户端返回命令回复。
通过使用由I/O多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。
对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redisClient结构(客户端状态),这个结构保存了客户端当前的状态信息,以及执行相关功能时需要用到的数据结构。
Redis服务器状态结构的clients属性是一个链表,这个链表保存了所有与服务器连接的客户端的状态结构,对客户端执行批量操作,或者查找某个指定的客户端,都可以通过遍历clients链表来完成。
下图展示了一个与三个客户端进行连接的服务器。
下图则展示了这个服务器的clients链表的样子。
服务器状态结构使用clients链表连接器多个客户端状态,新添加的客户端状态会被放到链表的末尾。
四,Redis作为消息队列
Redis自带的PUB/SUB机制,即发布-订阅模式。这种模式生产者(producer)和消费者(consumer)是1-M的关系,即一条消息会被多个消费者消费,当只有一个消费者时即可以看做一个1-1的消息队列。但这种方式无法保证数据的可靠性,如果消息丢失、Redis宕机部分数据没有持久化甚至突然的网络抖动都可能带来数据的丢失。其次,扩展不灵活,没法通过多加consumer来加快消费的进度,如果前端写入数据太多,同步会比较慢,数据不同步的状态越久,风险越大,可以通过channel拆分的方式来解决,虽然不灵活,但可以规避。这种方案更适合于对数据可靠性要求不高,比如一些统计日志打点。
Redis的PUSH/POP机制,利用的Redis的列表(lists)数据结构。比较好的使用模式是,生产者lpush消息,消费者brpop消息,并设定超时时间,可以减少redis的压力。这种方案相对于第一种方案是数据可靠性提高了,只有在Redis宕机且数据没有持久化的情况下丢失数据,可以根据业务通过AOF和缩短持久化间隔来保证很高的可靠性,而且也可以通过多个client来提高消费速度。但相对于专业的消息队列来说,该方案消息的状态过于简单(没有状态),且没有ack机制,消息取出后消费失败依赖于client记录日志或者重新push到队列里面。
五,可视化工具
可视化工具推荐Redis Desktop Manager
官网:https://redisdesktop.com/
六,参考资料
《Redis设计与实现》
《Redis入门指南(第2版)》
《Redis实战》
菜鸟教程 Redis