由于文章出处还得花积分币来下载,所以转出来,希望有用到的朋友
首先的首先澄清一个对初学者非常容易混淆的概念!
不要试图使用泛型Java集合,例如RedisTemplate<Key,Collection<?>>,这种用法等价于在jvm把Collection<?>序列化成字节数组,以value的形式保存到redis中,很显然,这种方法非常低效,不仅存在大量的序列化反序列化操作,并且每次操作集合都要首先获取一个完整的集合(包含所有的元素)。正确的方法是使用redis提供的集合类型,例如List,Set,ZSet(Sorted Set)和Map,详细请看以下章节。
如果你在RedisTemplate的泛型中用到了Java集合类型,那明显你做错了!如果你还是不明白错在哪里,请立刻停下手上的工作,找其他同事深入了解原因。
1.Operations相关
opsForXXX和boundXXXOps的区别? XXX为value的类型,前者获取一个operator,但是没有指定操作的对象(key),可以在一个连接(事务)内操作多个key以及对应的value;后者获取了一个指定操作对象(key)的operator,在一个连接(事务)内只能操作这个key对应的value。
关于计数的API(increment)有一个bug,需要各位使用中注意,通过increment计数以后,通过get方式获取计数值的时候可能会抛出EOF异常(和本地的jdk以及redis的编译版本有关),可以考虑使用boundValueOps(key).get(0,-1)获取计数值。
2.ValueOperations和BoundValueOperations 相关
ValueOperations valueOperations = redisTemplate.opsForValue;
BoundValueOperations boundValueOperations = redisTemplate.boundValueOps(key);
类:ValueOperations 等价理解成:Map<Object,Object>
方法:set(key,value) 保存
解释:
key:为保存时的主键
value:为你要保存的Object。
等价理解成:
Map<Object,Object> map = new HashMap<Object,Object>();
map.put(key,value)。
代码:redisTemplate.opsForValue().set(AD_KEY_PREFIX + ad.getId(), ad)。
用处:Mercury项目中,所有可用的广告实体都通过此方法存放在redis中。
方法:get(key) 获取
解释:
key:为保存时候的主键,返回一个Object对象。
等价理解成: Map<Object,Object> map = set(key,value)保存时候的map;
Object object = map.get(key);
代码:edisTemplate.opsForValue().get(AD_KEY_PREFIX + ad.getId());
用处:Mercury项目中,根据广告的id获取某一款广告
类:BoundValueOperations 理解:对保存的值做一些细微的操作,例如对某一个值的操作等。
3.ListOperations和BoundListOperations相关
ListOperations listOperations = redisTemplate.opsForList();
BoundListOperations boundListOperations = redisTemplate.boundListOps(key);
类:ListOperations 等价理解成:List<Object>
类:BoundListOperations 等价理解成:对保存的值做一些细微的操作。
4.SetOperations和BoundSetOperations 相关
SetOperations setOperations = redisTemplate.opsForSet();
BoundSetOperations boundSetOperations = redisTemplate.boundSetOps(key);
类:SetOperations 等价理解成:Set<Object>
方法:add(key,value) 添加
解释:
key:保存Set的主键
value:向Set中添加一个值。
等价理解成:
Map<Object,Set<Object>> map = new HashMap<Object,Set<Object>>();
Set<Object> set = new HashSet<Object>();
map.put(key,set);
Set<Object> set = map.get(key);
set.add(value);
代码:
redisTemplateSet.opsForSet().add(ALL_AVAILABLE_ADIDS_NORMAL, AD_KEY_PREFIX + ad.getId());
用处:Mercury项目往广告清单中添加广告。
方法:members(key) 获取
解释:key:保存Set的主键
等价理解成:
Map<Object,Set<Object>> map = add(key,value)方法添加时候的map;
Set<Object> set = map.get(key);
代码:redisTemplateSet.opsForSet().members(ALL_AVAILABLE_ADIDS_NORMAL);
用处:Mercury项目获取某一个广告清单
方法:intersect(key,otherKey) 取两个Set的交集
解释:
key:保存Set的主键
otherKey:保存另一个Set的主键
下图阴影的部分为该方法的返回值:
方法:difference(key, otherKey) 取两个Set的补集
解释:
key:保存Set的主键
otherKey:保存另一个Set的主键
下图阴影的部分为该方法的返回值:
方法:difference(key, otherKey) 取两个Set的补集
解释:
key:保存Set的主键
otherKey:保存另一个Set的主键
下图阴影的部分为该方法的返回值:
5.ZSetOperations和BoundZSetOperations相关
ZSetOperations zsetOperations = redisTemplate.opsForZSet();
BoundZSetOperations boundZSetOperations = redisTemplate.boundZSetOps(key);
类:ZSetOperations 等价理解成:可排序的Set<Object>
方法:add(key, value, score); 添加
解释:key:保存Set的主键 value:向Set中添加一个值 score:这个值在这个Set中的权重,以后这个Set可以根据权重进行排序,分为以下几种情况:
根据权重从小到大的排序
根据权重从小到大的排序
选出权重在某一个范围内的实体排序等等6.HashOperations和BoundHashOperations
HashOperations hashOperations = redisTemplate.opsForHash(); BoundHashOperations boundHashOperations = redisTemplate.boundHashOps(key);
7.其他
删除redis中某一个key redisTemplate.delete(key);