问题背景
id放到
redis的
set中,与用户相关联的数据,都会基于这个数据范围进行迁移。
Java集合中的
contains方法.常用集合中
set和
map该
api的时间效率是
O(1),而
list的时间效率是
O(n)(使用的是遍历比较)。
smembers返回的
set在过滤效率上与
list基本没差别。
SetFromListpublic Set<String> smembers(final String key) {checkIsInMultiOrPipeline();client.smembers(key);final List<String> members = client.getMultiBulkReply();if (members == null) {return Collections.emptySet();}return SetFromList.of(members);}
SetFromList只是一个装饰器,虽然继承
AbstractSet但内部有个
list变量存储具体的数据。所有的操作都会转成对
list结构的操作。因此在性能、顺序性、并发等特性上,都与
list是一致的(典型的挂羊头卖狗肉


)jedis大部分返回
Set类型的
api,实际返回的都是
SetFromList。
new HashSet()进行转换。
redis客户端,如
SpringData RedisTemplate,该客户端在对返回数据进行序列化时,如果发现结果是
List类型,会转成
ArrayList返回,否则转成
LinkedHashSet。
// hashSet中的containspublic boolean contains(Object o) {return map.containsKey(o);}// hashMap的containsKeypublic boolean containsKey(Object key) {return getNode(hash(key), key) != null;}// arrayList的containspublic boolean contains(Object o) {return indexOf(o) >= 0;}// indexOf会进行顺序遍历// 然后再判断对应值是否相等public int indexOf(Object o) {if (o == null) {for (int i = 0; i < size; i++)if (elementData[i]==null)return i;} else {for (int i = 0; i < size; i++)if (o.equals(elementData[i]))return i;}return -1;}
基础扎实,遇事不慌。
文章转载自菜鸟问路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




