安装

yum方式安装
https://syslint.com/blog/tutorial/how-to-install-latest-redis-on-centos-7/

make

redis:编译时报错 /bin/sh: cc: command not found
yum -y install gcc gcc-c++ libstdc++-devel

make install

  • 高性能:Redis读的速度是11W次/s,写的速度是8.1W次/s
  • 原子性:保证数据的准确性
  • 持久存储:支持两种方式的持久化,RDB和AOF
  • 注意:Redis是一个 单线程 的服务

应用场景
主要应用在 高并发 和 实时请求 的场景,例如:新浪微博
hash:关注列表、粉丝列表
string:微博数,粉丝数(避免使用select count(*) from …)

基础命令

  • 获得符合规则的键:keys

注意:在生产环境下建议禁用keys命令,因为这个命令会查询过滤redis中的所有数据,可能会造成服务阻塞,影响redis执行效率。

如果有类似的查询需求建议使用scan
scan命令用于迭代当前数据库中的key集合
它支持增量式迭代,每次执行只会返回少量元素,所以它可以用于生产环境,而不会出现像keys 命令那样可能会阻塞服务器的问题。
如果想要继续往下面迭代数据的话,下一次执行scan的时候需要指定之前返回的游标,redis会根据这个游标继续往下面迭代

  1. scan 0 conut 10 //默认返回10条 从头开始迭代 下次如果返回0则代表迭代结束了
  2. scan 3 count 10 // 3是上一次返回的游标

如果想要在迭代key的时候对key进行过滤,可以在scan后面指定match参数,match后面可以指定正则

  1. scan 0 match a[1-5] count 10
  • exists [key]
  • del [key1] [key2]
  • type [key]
  • help
  • quit/exit
  • flush all 清空所有数据库的数据
  • flushdb

数据类型

String

image.png

  1. mset k1 v1 k2 v2
  2. mget k1 k2
  3. incrby num 2 # 指定步长增加
  4. decrby num 2
  5. incrbyfloat num 2.1

Hash

image.png

List

ist是一个有序的字符串列表,列表内部是使用双向链表(linked list)实现的
list类型比较适合作为队列使用,使用lpush+rpop实现
image.png

Set

set集合比较适合用在去重的场景下
image.png

sorted set

sorted set比较适合用在获取TopN的场景
image.png

  1. zadd zset1 5 a // score value
  2. # 根据角标获取集合中的元素(按照正序) zrange
  3. zrange zset1 0 -1
  4. # 倒序
  5. zrevrange zset1 0 -1

1:+inf(正无穷) -inf(负无穷),在给集合中的元素设置分值的时候可以使用这两个特殊数值。 2:set命令:如果key持有其它类型值,set会覆盖旧值,无视类型

高级特性

expire

Redis中可以使用expire命令设置一个键的生存时间,到时间后Redis会自动删除它

应用场景:手机验证码
image.png

pipeline

image.png

info

info 查看redis的设置

持久化

Redis支持两种持久化,可以 单独使用 或者 组合使用

RDB

RDB (Redis默认的持久化机制)和 AOF
RDB(Redis DataBase)和AOF(Append Only File)

RDB持久化是通过快照完成的,当符合一定条件时Redis会自
动将内存中的所有数据执行快照操作并存储到硬盘上,默认
存储在dump.rdb文件中

什么时候执行快照
image.png
900s 内 1个key更改
300秒内 10个key更改
60s内 10000个key更改

RDB的优点:由于存储的有数据快照文件,恢复数据很方便
RDB的缺点:会丢失最后一次快照以后更改的所有数据

AOF

  • AOF持久化是通过日志文件的方式,默认情况下没有开启,可以通过appendonly参数开启
  • AOF日志文件的保存位置和RDB文件相同,都是dir参数设置的,默认的文件名是appendonly.aof
  1. config set appendonly yes // 动态设置 这样会产生appendonly 实时生效 .aof

redis写命令同步时机?
默认每秒执行一次
image.png

安全策略

设置数据库密码

  1. vi redis.conf
  2. requirepass admin
  3. redis-cli
  4. auth admin

bind参数

在实际工作中,我们的服务器至少会有3个ip地址

  • 127.0.0.1 这个是本机回环地址
  • 192.168.182.103 这个是本机的内网地址
  • 还有一个是外网地址

我们一般会使用bind绑定内网ip,这样其实就限制了redis服务器的访问范围,不会暴露在外网,只需要运维同学做好网络的访问限制就可以了,此时我们就可以认为redis是安全的了。

命令重命名

flushall很危险,因此需要把该命令禁用

  1. vi redis.conf
  2. rename-command flushall ""

监控

monitor

monitor可以监控我们对redis的所有操作,如果在线上的服务器上打开了这个功能,这里面就会频繁打印出来我们对redis数据库的所有操作,这样会影响redis的性能,所以说要慎用。
但是在某些特殊的场景下面它是很有用的 之前在工作中我遇到过一个很奇怪的问题,redis中的一个key总是会莫名其妙的消失
我的一个程序会定时向redis中写入一个key,但是我发现这个key刚写进去,然后一会就没了,很奇怪,当时我仔细排查了我的代码,里面既没有设置失效时间,也没有使用删除功能。所以这个key不是我的代码删的,肯定是有其它的代码会删除这个key,但是到底是哪的代码?
这个时候就不好排查了,我们的业务机有几十台,根本无从下手。
这个时候我突然想到了monitor这个命令,虽然开启monitor会影响redis的性能,但是这个时候需要排查问题,使用一会也是可以接受的。所以就打开了monitor,打开之后屏幕上就打印出来很多命令,这样根本就看不清,没办法追踪,数据太多了。所以又想到了这个办法,结合grep命令来操作,这样就可以过滤出来对指定key的所有操作了。

  1. redis-cli monitor | grep key

架构演变

主重复制

image.png
image.png
单点故障:存在主节点挂了,只能从redis中读数据,而不能写数据了

Sentinel

image.png
image.png
在这个架构里面,如果sentinel1认为master节点挂了,那么会给它标记为主观下线状态,此时,并不会进行故障转移,有可能是sentinel1误判了,当sentinel2也认为master节点挂了,那么此时会给master标记为客观下线状态,因 为这个时候不是一个人认为它挂了,当被标记为客观下线状态之后,此时就会进行故障转移了,slave节点就会变成master节点了。针对这种架构,不管你使用多少台机器,redis的最终存储能力还是和单台机器有关的。如果我们想存储海量数据的话,这种架构理论上是实现不了的。

集群

image.png集群中的每个节点都有1个至N个复制品,其中一个是主节点其余的是从节点,如果主节点下线了,集群就会把这个主节点的一个从节点设置为新的主节点,继续工作image.png