为什么要使用redis

  1. 解决应用服务器的cpu和内存压力
  2. 减少io的读操作,减轻io的压力
  3. 关系型数据库的扩展性不强,难以改变表结构

    简介

    Redis是一个 key-value 存储系统,是跨平台的非关系型数据库
    Redis是 C 语言编写的,基于内存、分布式、可选持久性的键值对(Key-Vlaue)存储数据库
    Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型

    特点

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list、set、zset、hash等数据结构的存储
  • Redis支持数据的备份,即master-slave模式的数据备份

    优势

  • 高性能 - Redis读取速度:110000次/s ,Redis写入速度:81000次/s

  • 丰富的数据类型 - Redis支持 String、Lists、Hashes、Sets及Ordered Sets数据类型操作
  • 原子 - Redis的所有操作都是原子性的,即要么成功执行要么失败完全不执行
  • 丰富的特性 - Redis还支持 publish/subscribe,通知,key过期等等特性

    Redis与其他key-value存储有什么不同

  • Redis有着更为复杂的数据结构并且提供对他们的原子性操作。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象

  • Redis运行在内存中但是可以持久化到磁盘;相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情

安装

https://www.runoob.com/redis/redis-install.html

启动

  1. redis-server.exe

连接

  1. redis-cli.exe -h 127.0.0.1 -p 6379

设置键值对

  1. set myKey abc

取出键值对

  1. get myKey abc

Redis 持久化

redis持久化方式有两种:RDB和AOF

RDB(持久化之全量写入)

RDB是通过保存整个redis数据库来实现持久化
RDB持久化也分两种:SAVE和BGSAVE
SAVE是阻塞式RDB持久化
BGSAVE是非阻塞式RDB持久化

AOF(持久化之增量写入)

AOF是通过保存对redis服务端的写命令来记录数据库状态的
配置AOF

  1. appendonly yes #开启AOF持久化,默认关闭
  2. appendfilename "appendonly.aof" #AOF文件名称(默认)
  3. appendfsync everysec #AOF持久化策略
  4. auto-aof-rewrite-percentage 100 #触发AOF文件重写的条件
  5. auto-aof-rewrite-min-size 64mb #触发AOF文件重写的条件

appendfsync有三个选项:always、everysec和no
always:服务器会在每执行一个事件就把AOF缓冲区的内容强制性的写入硬盘上的AOF文件里,可以看成你每执行一个redis写入命令就往AOF文件里记录这条命令,这保证了数据持久化的完整性,但效率是最慢的,却也是最安全的;
everysec:服务端每执行一次写操作(如set、sadd、rpush)也会把该条命令追加到一个单独的AOF缓冲区的末尾,并将AOF缓冲区写入AOF文件,然后每隔一秒才会进行一次文件同步把内存缓冲区里的AOF缓存数据真正写入AOF文件里,这个模式兼顾了效率的同时也保证了数据的完整性,即使在服务器宕机也只会丢失一秒内对redis数据库做的修改;
no:意味redis数据库里的数据就算丢失你也可以接受,它也会把每条写命令追加到AOF缓冲区的末尾,然后写入文件,但什么时候进行文件同步真正把数据写入AOF文件里则由系统自身决定,即当内存缓冲区的空间被填满或者是超过了设定的时限后系统自动同步。这种模式下效率是最快的,但对数据来说也是最不安全的,如果redis里的数据都是从后台数据库如mysql中取出来的,属于随时可以找回或者不重要的数据,那么可以考虑设置成这种模式。

redis 持久化rdb切换aof

redis 持久化配置 :无缝从rdb切换到aof 安全保留数据
redi默认用rdb方式将数据持久化存储到dump.rdb文件下,aof方式默认将数据写操作记录到appendonly.aof文件下,如果同时开启2种方式,重启会默认加载aof方式(redis默认只开启rdb).
综上,如果你是默认rdb方式,然后贸然切换到aof,重启后会读取aof文件,但是这个时候aof文件是空的,则会导致redis被清空

解决方法
原理:在redis控制台动态配置打开aof方式,在shutdown安全退出后,自动记录了当前所有记录到aof文件,再修改redis文件配置,打开aof方式,启动redis时会自动加载之前安全退出保存的aof数据
[

](https://blog.csdn.net/weixin_42715413/article/details/87704981)

Redis 数据类型

Redis支持五种数据类型:string、hash、list、set、zset(sorted set)

String

string是redis最基本的类型
string类型是二进制安全的(意思是redis的string可以包含任何数据,比如图片或者序列化的对象)
string类型的值最大能存储512MB
实例:

  1. redis 127.0.0.1:6379> SET runoob "菜鸟教程"
  2. OK
  3. redis 127.0.0.1:6379> GET runoob
  4. "菜鸟教程"

Hash(哈希)

redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
每个 hash 可以存储 232 -1键值对(40多亿)
实例:

  1. redis 127.0.0.1:6379> DEL runoob
  2. redis 127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World"
  3. "OK"
  4. redis 127.0.0.1:6379> HGET runoob field1
  5. "Hello"
  6. redis 127.0.0.1:6379> HGET runoob field2
  7. "World"

List(列表)

redis列表是简单的字符串列表,按照插入顺序排序。可以添加元素到列表的头部或者尾部
列表最多可以存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
实例:

  1. redis 127.0.0.1:6379> DEL runoob
  2. redis 127.0.0.1:6379> lpush runoob redis
  3. (integer) 1
  4. redis 127.0.0.1:6379> lpush runoob mongodb
  5. (integer) 2
  6. redis 127.0.0.1:6379> lpush runoob rabbitmq
  7. (integer) 3
  8. redis 127.0.0.1:6379> lrange runoob 0 10
  9. 1) "rabbitmq"
  10. 2) "mongodb"
  11. 3) "redis"
  12. redis 127.0.0.1:6379>

Set(集合)

redis的 Set 是string类型的无序集合
集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)
集合中最大成员数为232 - 1(4294967295, 每个集合可存储40多亿个成员)。
根据集合内元素的唯一性,第二次插入的元素将会被忽略
添加一个元素到key对应的set集合中,成功返回1,如果元素已经存在,返回0
实例:

  1. redis 127.0.0.1:6379> DEL runoob
  2. redis 127.0.0.1:6379> sadd runoob redis
  3. (integer) 1
  4. redis 127.0.0.1:6379> sadd runoob mongodb
  5. (integer) 1
  6. redis 127.0.0.1:6379> sadd runoob rabbitmq
  7. (integer) 1
  8. redis 127.0.0.1:6379> sadd runoob rabbitmq
  9. (integer) 0
  10. redis 127.0.0.1:6379> smembers runoob
  11. 1) "redis"
  12. 2) "rabbitmq"
  13. 3) "mongodb"

zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复
zadd 命令添加元素到集合,元素在集合中存在则更新对应score
实例:

  1. redis 127.0.0.1:6379> DEL runoob
  2. redis 127.0.0.1:6379> zadd runoob 0 redis
  3. (integer) 1
  4. redis 127.0.0.1:6379> zadd runoob 0 mongodb
  5. (integer) 1
  6. redis 127.0.0.1:6379> zadd runoob 0 rabbitmq
  7. (integer) 1
  8. redis 127.0.0.1:6379> zadd runoob 0 rabbitmq
  9. (integer) 0
  10. redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000
  11. 1) "mongodb"
  12. 2) "rabbitmq"
  13. 3) "redis"