版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27409289/article/details/89882976
因为项目上需要用到redis缓存数据,并且量很大,但是频繁的单个获取或者插入非常消耗redis的性能,所以考虑是用hash结构的数据来做,并且使用批量的方式.
使用hash的优点:
1 数据可以类似于组的方式存储起来,并且也可以通过数据的唯一key值获取数据,这样获取同一类型的数据(组)和单个数据都是 非常方便的
2 适合存储对象
3 使用批量存储快
项目中集成的是 spring-data-redis看下相关的方法,发现没有提供批量存入数据的方法,只有putAll()方法和put()方法,
前者不支持获取单个组下面的数据,后者只能一个一个的存储,效率低下影响性能。
后面发现可以通过executePipelined(管道)进行批量存储并且也可以通过key获取单个对象的数据
话不多说上代码
批量存:
redisTemplate.executePipelined(new RedisCallback<List<CityModel>>() { @Override public List<CityModel> doInRedis(RedisConnection connection) throws DataAccessException { for (CityModel cityModel : cityModels.subList(0,10)) { connection.hSet( STORE_CITY_INFO.getBytes(),cityModel.getCityID().toString().getBytes(), JSONHelper.toJson(cityModel).getBytes()); } return null; } });
通过游标获取(每次读取长度个匹配数据规则):
Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan(STORE_CITY_INFO, ScanOptions.scanOptions().count(1000).match("匹配规则").build()); while (cursor.hasNext()){ Map.Entry<Object,Object> entry = cursor.next(); System.out.println("通过scan(H key, ScanOptions options)方法获取匹配键值对:" + entry.getKey() + "---->" + entry.getValue()); }
获得hash中单个key
redisTemplate.opsForHash().get(STORE_CITY_INFO,"key");
这样就实现了批量的读取和单个取