经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Redis » 查看文章
java 用redisTemplate 的 Operations存取list集合操作
来源:jb51  时间:2021/8/4 13:35:04  对本文有异议

java redisTemplate 的 Operations存取list集合

一 、存取为list类型

  1. @RestController
  2. @RequestMapping("/test")
  3. @Slf4j
  4. public class TestController {
  5. @Autowired
  6. private RedisTemplate redisTemplate;
  7. @ApiOperation("redis-savelist")
  8. @PostMapping("/redis/save/list")
  9. public void redisSaveList() {
  10. List<Person> list = getPersonList();
  11. //清空
  12. while (redisTemplate.opsForList().size("oowwoo") > 0){
  13. redisTemplate.opsForList().leftPop("oowwoo");
  14. }
  15. //存储
  16. redisTemplate.opsForList().rightPushAll("oowwoo", list);
  17. //取出
  18. List<Person> oowwoo = redisTemplate.opsForList().range("oowwoo", 0, -1);
  19. log.info(">>>>>>>>>>>>>>>list = {}", oowwoo.toString());
  20. Iterator<Person> it = oowwoo.iterator();
  21. while(it.hasNext()){
  22. Person p = it.next();
  23. log.info("person = {}", p.toString());
  24. }
  25. }
  26. private List<Person> getPersonList() {
  27. Person p1 = new Person();
  28. p1.setId(1L);
  29. p1.setName("张一");
  30. p1.setAge(11);
  31. Person p2 = new Person();
  32. p2.setId(2L);
  33. p2.setName("张二");
  34. p2.setAge(22);
  35. Person p3 = new Person();
  36. p3.setId(3L);
  37. p3.setName("张三");
  38. p3.setAge(33);
  39. List<Person> list = new ArrayList<>();
  40. list.add(p1);
  41. list.add(p2);
  42. list.add(p3);
  43. return list;
  44. }
  45. }

二 、将list转为json对象存取

  1. import com.alibaba.fastjson.JSON;
  2. import com.alibaba.fastjson.JSONObject;
  3. @Autowired
  4. private StringRedisTemplate stringRedisTemplate;
  5. //存
  6. List<Long> businessIdList = eeFreecarriageShopService.selectBusinessIdInPromotion();
  7. stringRedisTemplate.opsForValue().set(RedisConstants.FREECARRIAGE_BUSINESSIDLIST, JSON.toJSON(businessIdList).toString());
  8. //取
  9. String businessJsonArray = stringRedisTemplate.opsForValue().get(RedisConstants.FREECARRIAGE_BUSINESSIDLIST);
  10. List<Long> businessIdList = JSONObject.parseArray(businessJsonArray, Long.class);

redis在java中的使用,基本存取操作(RedisTemplate)

redis

REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

RedisTemplate

spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的 api。

StringRedisTemplate与RedisTemplate

两者的关系是StringRedisTemplate继承RedisTemplate。

两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。

SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

set void set(K key, V value);

使用:redisTemplate.opsForValue().set("name","tom");

结果:redisTemplate.opsForValue().get("name") 输出结果为tom

set void set(K key, V value, long timeout, TimeUnit unit);

使用:redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);

结果:redisTemplate.opsForValue().get("name")由于设置的是10秒失效,十秒之内查询有结果,十秒之后返回为null

这里只讨论对string数据的使用,附上一个小demo

首先需要导入相关的依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

序列化,序列化是为了方便数据传输

这里提供两种序列化封装操作:

第一种

  1. @Service
  2. public class TokenServiceTask {
  3. public static final String ONLINE_OPERRATOR = "";
  4. /**
  5. * redis序列化存储
  6. *
  7. * @param redisTemplate
  8. */
  9. @SuppressWarnings({"rawtypes", "unchecked"})
  10. @Autowired(required = false)
  11. public void setRedisTemplate(RedisTemplate redisTemplate) {
  12. RedisSerializer stringSerializer = new StringRedisSerializer();
  13. redisTemplate.setKeySerializer(stringSerializer);
  14. redisTemplate.setValueSerializer(stringSerializer);
  15. redisTemplate.setHashKeySerializer(stringSerializer);
  16. redisTemplate.setHashValueSerializer(stringSerializer);
  17. this.redisTemplate = redisTemplate;
  18. }
  19. @Resource
  20. private RedisTemplate<String, String> redisTemplate;
  21. public void setToken(String key, String token) {
  22. ValueOperations<String, String> value = redisTemplate.opsForValue();
  23. value.set(ONLINE_OPERRATOR + key, token);
  24. }
  25. public void setTokenWithTime(String key, String token, long number, TimeUnit timeUnit) {
  26. ValueOperations<String, String> value = redisTemplate.opsForValue();
  27. value.set(ONLINE_OPERRATOR + key, token, number, timeUnit);
  28. }
  29. public void freshTime(String key) {
  30. redisTemplate.expire(key, 1800, TimeUnit.SECONDS);
  31. }
  32. public String getToken(String key) {
  33. return redisTemplate.boundValueOps(key).get();
  34. }
  35. }

第二种

  1. @Configuration
  2. @EnableCaching //启用缓存,这个注解很重要;
  3. public class RedisCacheConfig extends CachingConfigurerSupport {
  4. /**
  5. * 缓存管理器.
  6. * @param redisTemplate
  7. * @return
  8. */
  9. @Bean
  10. public CacheManager cacheManager(RedisTemplate<?,?> redisTemplate) {
  11. CacheManager cacheManager = new RedisCacheManager(redisTemplate);
  12. return cacheManager;
  13. }
  14. /**
  15. * redis模板操作类,类似于jdbcTemplate的一个类;
  16. *
  17. * 虽然CacheManager也能获取到Cache对象,但是操作起来没有那么灵活;
  18. *
  19. * 这里在扩展下:RedisTemplate这个类不见得很好操作,我们可以在进行扩展一个我们
  20. *
  21. * 自己的缓存类,比如:RedisStorage类;
  22. *
  23. * @param factory : 通过Spring进行注入,参数在application.properties进行配置;
  24. * @return
  25. */
  26. @Bean
  27. public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
  28. RedisTemplate<String,String> redisTemplate = new RedisTemplate<String, String>();
  29. redisTemplate.setConnectionFactory(factory);
  30. //key序列化方式;(不然会出现乱码;),但是如果方法上有Long等非String类型的话,会报类型转换错误;
  31. //所以在没有自己定义key生成策略的时候,以下这个代码建议不要这么写,可以不配置或者自己实现ObjectRedisSerializer
  32. //或者JdkSerializationRedisSerializer序列化方式;
  33. RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型不可以会出现异常信息;
  34. redisTemplate.setKeySerializer(redisSerializer);
  35. redisTemplate.setHashKeySerializer(redisSerializer);
  36. return redisTemplate;
  37. }
  38. }

接下来上操作

  1. public void test01() {
  2. redisTemplate.opsForValue().set("chenlianghongtest","chenlianghong",30, TimeUnit.SECONDS);
  3. String test = redisTemplate.opsForValue().get("chenlianghongtest");
  4. System.out.println(test);
  5. logger.info("牛啊牛啊");
  6. }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号