Redis
Redis概述
- NoSQL数据库
- 使用内存作为存储介质
- 采用KV键值对保存数据
- 性能优越(GET(读):110000次/秒 ,SET(写):81000次/秒)
使用
- 启动服务器:redis-server redis.windows.conf
- 启动客户端:redis-cli.exe
- 桌面管理工具:RedisDesktopManager
- 设置密码:redis.windows.conf配置文件中设置requirepass(大约443行)
数据类型
- 字符串(String)
- set 键 值
- get 键
- 哈希(Hsah)
- hset 键 字段 值:字段对应值
- hmset 键 字段1 值1 字段2 值2 …
- hget 键 字段:取值
- hmget 键 字段1 字段2…
- hgetall 键
- 容量:2的32次方(40亿)
- 列表(Lsit)
- Lpush 键 值1 值2 …
- lrange 键 开始下标 结束下标
- 容量:2的32次方(40亿)
- 集合(Set)
- sadd 键 值1 值2 …
- smembers 键
- 有序集合(Zset)
- zad 键 分数 1 值1 分数2 值2 …
- zrange 键 开始下标 结束下标
- zrangebyscore 键 开始分值 结束分值
常用命令
- keys * ----- 获取所有的键
- dbsize ----- 获取键总数
- exists key 键 ----- 查询键值是否存在
- del key 键 ----- 删除键
- type 键 ----- 查询键类型
- ttl key / pttl key ----- 查询key的生命周期(秒,毫秒)*** -1即是永不过期***
- expire/pexpire key seconds/milliseconds ----- 设置生命周期时间
- persist 键 ----- 设置永不过期
- rename 键 新键 ----- 更改键名称
常见问题
- Redis为什么这么快?
- 内存作为存储介质
- KV键值对的结构简单,性能开销小
- 单线程
- 底层使用C/C++开发,数据库与底层兼容性高
- 缓存穿透
- 所发起的请求缓存和数据库都无法提供反馈,无故消耗资源,攻击居多,例如:id = -1
- 解决:(1). 接口层效验,鉴别数据是否符合数据库要求,例如:id<=0拦截 (2).缓存根据请求设置key - value为 key - null 指定有效时长
- 缓存击穿
- 请求的反馈缓存没有,数据库能够响应,如果存在高并发的击穿,数据库压力瞬间增大
- 解决:(1). 设置热点数据永不过期 (2). 定时任务更新缓存数据 (3). 加互斥锁(保证单线程访问数据库)
- 缓存雪崩
- 缓存数据在极短的时间大批量到过期时间,查询更新很可能使得数据库宕机
- 解决:(1). 缓存数据的过期时间设置随机,避免同一时间大量数据过期现象发生 (2). 数据分布式部署,热点数据均匀分布,减低 (3). 根据需要可以设置热点数据永不过期
应用场景和注意事项
场景:
- 缓存热点或常用数据(评论)
- 消息对列
- 高速读写场景(现场投票,实时显示)
注意:
- 业务命中率低,没必要使用Redis
- 业务数据读写多,与数据库交互频繁,没必要使用Redis
- 业务数据庞大,对内存造成巨大压力,没必要使用Redis