redis是什么

redis是什么

redis是一款开源的内存数据结构存储,用作数据库,缓存,消息中间件,支持多种数据结构,如:strings,hashes,lists,sets,带有范围查询的sorted sets ,bitmaps,hyperloglogs,带有半径查询的geospatial Indexes,和stream;

Redis内置了的主从复制,事务,以及不同级别的持久化功能,并通过Sentinel和自动分区的Cluster提供了高可用性;

在redis中可以对这些类型进行原子操作(线程安全);

为了获得优秀的性能,redis把数据存储在内存中,根据实际情况你可以每隔一段时间将数据转存至磁盘或者追加每一个操作指令到log中,来实现持久化;如果只需要用于内存缓存,你可以禁用持久化;

redis还支持异步主从复制和非常快的非阻塞的首次同步,自动重连和部分数据重新同步在遇到网络分裂(异常)时;

Redis使用c编写,可以运行于绝大多数POSIX系统上,例如 Linux,OS X,BSD,而且不需要任何的外部依赖,Linux和OS X是Redis开发和测试最多的两个操作系统,建议使用LInux系统部署,Windows版本没有官方支持。

官网:https://redis.io

为什么需要Redis

可以看出redis和mysql有非常大的区别,主要体现在数据结构存储方式上。

mysql是关系型数据库,存储数据前必须明确定义表结构和数据类型,数据之间可以存在关联关系,

而redis中并不需要提前定义数据模型,随时可以添加新的结构到数据库中,redis也不能维护数据间的关系;

非关系型数据库优势:

  • 性能好,存取速度优于关系型数据库
  • 存储的数据,通常不具备固定结构,数据结构灵活,key-value形式来存储。
  • 可以用来做缓存,减少对数据库的访问

NoSQL

这里不得不提到的一个名称就是NoSQL,NoSQL有两种含义

No Relations和Not Only SQL,通常我们谈及NoSQL都是泛指非关系型数据库,即数据之间没有关系;

NoSQL伴随着web2.0开始崛起,web2.0时代(要处理大规模的数据,且经常存在非结构化的数据)传统数据库表现的力不从心,而且出现一系列难以攻克的问题;

关系型与非关系型的对比:

redis是什么_第1张图片
redis是单线程:客户端所有对数据的操作都会交给数据操作线程来处理,保证了线程安全,避免了加锁和解锁带来的效率影响。
效率的高低,取决于是否充分利用了CPU;通常情况下,之所以效率低是因为没有处理好IO操作。

对于连接并不是单线程,
redis是什么_第2张图片
通过对比可以发现NoSQL和关系型数据库各自有各自的优缺点,那么在实际运用中该如何选择呢?

一定要强调的是,两者不是非此即彼的关系,而是优势互补

通常我们把项目的关键数据(必须需要保证ACID)放在关系型数据库中

而对于一些临时的,非关键性的,访问频率非常高的数据放在NoSQL中;

另外Redis也经常用于消息中间件;

NoSQL的分类:
redis是什么_第3张图片

Redis典型的使用场景:

  • 缓存(数据查询、短连接、新闻内容、商品内容等等)。
  • 分布式集群架构中的session分离。
  • 聊天室的在线好友列表。
  • 任务队列。(秒杀、抢购、12306等等)
  • 应用排行榜。
  • 网站访问统计。
  • 数据过期处理(可以精确到毫秒)

安装

windows下使用VMare安装CentOS7:链接

CentOS 7下安装Redis:链接

上述两链接转自:bing_bg

bin目录说明:
redis是什么_第4张图片

启动

1. 前端启动模式

直接运行bin/redis-server将以前端模式启动,
前端模式启动的缺点是:
在redis的旧版本中ssh命令 窗口关闭则redis-server程序结束
最新版的redis并不会因为ssh连接的关闭而关闭,但是还是会占用ssh连接,故此不推荐使用此方法。如下图:
redis是什么_第5张图片

2. 守护进程模式

以守护进程模式启动的话需要 redis.conf 配置文件。在配置文件中设置redis 的启动模式。从 redis源码目录 redis-5.0.7 中复制 redis.conf 文件到 /usr/local/redis/bin 目录下,然后修改其中的配置信息:

daemonize yes

将 no 改为 yes 启动redis时,指定使用的配置文件:

> ./redis-server redis.conf 

这样redis就以守护进程模式启动了。

上述两种模式都需要:[root@localhost ~]# cd /usr/local/redis/bin

下面是守护进程模式启动过程

#进入bin目录
cd /usr/local/redis/bin
#启动redis
[root@localhost bin]# ./redis-server redis.conf 
#利用客户端连接测试
[root@localhost bin]# ./redis-cli -h 192.168.10.131 -p 65533
192.168.10.131:65533> 
#看见如下内容表示已经服务端已经正常运行

在这里插入图片描述

停止

1.如果是前端方式启动的服务只需要ctrl+c即可关闭服务器端

2.后台进程模式,需要通过redis-cli客户端来关闭

