一、Redis介绍
1.1 锋迷商城项⽬问题
- 数据库访问压⼒:为了降低对数据库的访问压⼒,当多个⽤户请求相同的数据时,我们
可以将第⼀次从数据库查询到数据进⾏缓存(存储在内存中),以减少对数据库的访问次数
-
⾸⻚数据的加载效率:将⼤量的且不经常改变的数据缓存在内容中,可以⼤幅度提⾼访
问速度
-
集群部署下的商品超卖:分布式事务
-
⽤户登录:分布式会话
1.2 Redis介绍
1.2.1 Redis的产⽣背景
2008年 萨尔瓦多——开发⼀个进⾏⽹站实时统计软件项⽬(LLOOGG),项⽬的实时统计
功能需要频繁的进⾏数据库的读写(对数据库的读写要求很⾼—数千次/s),MySQL满⾜不
了项⽬的需求,萨尔瓦多就使⽤C语⾔⾃定义了⼀个数据存储系统—Redis。后来萨尔瓦
多不满⾜仅仅在LLOOGG这个项⽬中使⽤redis,就对redis进⾏ 产品化 并进⾏开源,以便
让更多的⼈能够使⽤。
1.2.2 Redis使⽤
Redis就是⼀个⽤C语⾔开发的、基于内存结构进⾏ 键值对 数据存储的、⾼性能的、⾮关系型
NoSQL数据库
1.2.3 Redis⽀持的数据类型
redis是基于键值对进⾏数据存储的,但是value可以是多种数据类型:
string 字符串
hash 映射
list 列表(队列)
set 集合
zset ⽆序集合
1.2.4 Redis特点
- 基于内存存储,数据读写效率很⾼
- Redis本身⽀持持久化
- Reids虽然基于key-value存储,但是⽀持多种数据类型
- Redis⽀持集群、⽀持主从模式
1.3 Redis应⽤场景
-
缓存:在绝⼤多数的互联⽹项⽬中,为了提供数据的访问速度、降低数据库的访问压
⼒,我们可以使⽤redis作为缓存来实现
-
点赞、排⾏榜、计数器等功能:对数据实时读写要求⽐较⾼,但是对数据库的⼀致性要
求并不是太⾼的功能场景
-
分布式锁:基于redis的操作特性可以实现分布式锁功能
-
分布式会话:在分布式系统中可以使⽤redis实现 session (共享缓存)
-
消息中间件:可以使⽤redis实现应⽤之间的通信
1.4 Redis的优缺点
1.4.1 优点
-
redis是基于内存结构,性能极⾼(读 110000次/秒,写 81000次/秒)
-
redis基于键值对存储,但是⽀持多种数据类型
-
redis的所有操作都是原⼦性,可以通过lua脚本将多个操作合并为⼀个院⼦操作(Redis
的事务)
-
reids是基于单线程操作,但是其多路复⽤实现了⾼性能读写
1.4.2 缺点
- 缓存数据与数据库数据必须通过两次写操作才能保持数据的⼀致性
- 使⽤缓存会存在缓存穿透、缓存击穿及缓存雪崩等问题,需要处理
- redis可以作为数据库使⽤进⾏数据的持久存储,存在丢失数据的⻛险
⼆、Redis安装及配置
2.1 Redis安装
基于linux环境安装redis
2.1.1 下载Redis
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
2.1.2 安装redis
安装gcc
yum -y install gcc
解压redis安装包
tar -zxvf redis-5.0.5.tar.gz
解压之后进⼈到redis-5.0.5⽬录
cd redis-5.0.5
编译
make MALLOC=libc
安装
make install
启动redis
## 当我们完成redis安装之后,就可以执⾏redis相关的指令
redis-server ## 启动redis服务
redis-server &
打开客户端
redis-cli ## 启动redis操作客户端(命令⾏客户端)
2.2 Redis配置
使⽤ redis-server 指令启动redis服务的时候,可以在指令后添加redis配置⽂件的路径,以设置redis是以何种配置进⾏启动
redis-server redis-6380.conf & ## redis以redis-6380.conf⽂件中的配置来启动
如果不指定配置⽂件的名字,则按照redis的默认配置启动(默认配置≠redis.conf)
我们可以通过创建redis根⽬录下 redis.conf 来创建多个配置⽂件,启动多个redis服务
redis-server redis-6380.conf & redis-server redis-6381.conf &
常⽤redis配置
## 设置redis实例(服务)为守护模式,默认值为no,可以设置为yes
daemonize no
## 设置当前redis实例启动之后保存进程id的⽂件路径
pidfile /var/run/redis_6379.pid
## 设置redis实例的启动端⼝(默认6379)
port 6380
## 设置当前redis实例是否开启保护模式
protected-mode yes
## 设置允许访问当前redis实例的ip地址列表
bind 127.0.0.1
## 设置连接密码
requirepass 123456
## 设置redis实例中数据库的个数(默认16个,编号0-15)
databases 16
## 设置最⼤并发数量
maxclients
## 设置客户端和redis建⽴连接的最⼤空闲时间,设置为0表示不限制
timeout 0
三、Redis基本使⽤
3.1 Redis存储的数据结构
Redis是以键值对形式进⾏数据存储的,但是value⽀持多种数据类型
3.2 string常⽤指令
## 设置值/修改值 如果key存在则进⾏修改
set key value
## 取值
get key
## 批量添加
mset k1 v1 [k2 v2 k3 v3 ...]
## 批量取值
mget k1 [k2 k3...]
## ⾃增和⾃减
incr key ## 在key对应的value上⾃增 +1
decr key ## 在key对应的value上⾃减 -1
incrby key v ## 在key对应的value上+v
decrby key v ## 在key对应的value上-v
## 添加键值对,并设置过期时间(TTL)
setex key time(seconds) value
## 设置值,如果key不存在则成功添加,如果key存在则添加失败(不做修改操作)
setnx key value
## 在指定的key对应value拼接字符串
append key value
## 获取key对应的字符串的⻓度
strlen key
3.3 hash常⽤指令
## 向key对应的hash中添加键值对
hset key field value
## 从key对应的hash获取field对应的值
hget key field
## 向key对应的hash结构中批量添加键值对
hmset key f1 v1 [f2 v2 ...]
## 从key对应的hash中批量获取值
hmget key f1 [f2 f3 ...]
## 在key对应的hash中的field对应value上加v
hincrby key field v
## 获取key对应的hash中所有的键值对
hgetall key
## 获取key对应的hash中所有的field
hkeys key
## 获取key对应的hash中所有的value
hvals key
## 检查key对应的hash中是否有指定的field
hexists key field
## 获取key对应的hash中键值对的个数
hlen key
## 向key对应的hash结构中添加f-v,如果field在hash中已经存在,则添加失败
hsetnx key field value
3.4 list常⽤指令
## 存储数据
lpush key value # 在key对应的列表的左侧添加数据value
rpuhs key value # 在key对应的列表的右侧添加数据value
## 获取数据
lpop key # 从key对应的列表的左侧取⼀个值
rpop key # 从key对应的列表的右侧取⼀个值
## 修改数据
lset key index value #修改key对应的列表的索引位置的数据(索引从左往右,从0开
始)
## 查看key对应的列表中索引从start开始到stop结束的所有值
lrange key start stop
## 查看key对应的列表中index索引对应的值
lindex key index
## 获取key对应的列表中的元素个数
llen key
## 从key对应的列表中截取key在[start,stop]范围的值,不在此范围的数据⼀律被清除掉
ltrim key start stop
## 从k1右侧取出⼀个数据存放到k2的左侧
rpoplpush k1 k2
3.5 set常⽤指令
## 存储元素 :在key对应的集合中添加元素,可以添加1个,也可以同时添加多个元素
sadd key v1 [v2 v3 v4...]
## 遍历key对应的集合中的所有元素
smembers key
## 随机从key对于听的集合中获取⼀个值(出栈)
spop key
## 交集
sinter key1 key2
## 并集
sunion key1 key2
## 差集
sdiff key1 key2
## 从key对应的集合中移出指定的value
srem key value
## 检查key对应的集合中是否有指定的value
sismember key value
3.6 zset常⽤指令
zset 有序不可重复集合 z
## 存储数据(score存储位置必须是数值,可以是float类型的任意数字;member元素不允许重复)
zadd key score member [score member...]
## 查看key对应的有序集合中索引[start,stop]数据——按照score值由⼩到⼤(start 和stop指的不是score,⽽是元素在有序集合中的索引)
zrange key start top
##查看member元素在key对应的有序集合中的索引
zscore key member
## 获取key对应的zset中的元素个数
zcard key
## 获取key对应的zset中,score在[min,max]范围内的member个数
zcount key min max
## 从key对应的zset中移除指定的member
zrem key member
## 查看key对应的有序集合中索引[start,stop]数据——按照score值由⼤到⼩
zrevrange key start stop
3.7 key相关指令
## 查看redis中满⾜pattern规则的所有的key(keys *)
keys pattern
## 查看指定的key谁否存在
exists key
## 删除指定的key-value对
del key
## 获取当前key的存活时间(如果没有设置过期返回-1,设置过期并且已经过期返回-2)
ttl key
## 设置键值对过期时间
expire key seconds
pexpire key milliseconds
## 取消键值对过期时间
persist key
3.8 db常⽤指令
redis的键值对是存储在数据库中的——db
redis中默认有16个db,编号 0-15
## 切换数据库
select index
## 将键值对从当前db移动到⽬标db
move key index
## 清空当前数据库数据
flushdb
## 清所有数据库的k-v
flushall
## 查看当前db中k-v个数
dbsize
## 获取最后⼀次持久化操作时间
lastsave
四、Redis的持久化 [重点]
Redis 是基于内存操作,但作为一个数据库也具备数据的持久化能力;但是为了高效的读写操作,并不会及时进行数据的持久化,而是按照一定的规则进行持久化操作—持久化策略
Reids提供了两种持久化策略:
- RDB (Redis DataBase)
- AOF(Append Only File)
4.1 RDB
在满⾜特定的redis操作条件时,将内存中的数据以数据快照的形式存储到rdb⽂件中
-
原理:
RDB是redis默认的持久化策略,当redis中的写操作达到指定的次数、同时距离上⼀次持
久化达到指定的时间就会将redis内存中的数据⽣成数据快照,保存在指定的rdb⽂件
中。
-
默认触发持久化条件:
-
900s 1次:当操作次数达到1次,900s就会进⾏持久化
-
300s 10次:当操作次数达到10次,300s就会进⾏持久化
-
60s 10000次:当操作次数达到10000次,60s就会就⾏持久化
-
-
我们可以通过修改redis.conf⽂件,来设置RDB策略的触发条件
## rdb持久化开关 rdbcompression yes ## 配置redis的持久化策略 save 900 1 save 300 10 save 60 10000 ## 指定rdb数据存储的⽂件 dbfilename dump.rdb
-
RED持久化细节分析:
优点:
- 数据量较小的情况下,执行速度比较快
- 由于RDB是以数据快照的形式保存的,我们可以通过拷贝rdb文件轻松实现reids的数据迁移
缺点:
- 如果redis出现故障,存在数据丢失的⻛险,丢失上⼀次持久化之后的操作数据
- RDB采⽤的是数据快照形式进⾏持久化,不适合实时性持久化
- 如果数据量巨⼤,在RDB持久化过程中⽣成数据快照的⼦进程执⾏时间过⻓,会导致redis卡顿,因此save时间周期设置不宜过短;
4.2 AOF
Apeend Only File,当达到设定触发条件时,将redis执⾏的写操作指令存储在aof⽂件中,Redis默认未开启aof持久化
-
原理:
Redis将每⼀个成功的写操作写⼊到aof⽂件中,当redis重启的时候就执⾏aof⽂件中的指令以恢复数据
-
配置:
## 开启AOF appendonly yes ## 设置触发条件(三选⼀) appendfsync always ## 只要进⾏成功的写操作,就执⾏aof appendfsync everysec ## 每秒进⾏⼀次aof appendfsync no ## 让redis执⾏决定aof ## 设置aof⽂件路径 appendfilename "appendonly.aof"
-
AOF细节分析:
-
也可以通过拷⻉aof⽂件进⾏redis数据移植
-
aof存储的指令,⽽且会对指令进⾏整理;⽽RDB直接⽣成数据快照,在数据量不⼤时RDB⽐较快
-
aof是对指令⽂件进⾏增量更新,更适合实时性持久化
-
redis官⽅建议同时开启2中持久化策略,如果同时存在aof⽂件和rdb⽂件的情况下aof优先
-
Linux
lsof -i : 1234 查看端口号
cat -n redis.conf | grep pidfile 查看 pidfile 在 reids.conf 中的那个位置
vim +158 redis.conf 跳转 redis.conf 158行