redis有序集合
- 什么是redis有序集合?
- Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
- 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
- 有序集合的成员是唯一的,但分数(score)却可以重复。
- 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
示例
redis 127.0.0.1:6379> ZADD w3ckey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD w3ckey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE w3ckey 0 10 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
案例
有一批userId 需要异步脚本去跑数据,但是每个uid执行的时间是未来的某个时间,那么uid+time就是绑定在一起了,想性能最大化处理这个问题?不想每次获取全量数据在进行判断?
解决1:通过mysql,将数据与时间落表,再通过sql根据时间取出相对应的数据,数据量大的话,可定时归档或者清理老数据。
问题:多了张表,增加了维护成本
解决2:uid+time拼接成一个key,塞入redis,每次定时任务全量取出来,依次解开判断
问题:消耗性能
解决3:将uid+time存入redis有序集合,脚本获取时可以根据时间获取到对应的数据