2016 - 2024

感恩一路有你

redis缓存在什么情况下使用 redis属于哪一层?

浏览量:4785 时间:2023-06-01 14:23:13 作者:采采

redis属于哪一层?

Redis底层结构

redis 存储结构

redis的存储结构从外层往内层依次是redisDb、dict、dictht、dictEntry。

redis的Db默认情况下有16个,每个redisDb内部包含一个dict的数据结构。

redis的dict内部包含dictht的数组,数组个数为2,主要用于hash扩容使用。

dictht内部包含dictEntry的数组,可以理解就是hash的桶,然后如果通过挂链法解决

redis做消息队列还缓存消息吗?

一般不会,如果做消息队列,一般使用list,消息被消费方消费后,即lpop掉后,该消息就在内存中删除了。如果是缓存的话,一般不主动删除或过期,数据会一直存在。

为什么要用redis,redis有哪些优缺点?redis如何实现扩容?

Redis 与其他 key - value 缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数据的备份,即master-slave模式的数据备份。Redis 优势性能极高 C Redis能读的速度是110000次/s,写的速度是81000次/s 。丰富的数据类型 C Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。原子 C Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。丰富的特性 C Redis还支持 publish/subscribe, 通知, key 过期等等特性。

redis怎么缓存用户列表,做到可以分页展示?

普通分页

一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存有很多缺点。

如缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了。

比如像微博这样的场景,微博下面现在有一个顶次数的排序。这个用传统的分页很难应对。

一种思路

最近想到了另一种思路。

数据以ID为key缓存到Redis里;

把数据ID和排序打分存到Redis的skip list,即zset里;

当查找数据时,先从Redis里的skip list取出对应的分页数据,得到ID列表。

用multi get从redis上一次性把ID列表里的所有数据都取出来。如果有缺少某些ID的数据,再从数据库里查找,再一块返回给用户,并把查出来的数据按ID缓存到Redis里。

在最后一步,可以有一些小技巧:

比如在缺少一些ID数据的情况下,先直接返回给用户,然后前端再用ajax请求缺少的ID的数据,再动态刷新。

还有一些可能用Lua脚本合并操作的优化,不过考虑到Lua脚本比较慢,可能要仔细测试。

如果是利用Lua脚本的话,可以在一个请求里完成下面的操作:

查找某页的所有文章,返回已缓存的文章的ID及内容,还有不在缓存里的文章的ID列表。

其它的一些东东:

Lua是支持LRU模式的,即像Memcached一样工作。但是貌似没有见到有人这样用,很是奇怪。

可能是用redis早就准备好把redis做存储了,也不担心内存的容量问题。

数据 redis ID Redis 列表

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。