Redis 介绍

一、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⽀持多种数据类型

image-20221116154933659

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常⽤指令

image-20221116155248696

## 存储数据
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⽂件中

image-20221116180746258

  • 原理:

    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持久化

image-20221116181726120

  • 原理:

    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行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值