Redis部署与使用
# Redis介绍
# Redis简介
redis是一个开源的、支持网络交互、可基于内存也可持久化的Key-Value内存数据库,它的特点有:
- 速度快,性能极高
- redis的数据存储在内存中,它使用C语言实现,且是单线程架构,处理结构更简单,也减少了CPU之间切换的开销。
- redis能读的速度是110000次/s,写的速度是81000次/s。
- 基于键值对的数据结构
- redis数据库支持多种数据类型,字符串、列表、集合、有序集合、哈希等。
- 提供丰富的功能
- 提供键过期功能,可以实现缓存。
- 提供发布订阅功能,可以实现消息系统。
- 提供了pipline功能,客户端可以将一批命令一次性传到redis,减少网络开销。
- 简单稳定
- 使用单线程模型,使redis服务端处理模型更简单。
- 不依赖操作系统中的类库,且体积非常小。
- 提供多种语言的API
- java、python、php、c/c++、nodejs等。
- 支持数据持久化
- RDB和AOF方式。
- 支持高可用和分布式
- 自带主从复制、哨兵、集群等。
# Redis应用场景
- 缓存 - 利用键过期时间
- 缓存session会话。
- 缓存用户信息,找不到再去mysql查,查到然后写到redis。
- 缓存优惠卷等会过期的东西。
- 排序功能 - 利用列表&有序集合
- 比如热度排行榜、发布时间排序等。
- 点击量计数 - 利用计数器
- 统计阅读数、浏览数、播放数、评论数、点赞数等。
- 社交网络 - 利用集合
- 取交集、并集、差集等方式筛选标签,获取特定数据、用户等。
- 消息队列系统 - 发布订阅
- 作为中间件,例如配合ELK实现日志收集等。
# Redis部署
# 安装Redis
# 创建相关目录
mkdir /data/apps/redis/{conf,logs,tmp,data}
# 在官网下载Redis源代码包:https://redis.io/download/
tar -xvf redis-7.0.10.tar.gz
# 编译安装
cd ./redis-7.0.10/
make && make install
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- 应用程序
redis-server
- redis的服务端redis-cli
- redis的客户端redis-benchmark
- 用于进行redis性能测试的工具redis-check-dump
- 用于修复出问题的dump.rdb文件redis-check-aof
- 用于修复出问题的AOF文件redis-sentinel
- 用于集群管理
- 相关补充
make install
会将编译后的二进制可执行文件,复制到所指定的位置,默认为/usr/local/bin
。- 实际上不执行
make install
也可以,make成功后,会在程序目录下的src文件夹下,生成二进制可执行文件。可以直接执行,或者手动复制到/bin
文件夹里去。
# 启动Redis
- 服务端
redis-server
- 启动Redis服务器,默认情况下redis-server会以非daemon的方式启动,默认服务端口为6379。redis-server [配置文件路径].conf
- 指定配置文件启动Redis服务器。
- 客户端
redis-cli -h [主机IP]
- 启动Redis交互式客户端。redis-cli -h [主机IP] [redis命令]
- 非交互式执行Redis命令。
# 关闭Redis
- Redis客户端中执行
shutdown
命令。 - 或者直接非交互式执行
redis-cli -h [主机IP] shutdown
命令。
# Redis配置文件
# 以守护进程模式启动 (默认no)
daemonize yes
# 绑定的网卡地址 (一般为内网地址)
bind 10.0.0.7
# 监听端口
port 6379
# pid文件路径
pidfile [路径]
#log文件路径
logfile [路径]
# 设置数据库的数量 (默认数据库为0)
databases 16
# 本地持久化数据库的目录
dir [路径]
# 本地持久化数据库的文件名(默认是dump.rdb)
dbfilename redis_6379.rdb
# 指定客户端登录服务器时需要验证密码,可不填
requirepass [密码]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Redis数据类型
# str - 字符串类型
- 用于存储字符串数据,也可将图片文件内容(二进制) 作为字符串来存储。
- 同时str类型也可以作为数值进行操作,遇到数值操作时,redis会将全为数字的字符串转换成数值再进行操作。
# list - 列表类型
- Redis中的list在底层实现上并不是数组,而是链表。
- 所以在头部和尾部插入一个新元素,无论数据量多大,其消耗的时间基本都是常数。也就是说插入一个新元素到有十个元素的列表,和插入一个新元素到有千万个元素的列表的速度基本是相同的。
- 但同时链表型list的元素定位会比较慢,而数组型list的元素定位就会快得多,所以redis的列表更适合作为队列使用。
- Redis中我们可以利用list来实现消息队列、分页、数据存储等功能。
# hash - 哈希类型
- hash类型是一个键值对(key-value)的集合,也就是一对多,适合用于存储对象,类似于Python的字典类型。
# set - 集合
- Redis的集合是一种无序的集合,集合中的元素没有先后顺序,且无法加入已有的值,也就是不允许重复。
- Redis中我们可以利用集合来实现去重、取交集、取并集、取差集等功能。
# zset - 有序集合
- 就是有顺序排序的集合,也就是添加了索引。
# Key命名规范
Key不要超过1024字节,不仅消耗内存,还会降低查找效率。
Key也不要太短,太短会造成可读性降低。
统一Key的格式,分隔符、字母是否大写之类,比如:
XXX:XXX:XXX
、xxx-xxx-xxx
。规划好命名空间,比如:
项目名:表名:关键字(主键值):字段名
例子:
# ROBOT项目下有USER表,而USER表内有ID和NAME和PASSWORD字段,就可以按以下方式进行规划: # ROBOT:USER:[ID]:NAME ROBOT:USER:2900192841:NAME # ROBOT:USER:[ID]:AGE ROBOT:USER:2900192841:AGE
1
2
3
4
5
# Redis常用命令
redis在设置值到一个不存在的key时,会自动创建操作对应的数据类型到key。
# 通用命令
- keys [key]
- 查询数据库中的键名,可用通配符匹配键名
*?[]
。 - 注意:
keys *
操作非常危险,生产环境中一般禁止使用,会返回内存中所有键名,如果键名非常多内存占用非常大,执行该命令可能会造成Redis卡死。
- 查询数据库中的键名,可用通配符匹配键名
- exists [key]
- 判断key是否存在,返回 1为存在,0为不存在。
- del [key]
- 删除指定key与value。
- type [key]
- 返回key的数据类型。
- expire [key] [seconds]
- 设置key的过期时间(单位秒),key过期会被删除。
- 注意:设置过期时间后,如果期间又重新设置了key,则过期时间会被覆盖成默认的永不过期。
- persist [key]
- 清除key的过期时间,会重新变回永不过期。
- ttl [key]
- 查询key的过期时间。
- 注意:
-1
表示key永不过期,-2
表示key不存在。
# str类型命令
- set [key] [value]
- 设置一个kv键值对。
- get [key]
- 获取一个key所对应的值。
- mset [key1 value1 key2 value2 ...]
- 设置多个kv键值对。
- mget [key1 key2 key3 ...]
- 获取多个key所对应的值。
- incr [key]
- 计数器功能,key的数值自增一。
- incrby [key] [数值]
- 计数器功能,key的数值自增指定数。
# list类型命令
rpush [key value1 value2 ...]
- 在列表右边插入元素,并返回当前列表的元素个数。
rpop [key]
- 弹出列表的最后一个元素 (移除并获取该元素值)。
brpop [key] [超时时间/s]
- 弹出列表的最后一个元素 (移除并获取该元素值)。
- 如果列表没有元素会阻塞列表,直到等待超时或发现可弹出元素为止。
- 超时时间为0时,则表示一直阻塞。
lpush [key value1 value2 ...]
- 在列表左边插入元素,并返回当前列表的元素个数。
lpop [key]
- 弹出列表的第一个元素 (移除并获取该元素值)。
blpop [key] [超时时间/s]
- 弹出列表的第一个元素 (移除并获取该元素值)。
- 如果列表没有元素会阻塞列表,直到等待超时或发现可弹出元素为止。
- 超时时间为0时,则表示一直阻塞。
llen [key]
- 查询列表的长度。
lrange [key 开始索引 结束索引]
- 查看列表中指定范围的元素 (开始索引到结束索引之间的元素)。
- 索引从0开始,支持反向索引,如-1为列表尾部。
# hash类型命令
- hset [key field value]
- 设置一个hash类型,同时插入一个字段与值。
- hget [key field]
- 获取指定key的字段的值。
- hmset [key field1 value1 field2 value2 ...]
- 设置一个hash类型,同时插入多个字段与值。
- hmget [key field1 field2 ...]
- 获取指定key的多个指定字段的值。
- hkeys [key]
- 获取指定key的哈希表中的所有字段。
- hgetall [key]
- 获取指定key的哈希表中的所有字段和值。
- hincrby [key field 数值]
- 为哈希中的字段的数字值加上指定数。
# set类型命令
- sadd [key value1 value2 value3 ...]
- 插入一个或多个值到集合。
- smembers [key]
- 列出指定集合中的所有元素。
- sismember [key] "[元素值]"
- 判断指定元素是否在集合中。
- 存在返回1,不存在返回0。
- sdiff [key1] [key2]
- 求差集,取出key1有,而key2没有的值,也就是key1 - key2。
- sinter [key1] [key2]
- 求交集,取出key1和key2都有的值。
- sunion [key1] [key2]
- 求并集/合集,将key1和key2的值合在一起并去重。
# Redis事务
介绍
- Redis的事务主要用于客户端批量执行命令,它对事务ACID特性的支持比较简单。
- Redis的持久性由AOF/RDB实现、隔离性由串行执行实现、不提供原子性、一致性由前面几点一起实现。
- Redis不提供完整的原子性,在事务执行过程中如果命令执行失败,Redis会忽略该命令继续执行剩余的命令,之所以不提供回滚能力,是由于Redis作者认为Redis定位是快速响应的内存数据库,如果加入回滚能力,将会严重影响效率。
事务执行过程
客户端执行multi命令开启事务。
后续执行的命令会提交到服务端的队列缓存中,直到客户端提交exec命令。
事务中执行的命令在进入队列缓存之前,都会检查命令的合法性,但不会检查语法的合法性。
# 下列命令的语法错误,但能成功入队 set multi_key 111 hhh # 下列的命令错误,无法入队,事务会被取消 sssset
1
2
3
4如果在事务执行过程中因为语法错误导致命令执行失败,则Redis会忽略该命令继续执行剩余的命令。但一般不会出现语法错误的情况,因为语法错误在软件测试阶段就会暴露出来。
客户端执行exec命令后,服务端将会从缓存队列中批量取出命令进行执行,最后响应客户端。
事务相关命令
multi
- 开始一个新事务exec
- 提交事务,执行事务中的所有命令discard
- 取消事务,放弃事务中的所有命令