一、Redis介绍
redis是种非关系型数据库,是以键值对形式来存储的,基于内存数据存储,被用作为 数据库 缓存 消息中间件。
特点:高性能key/value内存型数据库,支持丰富的数据类型,支持持久化,单线程、单进程。
二、Redis数据库的相关指令
1. 数据库操作命令
# 1.Redis中库说明
- 使用redis的默认配置器动redis服务后,默认会存在16个库,编号从0-15
- 可以使用select 库的编号 来选择一个redis的库
# 2.Redis中操作库的指令
- 清空当前的库 FLUSHDB
- 清空全部的库 FLUSHALL
# 3.redis客户端显示中文
- ./redis-cli -p 7000 --raw
2. 操作key相关指令
# 1.DEL指令
- 语法 : DEL key [key ...]
- 作用 : 删除给定的一个或多个key 。不存在的key 会被忽略。
- 可用版本: >= 1.0.0
- 返回值: 被删除key 的数量。
# 2.EXISTS指令
- 语法: EXISTS key
- 作用: 检查给定key 是否存在。
- 可用版本: >= 1.0.0
- 返回值: 若key 存在,返回1 ,否则返回0。
# 3.EXPIRE
- 语法: EXPIRE key seconds
- 作用: 为给定key 设置生存时间,当key 过期时(生存时间为0 ),它会被自动删除。
- 可用版本: >= 1.0.0
- 时间复杂度: O(1)
- 返回值:设置成功返回1 。
# 4.KEYS
- 语法 : KEYS pattern
- 作用 : 查找所有符合给定模式pattern 的key 。
- 语法:
KEYS * 匹配数据库中所有key 。
KEYS h?llo 匹配hello ,hallo 和hxllo 等。
KEYS h*llo 匹配hllo 和heeeeello 等。
KEYS h[ae]llo 匹配hello 和hallo ,但不匹配hillo 。特殊符号用 "\" 隔开
- 可用版本: >= 1.0.0
- 返回值: 符合给定模式的key 列表。
# 5.TTL
- 语法 : TTL key
- 作用 : 以秒为单位,返回给定key 的剩余生存时间(TTL, time to live)。
- 可用版本: >= 1.0.0
- 返回值:
当key 不存在时,返回-2 。
当key 存在但没有设置剩余生存时间时,返回-1 。
否则,以秒为单位,返回key 的剩余生存时间。
- Note : 在Redis 2.8 以前,当key 不存在,或者key 没有设置剩余生存时间时,命令都返回-1 。
# 6.RENAME
- 语法 : RENAME key newkey
- 作用 : 将key 改名为newkey 。当key 和newkey 相同,或者key 不存在时,返回一个错误。当newkey 已经存在时,RENAME 命令将覆盖旧值。
- 可用版本: >= 1.0.0
- 返回值: 改名成功时提示OK ,失败时候返回一个错误。
# 7.TYPE
- 语法 : TYPE key
- 作用 : 返回key 所储存的值的类型。
- 可用版本: >= 1.0.0
- 返回值:
none (key 不存在)
string (字符串)
list (列表)
set (集合)
zset (有序集)
hash (哈希表)
三、redis的五种基本数据类型
String:
字符串,应用场景 验证码
命令 | 说明 | 语法 |
---|---|---|
set | 设置一个key/value | set key value |
get | 获取key的value | get key |
setex | 设置key的存活时间 | setex key time value |
setnx: | key存在不做操作,不存在则添加 | setnx key value |
incr: | 根据数值类型的+1操作 | incr key |
List:
特点:元素有序,值可以重复 ,应用场景:商品列表
命令 | 说明 | 语法 |
---|---|---|
lpush | 将某个值加入到一个key列表头部 | lpush 集合名 元素名 |
lpop | 返回并移除列表左边的第一个元素 | lpop 集合名 |
lrange | 获取某一个下标区间内的元素,从0开始 | lrange 集合名 0 结束索引 |
llen | 获取列表元素个数 | llen 集合名 |
llem | 删除重复元素 | lrem 集合名 删除的个数 元素名 |
Set:
特点:元素无序,值不可重复 ,应用场景:好友可能认识的人
命令 | 说明 | 语法 |
---|---|---|
sadd | 为集合添加元素 | sadd 集合名 元素名 |
smembers | 显示集合中所有元素 无序 | smembers 集合名 |
scard | 返回集合中元素的个数 | scard 集合名 |
srem | 从集合中删除一个元素 | srem 集合名 元素名 |
sdiff | 差集 | sdiff 集合1 集合2 |
sinter | 交集 | sinter 集合1 集合2 |
ZSet:
特点:排序,值不可重复,应用场景:排行榜
命令 | 说明 | 语法 |
---|---|---|
zadd | 添加一个有序集合元素 | ZADD KEY_NAME SCORE1 VALUE1 |
zcard | 返回集合的元素个数 | zcard 集合名 |
zrange(升序)zrevrange(降序) | 返回一个范围内的元素 | zrange 集合名 开始索引 结束索引 |
zrem | 移除某一个元素 | zrem 集合名 |
Hash:
特点:map机构 key value key 无序
命令 | 说明 | 语法 |
---|---|---|
hset | 设置一个key/value对 | hset 集合名 key |
hget | 获得一个key对应的value | hegt 集合名 key |
四、持久化机制
Redis官方提供了两种不同的持久化方法来将数据存储到磁盘当中:
-
RDB 快照 将某一时候的数据添加到磁盘当中,是redis默认开启的持久化方式。
快照生成方式 :
BGSAVE:客户端使用BGSAVE来创建一个快照时,当接收到客户端的BGSAVE命令时,redis会调用fork来创建一个子进程,然后让子进程负责将快照写入磁盘,父进程继续处理请求。
SAVE:客户端使用SAVE来创建一个快照,接收SAVE命令的redis服务器在快照创建完毕之前,不在响应任何其他的命令。
-
AOF只追加日志文件 将所有客户端执行的写命令记录到日志文件当中,需要手动开启。
# 1.开启AOF持久化 - a.修改 appendonly yes 开启持久化 - b.修改 appendfilename "appendonly.aof" 指定生成文件名称 # 2.everysec 【推荐】 - 说明: 每秒执行一次同步显式的将多个写命令同步到磁盘 - 解释: 为了兼顾数据安全和写入性能,用户可以考虑使用everysec选项,让redis每秒一次的频率对AOF文件进行同步;redis每秒同步一次AOF文件时性能和不使用任何持久化特性时的性能相差无几,而通过每秒同步一次AOF文件,redis可以保证,即使系统崩溃,用户最多丢失一秒之内产生的数据。
当这个AOF的文件超过,设定的阈值,会进行一个AOF重写的操作,通过命令的方式进行重写一个AOF文件,替换原有的文件。
五、主从复制
Redis主从复制,是常见的数据备份的操作,可以实现数据的冗余备份,读写分离等功能。Redis主从复制的原理是将一个Redis实例的数据复制到多个Redis实例上,其中一个实例作为主节点(master),剩余的作为从节点(Slave)。主节点负责接受写的操作,并将写的操作同步给从节点。从节点的话只能接收读的请求,不处理写请求从而保证了数据的一致性。
六、哨兵机制
哨兵机制是Redis高可用性的重要保证。当主节点发生故障的时候,哨兵机制可以自动 选举新的主节点,将原来的从节点提升为主节点,并重新建立新的主从复制关系。
七、缓存常见的问题
1. 缓存穿透:
客户端请求的数据,在数据库和redis中都不存在,这样的缓存永远都不会生效,请求i最终都到了数据库上。
解决方案:
-
当在数据库查询的结果也不存在的时候,可以给redis返回一个null值,并设置TTL(过期时间)。
-
布隆过滤器
2. 缓存击穿
-
热点Key问题,一个被高并发访问且业务复杂的key突然失效,无数的请求瞬间给数据库带来了巨大的冲击。
解决办法:添加互斥锁,逻辑过期
3. 缓存雪崩
-
同一时间内,大量的缓存key失效或者是redis宕机,造成大量的请求到达了数据库,带来巨大的压力。
-
的请求瞬间给数据库带来了巨大的冲击。
解决办法:添加互斥锁,逻辑过期
[外链图片转存中...(img-Slzawymk-1719041855705)]
3. 缓存雪崩
-
同一时间内,大量的缓存key失效或者是redis宕机,造成大量的请求到达了数据库,带来巨大的压力。
[外链图片转存中…(img-Q3zgiU92-1719041855705)]
解决方案:给key设置随机的TTL,搭建集群防止宕机。