Redis存储文章点击量,string类型和hash类型用哪种比较好

发布网友

我来回答

2个回答

热心网友

如果只是通过文章id进行点击量的存取和自增操作的话,string涉及的操作有set,get和incr。hash涉及到的操作有hget,hset,hincr操作。这些操作的时间复杂度都是O(1)的,所以不用太担心存取性能,反而大量string相较于hash来说要更加浪费内存,所以推荐使用hash。一次查询多个文章id的话,hmget相对于mget也要有优势(例如Jedis客户端分片,多个节点的话,不同的key可能存放在不同的节点中,无法直接用mget,只能用管道查询)。

不过如果只是以上这些操作的话,不明白题主为什么要把访问量单独存储到一个hash中,完全可以通过存成以文章为主体的结构,例如:
key = article:1
fields = like_count, view_count, comment_count
values = 10, 10, 10

如果真的必须将所有访问量存放在同一个hash的话,有可能是为了方便持久化到数据库。也就是先通过redis进行自增,然后定时将数据从redis同步到mysql中,避免mysql的并发和锁问题。这样的话就需要知道在这一时间段哪些文章的访问量发生了改变,然后进行update的操作,才需要将访问量和文章id单独存放在hash中。例如:
key = view_count_hash
fields = article:1, article:2. article:3
values = 5, 10, 20

这时就需要想办法避免在fields比较多的时候,hkeys占用较长的时间,可以通过将用户id取模分片,存储在不同的hash中,或是减少同步的间隔时间,并在间隔后删掉对应的fields。

如果题主不需要这样做的话,还是建议分开存放在以文章为主体的结构中。

热心网友

当分片索引不是纯整型的字符串时,只接受整型的内置 hash 算法是无法使用的。为此,stringhash 按照用户定义的起点和终点去截取分片索引字段中的部分字符,根据当中每个字符的二进制 unicode 值换算出一个长整型数值,然后就直接调用内置 hash 算法求解分片路由:先求模得到逻辑分片号,再根据逻辑分片号直接映射到物理分片。


声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com