redis 存储数据五大数据类型: 分别为String List HashMap Set ZSet
1 String
使用场景可以很丰富,json数据可以存入,那么其实再不考虑性能的情况下,此种数据类型兼容了各种数据;
使用方法也很简单,直接set,然后可以设置过期时间等,过期时间很重要,它可以实现例如,订单超时,分布式锁等,防止由于reids服务挂掉而使得应该过期的key未被程序删除,而造成业务逻辑混乱
2 List
使用场景一般是用来存储多个简单数据; 还可以用来做类似任务队列的一个工具;
使用方法如下
/**
* @Description list的优势在于,可以模拟一个双向队列,甚至可以用来做任务/消息队列等
* @Author FL
* @Date 11:33 2022/4/24
* @Param []
**/
@Test
void redisList(){
String list_key = "list_key";
//remove(K key, long count, Object value)
// 从存储在键中的列表中删除等于值的元素的第一个计数事件。count> 0:
// 删除等于从左到右移动的值的第一个元素;count< 0:删除等于从右到左移动的值的第一个元素;
// count = 0:删除等于value的所有元素。
// redisTemplate.opsForList().remove(list_key,-1,3);
redisTemplate.opsForList().leftPush(list_key,1);
redisTemplate.opsForList().leftPush(list_key,2);
redisTemplate.opsForList().leftPushAll(list_key,Arrays.asList(3,4,5));
System.out.println(redisTemplate.opsForList().rightPop(list_key));
List range = redisTemplate.opsForList().range(list_key, 0, -1);
System.out.println("==========");
for (Object o : range) {
System.out.println(o);
}
}
3 HashMap
使用场景的话,个人认为更适合存储对象,对比String类型的数据,优势明显;
例如存储为一个用户对象,我想更改对象的最后登录时间,那么Sting,需要进行序列化,然后设置值,再次序列化存储到redis中,而HashMap则可以直接获取到相应的字段,修改,减少了两次io操作,可以提高下性能
/**
* @Description redis的Map类型存储的优点是 在修改信息的时候,可以直接修改,相对于
* String 类型的存储, String类型需要序列化,修改后并反序列化回去,hashmap减少了io,增加了redis的性能
* @Author FL
* @Date 10:59 2022/4/24
* @Param []
**/
@Test
void redisMap() {
String mapKey = "mapkey";
Area area = new Area();
area.setCode("1111");
area.setName("名称");
area.setExtend("扩展");
Map<String, Object> hk = BeanUtil.beanToMap(area);
redisTemplate.opsForHash().putAll(mapKey, hk);
redisTemplate.opsForHash().put(mapKey, "code", "222");
System.out.println(redisTemplate.opsForHash().get(mapKey, "code"));
Set<Map.Entry<String, Object>> entrySet = hk.entrySet();
List<String> collect = entrySet.stream().map(Map.Entry::getKey).collect(Collectors.toList());
System.out.println(redisTemplate.opsForHash().multiGet(mapKey, collect));
redisTemplate.opsForHash().delete(mapKey, "id");
// Set keys = redisTemplate.boundHashOps(mapKey).keys();
// List values = redisTemplate.boundHashOps(mapKey).values();
// for (Object key : keys) {
// System.out.println(key);
// }
// for (Object value : values) {
// System.out.println(value);
// }
}
4 Set
应用场景例如数据去重,还有可以获取两个集合的差集,或者交集等
/**
* @Description 自带数据去重,可以取两个集合的差集,交集
* @Author FL
* @Date 11:51 2022/4/24
* @Param []
**/
@Test
void redisSet(){
String set_key1 = "set_key1";
String set_key = "set_ke";
redisTemplate.opsForSet().add(set_key,1);
redisTemplate.opsForSet().add(set_key,2);
redisTemplate.opsForSet().add(set_key,3);
redisTemplate.opsForSet().add(set_key1,4);
redisTemplate.opsForSet().add(set_key1,2);
redisTemplate.opsForSet().add(set_key1,3);
// Set members = redisTemplate.opsForSet().members(set_key);
// for (Object member : members) {
// System.out.println(member);
// }
// 取交集
Set difference = redisTemplate.opsForSet().intersect(set_key, set_key1);
for (Object o : difference) {
System.out.println(o);
}
}
5 ZSet
应用场景与set类似,不过增加了对于数据的排序功能
/**
* @Description zset,去重,然后可以根据分数(权重),进行一个排序
* @Author FL
* @Date 10:40 2022/4/25
* @Param []
**/
@Test
void redisZSet(){
String zset_key = "zset_key";
redisTemplate.opsForZSet().add(zset_key, 100,10);
redisTemplate.opsForZSet().add(zset_key, 101,12);
redisTemplate.opsForZSet().add(zset_key, 102,8);
Set set = redisTemplate.opsForZSet().reverseRange(zset_key, 0, 20);
for (Object o : set) {
System.out.println(o);
}
}
具体代码在 test项目中
本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。