Spring集成Redis

浅浅的花香味﹌ 2023-05-31 03:20 176阅读 0赞
  1. Spring-data-redisspring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。

​ spring-data-redis针对jedis提供了如下功能:

  1. 连接池自动管理,提供了一个高度封装的“RedisTemplate”类
  2. 针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
  3. ValueOperations:简单K-V操作
  4. SetOperations:set类型数据操作
  5. ZSetOperations:zset类型数据操作
  6. HashOperations:针对map类型的数据操作
  7. ListOperations:针对list类型的数据操作

一、引入依赖

  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>3.7.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.data</groupId>
  8. <artifactId>spring-data-redis</artifactId>
  9. <version>2.5.4</version>
  10. </dependency>
  11. 如果存储的是Map<String,Object>需要导入jackson相关的包,存储的时候使用json序列化器存储。如果不导入jackson的包会报错。
  12. <!-- springMVC支持json包-->
  13. <dependency>
  14. <groupId>com.fasterxml.jackson.core</groupId>
  15. <artifactId>jackson-databind</artifactId>
  16. <version>2.10.0</version>
  17. </dependency>

二、配置文件

(1) redis.properties

  1. #redis集群
  2. redis.host=192.168.147.128
  3. redis.port=6379
  4. #
  5. redis.host2=192.168.147.128
  6. redis.port2=6380
  7. #
  8. redis.host3=192.168.147.128
  9. redis.port3=6381
  10. #
  11. redis.host4=192.168.147.128
  12. redis.port4=6382
  13. # 注意,如果没有password,此处不设置值,但这一项要保留
  14. redis.password=
  15. #最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
  16. redis.maxIdle=300
  17. #连接池的最大数据库连接数。设为0表示无限制
  18. redis.maxActive=600
  19. #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
  20. redis.maxWait=1000
  21. #在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
  22. redis.testOnBorrow=true

(2)applicationContext-redis.xml

  1. <!-- 连接池基本参数配置,类似数据库连接池 -->
  2. <context:property-placeholder location="classpath:redis.properties"
  3. ignore-unresolvable="true" />
  4. <!-- redis连接池 -->
  5. <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
  6. <property name="maxTotal" value="${redis.maxActive}" />
  7. <property name="maxIdle" value="${redis.maxIdle}" />
  8. <property name="testOnBorrow" value="${redis.testOnBorrow}" />
  9. </bean>
  10. <!-- redis集群 -->
  11. <bean id="redisClusterConfiguration" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
  12. <property name="clusterNodes">
  13. <set>
  14. <bean class="org.springframework.data.redis.connection.RedisNode">
  15. <constructor-arg name="host" value="${redis.host}"></constructor-arg>
  16. <constructor-arg name="port" value="${redis.port}" />
  17. </bean>
  18. <bean class="org.springframework.data.redis.connection.RedisNode">
  19. <constructor-arg name="host" value="${redis.host2}"></constructor-arg>
  20. <constructor-arg name="port" value="${redis.port2}" />
  21. </bean>
  22. <bean class="org.springframework.data.redis.connection.RedisNode">
  23. <constructor-arg name="host" value="${redis.host3}"></constructor-arg>
  24. <constructor-arg name="port" value="${redis.port3}" />
  25. </bean>
  26. <bean class="org.springframework.data.redis.connection.RedisNode">
  27. <constructor-arg name="host" value="${redis.host4}"></constructor-arg>
  28. <constructor-arg name="port" value="${redis.port4}" />
  29. </bean>
  30. </set>
  31. </property>
  32. </bean>
  33. <!-- 连接池配置,类似数据库连接池 -->
  34. <bean id="jedisConnectionFactory"
  35. class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
  36. <constructor-arg name="clusterConfig" ref="redisClusterConfiguration"></constructor-arg>
  37. <constructor-arg name="poolConfig" ref="poolConfig"></constructor-arg>
  38. </bean>
  39. <!--redis操作模版,使用该对象可以操作redis -->
  40. <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
  41. <property name="connectionFactory" ref="jedisConnectionFactory" />
  42. <!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!! -->
  43. <property name="keySerializer" >
  44. <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
  45. </property>
  46. <property name="valueSerializer" >
  47. <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
  48. </property>
  49. <property name="hashKeySerializer">
  50. <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
  51. </property>
  52. <property name="hashValueSerializer">
  53. <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
  54. </property>
  55. <!--开启事务 -->
  56. <property name="enableTransactionSupport" value="true"></property>
  57. </bean >
  58. 如果在多个spring配置文件中引入<context:property-placeholder .../>标签,最后需要加上ignore-unresolvable="true",否则会报错。

(3)测试

  1. @Test
  2. public void test() {
  3. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-redis.xml");
  4. RedisTemplate redisTemplate = context.getBean("redisTemplate", RedisTemplate.class);
  5. // stringRedisTemplate的操作
  6. // String读写
  7. redisTemplate.delete("k1");
  8. redisTemplate.opsForValue().set("k1", "v1");
  9. System.out.println(redisTemplate.opsForValue().get("k1"));
  10. System.out.println("==============");
  11. // List读写
  12. redisTemplate.delete("l1");
  13. redisTemplate.opsForList().rightPush("l1", "1");
  14. redisTemplate.opsForList().rightPush("l1", "2");
  15. redisTemplate.opsForList().leftPush("l1", "3");
  16. List<String> listCache = redisTemplate.opsForList().range("l1", 0, -1);
  17. for (String s : listCache) {
  18. System.out.println(s);
  19. }
  20. System.out.println("==============");
  21. // Set读写
  22. redisTemplate.delete("s1");
  23. redisTemplate.opsForSet().add("s1", "A");
  24. redisTemplate.opsForSet().add("s1", "B");
  25. redisTemplate.opsForSet().add("s1", "C");
  26. Set<String> setCache = redisTemplate.opsForSet().members("s1");
  27. for (String s : setCache) {
  28. System.out.println(s);
  29. }
  30. System.out.println("===============");
  31. // Hash读写
  32. redisTemplate.delete("h1");
  33. redisTemplate.opsForHash().put("h1", "address1", "北京");
  34. redisTemplate.opsForHash().put("h1", "address2", "上海");
  35. redisTemplate.opsForHash().put("h1", "address3", "河南");
  36. Map<String, String> hashCache = redisTemplate.opsForHash().entries("h1");
  37. for (Map.Entry entry : hashCache.entrySet()) {
  38. System.out.println(entry.getKey() + "-" + entry.getValue());
  39. }
  40. System.out.println("===============");
  41. }

执行结果

" class="reference-link">watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMjk4MzUx_size_16_color_FFFFFF_t_70

如果本文对您有很大的帮助,还请点赞关注一下。

发表评论

表情:
评论列表 (有 0 条评论,176人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring集成redis

        sprig集成redis,我的项目架构是springMVC+spring+ibatis 用maven管理 ,下面看代码 1. 在pom文件引入redis依赖包

    相关 Spring集成Redis

    最近在做一个关于群聊的项目,由于聊天要求实时性,不可能直接访问数据库,所以使用了Redis来做缓存,这里将使用过程中遇到的问题记录一下。 使用Redis之前需要合理设计存储