#关闭运行在localhost上的redis服务
./redis-cli shutdown
#关闭运行在指定地址上的redis服务
./redis-cli -h 192.168.10.131 -p 65533 shutdown

3.强制停止,通过kill命令直接强行结束redis服务端进程,该方式存在不稳定性,生产环境勿用

#查询进程id
ps aux|grep redis
#根据进程id结束服务
kill 进程id

redis-cli连接服务器
语法: redis-cli -h 主机地址 -p 端口

其中主机地址和端口号均可省略 默认主机为localhost,默认端口为:6379

yum软件包管理器自带的 yum install xxx
安装下载工具wget
rm 删除
ls或ll查看
make==javac
cp
kill 进程编号
./redis-cli -h -p shutdowm

数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

1.String

string 是 redis 最基本的类型,你可以理解成与Map中的一模一样的数据类型,一个 key 对应一个value。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。存储的任何内容都不会被做任何的转译

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

  • 赋值
    SET key value
    eg:
    192.168.10.131:65533> set age 18
  • 取值
    GET key
    eg:
    192.168.10.131:65533> get age
    当键不存在时,返回空结果。
  • 取值时同时对key进行赋值操作
    GETSET key value
  • 删除
    DEL key
    eg:
    192.168.10.131:65533> del age
  • 数值加一
    INCR key
    当存储的字符串是正是时,redis提供了一个实用的命令INCR,其作用时让当前键值题赠,并返回递增后的值
    eg:
    192.168.10.131:65533> incr age
  • 增加指定的整数
    INCRBY key increment
    eg:
    192.168.10.131:65533> incrby age 2
  • 数值减一
    DECR key
    eg:
    192.168.10.131:65533> decr age

2.Hash

hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其他类型,相当于一个key对应一个map,如下图所示:
redis是什么_第6张图片
hash类似于java的对象

  • 创建hash并添加值
    HSET [key] [field] [value]
    eg:
    192.168.10.131:65533> hset user age 18
  • 从hash中取值
    HGET [key] [field]
    eg:
    192.168.10.131:65533> hget user age
  • 从hash中删除
    HDEL [key] [field]
    eg:
    192.168.10.131:65533> hdel user age
  • 判断field是否存在
    HEXISTS [key] [field]
    如果存在返回“1”,如果不存在,返回“0”
    eg:
    192.168.10.131:65533> hexists user age
  • 取hash中的内容
    • 从hash中取field的列表:
      hkeys [key]
    • 从hash中取value的列表
      hvals [key]
    • 从hash中取field和value的列表
      hgetall [key]

3.List

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

你可以添加一个元素到列表的头部(左边)或者尾部(右边),一个列表最多可以包含2^32 - 1个元素(4294967295,每个列表超过40亿个元素)

可以通过list来实现栈(先进后出,例如方法嵌套调用、递归)和队列(先进先出)

对于list类型,如果push和pop在同一向进行,就可以实现栈
如果push和pop是在相反方向,则可以实现队列redis作为消息队列,也是通过list来实现的

  • 添加元素
    • 左边添加
      lpush [key] [element…]
    • 右边添加
      rpush [key] [element…]
  • 取元素
    • 左边取元素
      lpop [key]
    • 右边取元素
      rpop [key]
  • 查看列表中的元素
    lrange [key] [start] [end]
    需要设置列表中其实的元素索引和结束元素的索引,如果结束元素的索引是-1,则代表取到列表结尾
  • 查看列表的长度
    llen [key]
    eg:下图是左边添加和左边去元素示例
    redis是什么_第7张图片

4.set

redis的set是String类型的无序集合。集合成员是唯一、无序的。
redis中集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)。
集合中最大的成员数是2^32 - 1(4294967295)

  • 添加元素
    sadd [key] [value]
    eg:
    192.168.10.131:65533> sadd num 1 2 4 5
  • 删除元素
    • 删除指定的元素:
      srem [key] [member]
      eg:
      192.168.10.131:65533> srem num 1
    • 从集合中移除随机元素:
      spop [key]
      eg:
      192.168.10.131:65533> spop num
  • 取集合元素个数
    scard [key]
    eg:
    192.168.10.131:65533> scard num
  • 取集合元素成员
    smembers [key]
    eg:192.168.10.131:65533> smembers num
    具体如下:
    redis是什么_第8张图片

5.SortedSet

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。

redis正是通过分数来为集合中的成员进行从小到 大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。

由于SortedSet所有的命令都是以 Z 开头所以SortedSet也叫做 zset 。

  • 添加元素
    zadd [key] [score] [member]
  • 删除元素
    zrem [key] [member]
  • 元素数量
    zcard [key]
  • 获取集合成员
    zrange [key] [start] [stop] [withscroes]
    更多操作

6.服务器命令

  • 切换数据库:select [index]
    192.168.10.131:65533> select 1
    OK

  • 查看当前数据库中的key:keys [partten]

