面试自行拓展
String 还是 Hash 存储对象数据更好呢?
String 存储的是序列化后的对象数据,存放的是整个对象。Hash 是对对象的每个字段单独存储,可以获取部分字段的信息,也可以修改或者添加部分字段,节省网络流量。如果对象中某些字段需要经常变动或者经常需要单独查询对象中的个别字段信息,Hash 就非常适合。String 存储相对来说更加节省内存,缓存相同数量的对象数据,String 消耗的内存约是 Hash 的一半。并且,存储具有多层嵌套的对象时也方便很多。如果系统对性能和资源消耗非常敏感的话,String 就非常适合。
使用 Redis 实现一个排行榜怎么做?
使用 Redis 实现一个排行榜可以采用以下步骤:
- 存储数据:可以使用 Redis 的 List 数据结构来存储排行榜数据。每个排行榜可以建立一个 List,将排名按照分数从高到低排序存储。
- 添加数据:可以使用 Redis 的 LPUSH 命令将新的排名数据添加到 List 中。例如,使用 LPUSH myrank 100 将分数为 100 的数据添加到名为 myrank 的排行榜中。
- 查询数据:可以使用 Redis 的 LRANGE 命令查询某个排行榜的部分排名数据。例如,使用 LRANGE myrank 0 10 WITHSCORES 可以查询名为 myrank 的排行榜中前 11 个排名及其分数。
- 更新数据:可以使用 Redis 的 LREM 命令更新某个排行榜中某个排名的数据。例如,使用 LREM myrank -1 98 可以将名为 myrank 的排行榜中分数为 98 的排名向下移动一位。
- 删除数据:可以使用 Redis 的 LREM 命令删除某个排行榜中某个排名的数据。例如,使用 LREM myrank -1 99 可以将名为 myrank 的排行榜中分数为 99 的排名删除。
通过以上步骤,可以使用 Redis 实现一个简单的排行榜功能。需要注意的是,在实际应用中还需要考虑数据的并发访问和安全问题。
Set 的应用场景
存放的数据不能重复的场景:网站 UV 统计(数据量巨大的场景还是 HyperLogLog更适合一些)、文章点赞、动态点赞等等。
需要获取多个数据源交集、并集和差集的场景:共同好友(交集)、共同粉丝(交集)、共同关注(交集)、好友推荐(差集)、音乐推荐(差集)、订阅号推荐(差集+交集) 等等。
需要随机获取数据源中的元素的场景:抽奖系统、随机点名等等。
SADD key member1 member2 …:向指定集合添加一个或多个元素。
SPOP key count:随机移除并获取指定集合中一个或多个元素,适合不允许重复中奖的场景。
SRANDMEMBER key count : 随机获取指定集合中指定数量的元素,适合允许重复中奖的场景。
面试自行拓展
String 还是 Hash 存储对象数据更好呢?
String 存储的是序列化后的对象数据,存放的是整个对象。Hash 是对对象的每个字段单独存储,可以获取部分字段的信息,也可以修改或者添加部分字段,节省网络流量。如果对象中某些字段需要经常变动或者经常需要单独查询对象中的个别字段信息,Hash 就非常适合。String 存储相对来说更加节省内存,缓存相同数量的对象数据,String 消耗的内存约是 Hash 的一半。并且,存储具有多层嵌套的对象时也方便很多。如果系统对性能和资源消耗非常敏感的话,String 就非常适合。
使用 Redis 实现一个排行榜怎么做?
使用 Redis 实现一个排行榜可以采用以下步骤:
- 存储数据:可以使用 Redis 的 List 数据结构来存储排行榜数据。每个排行榜可以建立一个 List,将排名按照分数从高到低排序存储。
- 添加数据:可以使用 Redis 的 LPUSH 命令将新的排名数据添加到 List 中。例如,使用 LPUSH myrank 100 将分数为 100 的数据添加到名为 myrank 的排行榜中。
- 查询数据:可以使用 Redis 的 LRANGE 命令查询某个排行榜的部分排名数据。例如,使用 LRANGE myrank 0 10 WITHSCORES 可以查询名为 myrank 的排行榜中前 11 个排名及其分数。
- 更新数据:可以使用 Redis 的 LREM 命令更新某个排行榜中某个排名的数据。例如,使用 LREM myrank -1 98 可以将名为 myrank 的排行榜中分数为 98 的排名向下移动一位。
- 删除数据:可以使用 Redis 的 LREM 命令删除某个排行榜中某个排名的数据。例如,使用 LREM myrank -1 99 可以将名为 myrank 的排行榜中分数为 99 的排名删除。
通过以上步骤,可以使用 Redis 实现一个简单的排行榜功能。需要注意的是,在实际应用中还需要考虑数据的并发访问和安全问题。
Set 的应用场景
存放的数据不能重复的场景:网站 UV 统计(数据量巨大的场景还是 HyperLogLog更适合一些)、文章点赞、动态点赞等等。
需要获取多个数据源交集、并集和差集的场景:共同好友(交集)、共同粉丝(交集)、共同关注(交集)、好友推荐(差集)、音乐推荐(差集)、订阅号推荐(差集+交集) 等等。
需要随机获取数据源中的元素的场景:抽奖系统、随机点名等等。
SADD key member1 member2 …:向指定集合添加一个或多个元素。
SPOP key count:随机移除并获取指定集合中一个或多个元素,适合不允许重复中奖的场景。
SRANDMEMBER key count : 随机获取指定集合中指定数量的元素,适合允许重复中奖的场景。