目录
一、概述
Redis是一个基于内存的key-value结构数据库。
- 基于内存存储,读写性能高
- 适合存储热点数据(热点商品、资讯、新闻)
二、下载安装
Redis-Windows 百度网盘
Redis客户端管理工具-Window 百度网盘
Redis-Linux 百度网盘
Redsi是绿色版的,解压即可使用。
三、启动停止
鼠标点击启动
命令行启动
// 服务端
redis-server.exe redis.windows.conf
// 客户端
redis-cli.exe -h localhost -p 6379 -a 密码
Redis设置密码:修改redis.windows.conf
四、常用数据类型
Redis存储是的key-value结构的数据,其中key是字符串类型,而value有常用的五种数据类型:
- 字符串 String
- 哈希 Hash
- 列表 List
- 集合 Set
- 有序集合 Zset
五、常用命令
5.1 字符串操作
命令 | 说明 | 案例 |
---|---|---|
SET key value | 设置指定key的值 | set name zhangsan |
GET key | 获取指定key的值 | get name |
SETEX key seconds value | 设置指定key的值,并将key的过期时间设置为seconds秒 | setex code 30 abc123 |
SETNX key value | 只有在key不存在时设置key的值 | setnx name lisi |
DEL key[key1 key2] | 删除多个键 | del username age sex |
5.2 哈希操作
Redis hash是一个String类型的
field和value的 映射表,hash特别适合用于存储对象
。
命令 | 说明 | 案例 |
---|---|---|
HSET key field value | 将哈希表key中的字段field的值设置为value | hset user username li |
HGET key field | 获取存储在哈希表中指定字段的值 | hget user username |
HDEL key field | 删除存储在哈希表中的指定字段 | hdel user password |
HKEYS key | 获取哈希表中所有字段 | hkeys user |
HVALS key | 获取哈希表中所有的值 | hvals user |
5.3 列表操作
Redis列表是简单的字符串列表,按照插入顺序排序。
命令 | 说明 | 案例 |
---|---|---|
LPUSH key value1[value2] | 将一个或多个值插入到列表的头部【按照插入顺序降序排序】 | lpush names zhangsan lisi wangwu |
LRANGE key start stop | 获取列表指定范围内的元素【先插入的数据在后面】 | lrange names 0 -1【查询列表的全部数据】 lrange names 0 1【查询列表的指定顺序】 |
RPOP key | 移除并获取列表最后一个元素 | rpop names |
LLEN key | 获取列表长度 | llen names |
5.4 集合操作
Redis set是String类型的无序集合。集合成员是
唯一的
,集合中不能出现重复的元素。
命令 | 说明 | 案例 |
---|---|---|
SADD key member1 member2 | 向集合中增加一个或多个元素 | sadd name1 zhangsan lisi wangwu |
SMEMBERS key | 返回集合中的所有元素 | smembers name1 |
SCARD key | 获取集合的元素数 | scard name1 |
SINTER key1 key2 | 返回给定所有集合的交集 | sinter name1 name2 |
SUNION key1 key2 | 返回给定所有集合的并集 | sunion name1 name2 |
SREM key member1 member2 | 删除集合中一个或多个成员 | srem name1 zhangsan lisi |
5.5 有序集合操作
Redis有序集合是String类型元素的集合,且
不允许有重复的元素
。每个元素都会关联一个Double类型的分数
.
命令 | 说明 | 案例 |
---|---|---|
ZADD key score1 member1 score2 member2 | 向有序集合添加一个或多个元素【按照分数升序排序】 | zadd age 1.0 22 2.0 25 |
ZRANGE key start stop withscores | 通过索引区间返回有序集合中指定区间内的元素 | zrange age 0 -1 withscores |
ZINCRBY key increment member | 有序集合中对指定成员的分数加上增加 increment | zincrby age 2 18 |
ZREM key member1 member2 | 移除有序集合中的一个或多个成员 | zrem age 22 |
5.6 通用命令
命令 | 说明 | 案例 |
---|---|---|
KEYS pattern | 查询所有复合给定模式(pattern)的key | keys * 返回所有的key keys set* 返回以set开头的所有key |
EXISTS key | 检查给定key是否存在:0 不存在 1 存在 | exists name |
TYPE key | 返回key所存储的值的类型 | type name |
DEL key | 该命令用于在key存在时删除key | del name |
六、Redis缓存穿透、击穿和雪崩
6.1 Redis缓存穿透
Redis缓存穿透是一个在Redis缓存应用中可能出现的问题,当大量的数据在缓存和数据库中都查询不出来的时候,这些请求会直接的去访问数据库,导致数据库在短时间内承受大量的请求,从而导致数据库崩溃或者是性能下降的现象。
6.1.1 出现的原因
当一个不存在的数据被大量请求,由于该数据在缓存中不存在,因此每次请求都会去访问数据库,从而导致数据库崩溃或者是性能下降。
这种情况通常由于恶意攻击、缓存设置不当或者业务逻辑漏洞引起的。
6.1.2 解决方案
6.1.2.1 缓存空对象:缓存空对象并设置一定的过期时间。
- 用户发送请求,首先查询缓存,如果存在数据则直接返回结果,如果不存在数据则查询数据库。
- 当数据库查询到数据存入缓存中并返回结果,如果不存在数据则将NULL存入缓存中并设置过期时间。
优点:实现简单
缺点:
- 耗费内存。Redis中缓存大量的空值不仅会浪费宝贵的内存,而且如果攻击者持续使用随机键进行攻击,这种策略就会失效,在这种情况下,不仅数据库可能崩溃,Redis服务也可能因为内存耗尽出现拒接写的操作。
- 数据不一致。虽然在缓存中我们设定了较短的过期时间,但是可能出现数据库实时数据应景更新但是缓存没有过期,还是返回NULL的情况。
6.1.2.2 布隆过滤器
布隆过滤器提供一种高效的概率型检测机制,用于判断一个元素是否可能存在于一个集合内。当
布隆过滤器断言某个键(KEY)
不存在时,这个结论是绝对可靠的,但是它认为这个键存在时,只是表示有很高的可能性存在,尽管有一定的误判几率,但是可以有效的解决缓存穿透的问题。
- 用户发送请求,首先会经过布隆过滤器,判断KEY是否存在,如果不存在则直接返回结果,如果存在则查询缓存
- 如果缓存中存在数据,则直接返回结果,如果不存在则查询数据库。
- 如果数据库中存在数据,则将KEY写入布隆过滤器,并将数据写入缓存中,将结果返回,如果不存在则直接返回结果。
优点:内存占用小,布隆过滤器不存储具体的值,只存储数据的哈希值,因此相比存储真实数据,占用的内存要少。
缺点:
- 存在一定的误判情况。
- 数据不一致。通常情况下,数据库更新数据之后,要将KEY存储到布隆过滤器中,但是如果这中间出现了网络中断就是出现数据的不一致。
6.1.2.3 其他方式
- 热点数据缓存:将经常查询的数据进行缓存,并设置一个较长的过期时间。
- 异步加载缓存:多个请求只有一个请求加载数据,其余请求去缓存中提取。
- 限流和防刷极值:控制请求的频率。
6.1.3 总结
Redis缓存穿透是一个需要重视的问题,它可能对数据库造成过大的压力,影响系统的稳定性和性能,通过以上方式可以有效地减少缓存穿透的发生,从而提高系统的稳定性和性能,同时还需要根据业务场景选择合适的解决方案。
6.2 Redis缓存击穿
缓存击穿发生在
高并发
的系统中,当平凡访问的热点数据在缓存中过期了,这是恰好有大量的并发请求需要访问这个数据。由于缓存中的数据已经失效,这些并发请求就会转发到数据库上