192.168.10.131:65533> keys *

  1. “num”
  2. “user”
  • 删除key:del [key]
    192.168.10.131:65533> del num
    (integer) 1
    -查看key的数据类型
    type [key]
    192.168.10.131:65533> type user
    hash
  • 查看key是否存在:
  • exists a
    (integet) 0
  • 设置key的生存时间
    expire [key]
    192.168.10.131:65533> set a 100
    OK
    192.168.10.131:65533> expire a 10000
    (integer) 1
  • 查看key多长时间过期
    ttl [key]
    192.168.10.131:65533> ttl a
    (integer) 9998
  • 清空当前数据库的数据:flushdb
  • 删除所有数据库中的数据:flushall

持久化

redis提供了两种不同的持久化方式

  • RDB持久化会按照指定的时间间隔为数据创建快照并写入磁盘

  • AOF持久化会记录服务器接收到的每一个写数据指令到文件中,这些指令将在服务器重启时进行重放,以此来重建原始数据,AOF产生的命令格式与redis本身的命令格式完全相同,并采用仅追加的方式,日志文件太大时,redis会在后台重写日志

  • 如果希望数据仅在redis运行期间有效,则可以完全禁用持久化来使效率最大化

RDB快照

优点

  • RDB是表示某个时间点的非常紧凑的单个文件,RDB文件,非常适合用于数据备份,例如(每天保存一次RDB),这可以在灾难发生后轻松的恢复数据;
  • RDB最带限度的保证了redis的性能。因为父进程唯一要做的就是fork一个子进程去完成剩下的所有工作,进程不会执行任何的I/O操作
  • 与AOF相比,在数据量较大的情况下,RDB能够更快的重启。

缺点

  • 丢失数据
    如果希望将数据丢失的可能性降到最低(异常停止、断电),则RDB不够好,虽然可以配置多个不同的保存点,(如:5分钟后,1000次写操作后),通常是五分钟或者更长时间后,但是redis在这个保存点之前因为任何原因导致异常关闭,则将丢失最新的数据
  • RDB需要经常的fork子进程才能将数据持久化到磁盘上,如果数据量很大,该过程可能很耗时。若数据量大且CPU性能不佳,则可能导致redis停止响应客户端的请求几毫秒甚至几秒,虽然AOF重写日志也需要fork子进程,但是你可以调整重写日志的频率。
    配置
    在bin目录下输入: vim redis.conf

然后输入:/save 900快速定位
redis是什么_第9张图片
上图中的:
save 900 1
save 300 10
save 60 10000

是一个个的保存点,第一个数字为时间间隔,第二个为操作次数。当二者全部满足则更新快照。频率太高影响性能,太低丢失数据,需要按照实际情况合理设置

保存点可以配置多个,如默认配置,更新快照的频率随着数据操作频率的增长而增长,可以尽可能的减少数据丢失,同时在数据操作频率低的时候,减少快照的更新操作。

AOF日志

优点

  • 使用AOF时redis能提供更好的持久化,尽可能的减少数据丢失。可使用不同的fsync(文件同步)策略包括:完全没有fsync,每秒fsync,每个查询fsync。使用默认策略(每秒)时,每秒的写入性能仍然很好;

  • AOF日志是仅追加的日志,即使断电也不会损坏文件,即使由于某种原因意外停止,导致写入残缺指令,redis-check-aof工具也能修复日志文件

  • AOF文件过大时,redis会在后台重写AOF。重写是安全的,redis会继续追加指令到旧的文件,同时根据当前数据生成重建所需的精简指令,当第二个文件准备好后redis会切换到新的日志文件并开始追加新文件

  • AOF文件的指令格式非常简单,可以轻松的导出AOF,就像导出SQL一样简单,可以轻松的通过AOF文件恢复数据。例如错误的执行了删除所有数据的指令,只要重写操作没有触发,只需要删除最后的语句重启redis
    缺点

  • 对于同样的数据,AOF文件通常大于等效的RDB文件

  • 根据具体的fsync策略,AOF可能比RDB慢。(通常,在将fsync设置为每秒的情况下,性能仍然很高,在禁用fsync的情况下,即使在高负载下,它也与RDB一样快)虽然如此,在巨大的写负载的情况下,RDB仍然能够尽可能的保证最大延迟
    配置
    启用AOF:
    默认情况下AOF是禁用的,配置文件第1038行,将no修改为yes
    redis是什么_第10张图片
    文件同步策略
    redis是什么_第11张图片
    分别是
    每执行一个写操作立马写入文件并完成磁盘同步
    每隔一秒将写操作写入文件并完成磁盘同步
    将写操作指令写入后,等待操作系统自动完成磁盘同步

AOF文件重写配置,配置文件1110行:

auto-aof-rewrite-percentage 100 #达到原始文件多少比例
auto-aof-rewrite-min-size 64mb #最小重写大小

AOF文件不完整(写入过程中意外关闭)时是否允许启动,配置文件1135行

aof-load-truncated yes

通常情况下AOF完整度是比RDB高的,所以重启后读取文件时,AOF优先于RDB;

另外当你对配置文件非常熟悉时完全可以创建一个空文件,添加需要修改的配置即可;

你可能感兴趣的