读完这篇文章,就基本搞定了Redis数据库( 二 )


 
【读完这篇文章,就基本搞定了Redis数据库】比如下面我就用 Hash 类型存放了我本人的一些信息:
key=JavaUser293847value=https://www.isolves.com/it/sjk/Redis/2020-03-03/{“id”:1,“name”:“SnailClimb”,“age”:22,“location”:“Wuhan,Hubei”} 
List
 
常用命令:lpush、rpush、lpop、rpop、lrange 等 。
 
List 就是链表,Redis List 的应用场景非常多,也是 Redis 最重要的数据结构之一 。
 
比如微博的关注列表,粉丝列表,消息列表等功能都可以用 Redis 的 List 结构来实现 。
 
Redis List 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销 。
 
另外可以通过 lrange 命令,就是从某个元素开始读取多少个元素,可以基于 List 实现分页查询 。
 
这是很棒的一个功能,基于 Redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西(一页一页的往下走),性能高 。
 
Set
 
常用命令:sadd、spop、smembers、sunion 等 。
 
Set 对外提供的功能与 List 类似是一个列表的功能,特殊之处在于 Set 是可以自动排重的 。
 
当你需要存储一个列表数据,又不希望出现重复数据时,Set 是一个很好的选择 。
 
并且 Set 提供了判断某个成员是否在一个 Set 集合内的重要接口,这个也是 List 所不能提供的 。你可以基于 Set 轻易实现交集、并集、差集的操作 。
 
比如:在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合 。Redis 可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能 。
 
这个过程也就是求交集的过程,具体命令如下:
sinterstorekey1key2key3将交集存在key1内 
Sorted Set
 
常用命令:zadd、zrange、zrem、zcard 等 。
 
和 Set 相比,Sorted Set 增加了一个权重参数 Score,使得集合中的元素能够按 Score 进行有序排列 。
 
举例:在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用 Redis 中的 Sorted Set 结构进行存储 。
 
Redis 设置过期时间
 
Redis 中有个设置过期时间的功能,即对存储在 Redis 数据库中的值可以设置一个过期时间 。作为一个缓存数据库,这是非常实用的 。
 
如我们一般项目中的 Token 或者一些登录信息,尤其是短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能 。
 
我们 Set Key 的时候,都可以给一个 Expire Time,就是过期时间,通过过期时间我们可以指定这个 Key 可以存活的时间 。
 
如果你设置了一批 Key 只能存活 1 个小时,那么接下来 1 小时后,Redis 是怎么对这批 Key 进行删除的?
 
答案是:定期删除+惰性删除 。通过名字大概就能猜出这两个删除方式的意思了:

  • 定期删除:Redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 Key,检查其是否过期,如果过期就删除 。注意这里是随机抽取的 。为什么要随机呢?你想一想假如 Redis 存了几十万个 Key ,每隔 100ms 就遍历所有的设置过期时间的 Key 的话,就会给 CPU 带来很大的负载!
  • 惰性删除 :定期删除可能会导致很多过期 Key 到了时间并没有被删除掉 。所以就有了惰性删除 。假如你的过期 Key,靠定期删除没有被删除掉,还停留在内存里,除非你的系统去查一下那个 Key,才会被 Redis 给删除掉 。这就是所谓的惰性删除,也是够懒的哈!
 
但是仅仅通过设置过期时间还是有问题的 。我们想一下:如果定期删除漏掉了很多过期 Key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?
 
如果大量过期 Key 堆积在内存里,导致 Redis 内存块耗尽了 。怎么解决这个问题呢?
 
Redis 内存淘汰机制
 
MySQL 里有 2000w 数据,Redis 中只存 20w 的数据,如何保证 Redis 中的数据都是热点数据? 
Redis 配置文件 redis.conf 中有相关注释,我这里就不贴了,大家可以自行查阅或者通过这个网址查看:http://download.redis.io/redis-stable/redis.conf


推荐阅读