Redis运维开发笔记

初识redis

1.1盛赞Redis

Redis是一种基于键值对的NoSql数据库,与很多基于键值对数据库不同的是,redis中的键可以是基于string,hash,list,set,zet,Bitmaps(位图),HyperLogLog,GEO(地理信息定位)等多种数据库和算法组成,因此redis可以满足多种应用场景,而且redis会将所有数据都存放在内存中,所以他的读写性能非常惊人。不仅如此,Redis还可以将内存的数据利用快照和日志的形势保存到硬盘上,这样发生类似断电或机器故障时,内存中的数据不会"丢失"。除了以上功能外,redis还提供了键过期,发布订阅,事务,流水线,Lua脚本等附加功能。

1.2 Redis特性

1.2.1 速度快

正常情况下,reids执行命令的速度非常快,官方给出的数字是读写性能可以达到10万/秒,先不讨论机器性能的差异,只分析一下是什么造就了Redis如此之快的速度,大致分为一下四点:

  1. redis所有数据都是存放在内存中的
  2. redis是用C语言实现的,一般来说C语言实现的程序"距离"操作系统更近,执行速度相对会更快
  3. redis使用了单线程架构,预防多线程可能产生的竞争问题
  4. 作者对于redis源代码的精心打磨,曾有人评价Redis是少有的集性能和优雅于一身的开源代码

1.2.2 基于键值对的数据结构服务器

几乎所有的编程语言都提供了类似字典的功能,例如Java的map,Python的dict,类似这种组织数据的方式叫做基于键值的方式,与很多键值对数据库不同的是,redis中的值不仅可以是字符串,而且还可以是具体的数据结构,这样不仅便于在许多应用场景的开发,同时也能够提高开发效率。redis的全称是REmote Dictionary Serve,他主要提供了5种数据结构 :string,hash,list,set,zet,同时在字符串的基础上演变出了位图(Bitmaps)和HyperLogLog两种神奇的"数据结构"。

1.2.3 丰富的功能

除了5种数据结构,redis还提供许多额外的功能:
5. 提供了键过期功能,可以用来实现缓存
6. 提供了发布订阅功能,可以用来实现消息系统
7. 支持Lua脚本功能,可以利用Lua创造出新的redis命令
8. 提供了简单的事务功能,能在一定程度上保证事务特性
9. 提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到redis,减少了网络的开销

1.2.4 简单稳定

redis源码很少,早期版本的代码只有两万行,3.0版本之后由于添加了集群特性,代码增至5万行左右,相对很多其他nosql数据库来说代码量少很多,普通的开发和运维人员完全可以"吃透"它。其次,使用单线程模型

1.2.5 客户端语言多

reids提供了简单的tcp通信协议,很多编程语言可以很方便的接入到redis,例如Java,PHP,C,C++,Nodejs等

1.2.6 持久化

Redis提供了两种持久化的方式:RDB和AOF,即可以用两种策略将内存中的数据保存到硬盘中,保证了数据的可持久性

1.2.7 主从复制

redis提供了复制功能,实现了多个相同数据的redis副本,复制功能是分布式redis的基础

1.2.8 高可用和分布式

redis从2.8版本正式提供了高可用实现redis sentinel,它能够保障redis节点的故障发现和故障自动转移.redis从3.0版本正式提供了分布式实现redis cluster,它是redis真正的分布式实现,提供了高可用,读写和容量的扩展性

1.3redis使用场景

1.3.1 redis可以做什么

1.缓存

合理使用缓存不仅可以加快数据访问的速度,而且能有效降低后端数据源的压力.redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略

2.排行榜系统

redis提供了列表和有序集合数据结构,合理使用这些数据结构可以很方便地构建各种排行榜系统

3.计数器应用

视频网站有播放数,电商网站有浏览数,为了保证数据的实时性,每次播放都要进行加1的操作.redis天然支持计数功能而且计数的性能也非常好

4.社交网络

赞/踩,粉丝,共同好友/喜好,推送,下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,and传统关系型数据库不太适合保存这种类型的数据,redis提供的数据结构可以相对比较容易地实现这些功能

5.消息队列系统

消息队列系统的解耦,异步,削峰特性.redis提供了发布订阅功能和阻塞队列功能,对于一般的消息队列功能基本可以满足

1.3.2 redis不可以做什么

站在数据规模和数据冷热的角度进行分析
我们知道redis的数据是存放在内存中的,虽然内存已经足够便宜,但是如果数据量非常大,日活亿级的用户行为数据,使用redis来存储的话,基本就是个无底洞,经济成本相当的高
如果将冷数据放在redis中,基本是对内存的浪费,但是对于一些热数据可以放在redis中加速读写,也可减轻后端存储的负载

API的理解和使用

几个全局命令,数据结构和内部编码,单线程命令处理机制
有些数据结构和命令必须在特定场景下使用,一旦使用不当可能对redis本身或应用本身造成致命桑害

2.1.1 全局命令

redis有5种数据结构,它们是键值对中的值,対于键来说有一些通用的命令
1.查看所有键
keys *
2.键总数
dbsize
dbsize命令在计算键总数时不会遍历所有键,而是直接获取redis内置的键总数变量,所以dbsize命令的时间复杂度是O(1),而keys命令会遍历所有键,so时间复杂度是O(n),当redis保存了大量键时,线上环境禁止使用
3.检查键是否存在
exist key
4.删除键
del key [key …]
5.键过期
expire key seconds
redis支持对键添加过期时间,当超过过期时间后,会自动删除键
ttl命令会返回键的剩余过期时间,它有3中返回值:

  1. 返回键剩余的过期时间
  2. -1:键没设置过期时间
  3. -2:键不存在

6.键的数据结构类型
type key

2.1.2 数据结构和内部编码

type命令返回的对外的5种数据结构,但这些只是redis对外的数据结构,如图所示
在这里插入图片描述

实际每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样redis会在合适的场景选择合适的内部编码,如图所示
在这里插入图片描述可以通过object encoding 命令查询内部编码
redis这样设计有两个好处:1.可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发出更优秀的内部编码,无需改动外部数据结构和命令,例如redis3.2提供了quicklist,结合了ziplist和linkedlist两者的优势,为列表类型提供了一种更为优秀的内部编码实现
2.多种内部编码实现可以在不同场景下发挥各自的优势

2.1.3 单线程架构

redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务.
为什么单线程还能这么快?
第一,纯内存访问
第二,非阻塞I/O,redis使用epoll作为I/O多路复用技术的实现,再加上redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为事件,不在网络I/O上浪费过多的时间
第三,单线程避免了线程切换和竞态产生的消耗
但是单线程会有一个问题:如果某个命令执行过长,会造成其他命令的阻塞,对于redis这种高性能的服务来说是致命的,所以redis是面向快速执行场景的数据库.
(未完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值