2020-09-14

非关系型数据库(Redis)

1.概念:

Redis是使用内存作为存储介质,采用键值对来保存数据的NoSQL数据库,是一种非关系型数据库。性能优越(GET 读 :110000/s ;SET 写 :81000/s 【官方】)

2.应用场景:
  • 缓存热点或常用数据(评论)
  • 消息队列(支付)
  • 高速读写场景(现场投票)
3.注意事项:
  • 业务数据如果命中率很低,就没有必要写入Redis
  • 业务数据操作写操作多,频繁需要写入数据,也没有必要使用Redis
  • 业务数据要存储几百兆字节的文件,会给Redis带来很大的压力,也没有必要使用Redis
4.安装和配置

启动服务器:redis-server redis.windows.conf

启动客户端:redis-cli.exe

桌面管理工具:RedisDesktopManager

设置密码:redis.windows.conf配置文件中设置requirepass密码

5.五种数据类型
  • String (字符串)

set 键 值

例如:set China beijing;

get 键

例如:get China

  • Hash(哈希)

hset 键 字段 值

hget键 字段

hmset 键 字段1 值1 字段2 值2 字段3 值3 ... 字段n 值n

hmget 键 字段1 字段2 字段3 ... 字段n

hgetall 键

容量:每个hash可以存储4294967295键值对(2的32次方-1)

  • List(列表)

lpush键 值1 值2 值3 值n

lrange 键 开始下标 结束下标

容量:每个列表可以存储4294967295键值对(2的32次方-1)

  • Set(集合)

sadd 键 值1 值2 值3 ... 值n

smembers 键

  • Zset(Sorted Set : 有序集合)

zadd 键 分数1 值1 分数2 值2 分数3 值3 ... 分数n 值n

zrange 键 开始下标 结束下标

zrangebyscore 键 开始分值 结束分值

6.常用命令
  • 获取所有键 : keys *
  • 获取键总数 :dbsize
  • 查询键是否存在: exists key 键
  • 删除键 :del key 键
  • 查询键类型 :type 键
  • 查询key的生命周期(秒)

秒语法:ttl key (-1永远不过期)

毫秒语法:pttl key (-1永远不过期)

  • 设置过期时间

秒语法:expire key seconds

毫秒语法:pexpire key milliseconds

  • 设置永不过期:persist 键
  • 更改键名称:rename 键 新键
7.常见问题
* Redis为什么这么快?

Redis采用内存作为存储介质;存储数据采用KV键值对,KV键值对结构相对简单,不会带来额外的性能开销;单线程;使用C/C++开发,数据库操作更贴近底层。

* 缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如id为 “-1”或者id为特别大而不存在的数据,这时用户很可能是攻击者,攻击会导致数据库压力过大。是一种攻击手段

解决方案:

接口层增加校验,如用户鉴权校验,id作为基础校验,id<=0的直接阻拦

从缓存和数据库都取不到的数据,可以将key-value写为 key-null,缓存有效时间可以设置短一些(设置太长会导致正常情况也没法使用)。防止攻击用户反复私用同一个id暴力攻击

* 缓存击穿

缓存击穿是指缓存中没有但数据库中有的数据,这时由于并发用户特别多,同时读取缓存没有读到数据,又同时去数据库读取数据,引起数据库压力瞬间增大,造成过大压力

解决方案:

设置热点数据永不过期

定时任务更新缓存数据

加互斥锁

* 缓存雪崩

缓存雪崩是指缓存中数据大批量过期,同时又有特别多的并发用户,引起数据库压力过大甚至down机。和缓存基础按不同的是,缓存雪崩是不同数据都过期了,很多数据都查不到从而去数据库中查询

解决方案:

缓存数据法人过期时间设置随机,防止同一时间大量数据过期现象发生

如果缓存数据是分布式部署,将热点数据均匀分布在不同的缓存数据中

设置热点数据永不过期

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容