Redis

Redis

:Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。

键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。

Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能.

二:存储的数据类型

 补充:
 

 三:使用场景

  • 计数器:可以对STRING类型的数据进行自增,自减操作,从而实现计数器的功能
  • 缓存:将热点数组放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率
  • 消息队列:LIST是一个链表,可以通过lpush,lpop写入和读取消息 
  • 会话缓存:可以使用Redis来缓存多台服务器的会话信息,当应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器,
  • 分布式锁实现:在分布式场景下,无法使用单机环境的锁来对多个节点上的进程进行同步,可以使用Redis自带的SETNX命令来实现分布式锁,也可以使用官方的RedLock实现。
  • Set可以实现交集,并集等操作,从而实现共同好友,Zset可以实现有序性操作,例如实现排行榜功能

Hash    适用于存储对象

List   列表 ,能数据按照插入的顺序排序(后入先出)

Set     无序集合,通过哈希表实现,不允许重复

Zset  有序集合,不允许重复

四:具体操作

String类型的数据
set name  "redis" //设置
get name     //获取

Hash    //适用于存储对象

hmset  lilei  name "lilei"   age   23  title  "senior" //存储
hget   lilei   age   //获取
hget   lilei   title //获取
hset   lilei   title  "priciple" //修改

List   列表 ,能数据按照插入的顺序排序(后入先出)
lpush   mylist  aaa 
lpush   mylist  bbb
lpush   mylist  ccc
lrange  mylist  0   10   //从0开始,取到10

Set     无序集合,通过哈希表实现,不允许重复
sadd    myset   111    
sadd    myset   222
sadd    myset   333

smemerbers myset   //遍历所有

Zset  有序集合,不允许重复
zadd  myzset    3   abc
zadd  myzset    1   abd
zadd  myzset    2   abb
zrangebyscore  myzset    0   10//按照第三列的大小输出

五,键的过期时间

Redis可以为每个键设置过期时间,当键过期时,会自动删除该键

六,淘汰策略

七:持久化方式

RDB:

将某个时间点的所有数据都存放到硬盘上。

可以将快照复制到其它服务器从而创建具有相同数据的服务器副本。

如果系统发生故障,将会丢失最后一次创建快照之后的数据。

如果数据量很大,保存快照的时间会很长

AOF:

将写命令添加到 AOF 文件(Append Only File)的末尾。

使用 AOF 持久化需要设置同步选项,从而确保写命令同步到磁盘文件上的时机。这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。有以下同步选项

 

  • always 选项会严重减低服务器的性能;
  • everysec 选项比较合适,可以保证系统崩溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器性能几乎没有任何影响;
  • no 选项并不能给服务器性能带来多大的提升,而且也会增加系统崩溃时数据丢失的数量。

随着服务器写请求的增多,AOF 文件会越来越大。Redis 提供了一种将 AOF 重写的特性,能够去除 AOF 文件中的冗余写命令。

 

 

八:事务

一个事务包含了多个命令,服务器在执行事务期间,不会改去执行其它客户端的命令请求。

事务中的多个命令被一次性发送给服务器,而不是一条一条发送,这种方式被称为流水线,它可以减少客户端与服务器之间的网络通信次数从而提升性能。

Redis 最简单的事务实现方式是使用 MULTI 和 EXEC 命令将事务操作包围起来

九.事件

Redis 服务器是一个事件驱动程序

文件事件

服务器通过套接字与客户端或者其它服务器进行通信,文件事件就是对套接字操作的抽象

Redis 基于 Reactor 模式开发了自己的网络事件处理器使用 I/O 多路复用程序来同时监听多个套接字,并将到达的事件传送给文件事件分派器,分派器会根据套接字产生的事件类型调用相应的事件处理器这也是为什么redis支持高并发的原因

十:主从同步

通过使用 slaveof host port 命令来让一个服务器成为另一个服务器的从服务器。

一个从服务器只能有一个主服务器,并且不支持主主复制

连接过程

  1. 主服务器创建快照文件,发送给从服务器并在发送期间使用缓冲区记录执行的写命令。快照文件发送完毕之后,开始向从服务器发送存储在缓冲区中的写命令;

  2. 从服务器丢弃所有旧数据,载入主服务器发来的快照文件,之后从服务器开始接受主服务器发来的写命令

  3. 主服务器每执行一次写命令,就向从服务器发送相同的写命令

 主从链

随着负载不断上升,主服务器可能无法很快地更新所有从服务器,或者重新连接和重新同步从服务器将导致系统超载。为了解决这个问题,可以创建一个中间层来分担主服务器的复制工作。中间层的服务器是最上层服务器的从服务器,又是最下层服务器的主服务器

哨兵 

Sentinel(哨兵)可以监听集群中的服务器,并在主服务器进入下线状态时,自动从从服务器中选举出新的主服务器

分片

分片是将数据划分为多个部分的方法,可以将数据存储到多台机器里面,这种方法在解决某些问题时可以获得线性级别的性能提升。

假设有 4 个 Redis 实例 R0,R1,R2,R3,还有很多表示用户的键 user:1,user:2,... ,有不同的方式来选择一个指定的键存储在哪个实例中。

  • 最简单的方式是范围分片,例如用户 id 从 0~1000 的存储到实例 R0 中,用户 id 从 1001~2000 的存储到实例 R1 中,等等。但是这样需要维护一张映射范围表,维护操作代价很高。
  • 还有一种方式是哈希分片,使用 CRC32 哈希函数将键转换为一个数字,再对实例数量求模就能知道应该存储的实例。

根据执行分片的位置,可以分为三种分片方式:

  • 客户端分片:客户端使用一致性哈希等算法决定键应当分布到哪个节点。
  • 代理分片:将客户端请求发送到代理上,由代理转发请求到正确的节点上。
  • 服务器分片:Redis Cluster。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值