jedis的使用,spring整合redis,springboot整合redis


  1. java使用redis

很簡單,看我的github的例子就行

  1. spirng整合redis,這里用xml配置方式實現

2.1導包

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-redis</artifactId>
  <version>1.0.2.RELEASE</version>
</dependency>
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>2.1.0</version>
</dependency>

2.2配置applicationContext.xml

Spring提供了很多序列化器

Jackson2JsonRedisSerializer

JdkSerializationRedisSerializer

OxmSerializer

StringRedisSerializer

GenericToStringRedisSerializer

GenericJackson2JsonRedisSerializer

 

<!--redisconfig-->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <property name="maxIdle" value="50" />
    <property name="maxActive" value="100" />
    <property name="maxWait" value="6000"/>
</bean>
<!--rdis連接工廠-->
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="hostName" value="localhost" />
    <property name="port" value="6379" />
    <property name="poolConfig" ref="poolConfig" />
</bean>

<!--string jdk序列化器-->
<bean id="jdkSerializationRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />

<!--配置redisTemplate-->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
    <property name="connectionFactory" ref="connectionFactory" />
    <!--keyvalue的序列化方式常用string或者jdk-->
   
<property name="keySerializer" ref="stringRedisSerializer" />
    <property name="valueSerializer" ref="stringRedisSerializer" />
</bean>

2.3測試

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
        "applicationContext.xml");
RedisTemplate redisTemplate = applicationContext
        .getBean(RedisTemplate.class);

2.4   StringRedisTemplete和RedisTemplete的區別

StringRedisTemplete繼承RedisTemplete,內部使用string序列化器,所以適合操作key和value都是string的數據

 

3 Spring中發布訂閱

3.1首先提供接收消息的類,它將實現 org.springframework.data.redis.connection.MessageListener 接口,並實現接口定義的方法 public void onMessage(Message message,byte[]pattern)

/*** imports ***/

  1. public class RedisMessageListener implements MessageListener {
  2.     private RedisTemplate redisTemplate;
  3.  
  4.     /*** 此處省略redisTemplate的 setter和getter方法 ***/
  5.     @Override
  6.     public void onMessage(Message message, byte[] bytes) {
  7.         // 獲取消息
  8.         byte[] body = message.getBody();
  9.         // 使用值序列化器轉換
  10. 10.         String msgBody = (String) getRedisTemplate().getValueSerializer()
  11. 11.                 .deserialize(body);
  12. 12.         System.err.println(msgBody);
  13. 13.         // 獲取 channel
  14. 14.         byte[] channel = message.getChannel();
  15. 15.         // 使用字符串序列化器轉換
  16. 16.         String channelStr = (String) getRedisTemplate().getStringSerializer()
  17. 17.                 .deserialize(channel);
  18. 18.         System.err.println(channelStr);
  19. 19.         // 渠道名稱轉換
  20. 20.         String bytesStr = new String(bytes);
  21. 21.         System.err.println(bytesStr);
  22. 22.     }

23. }

3.2.在spring中配置自定義的監聽器

<!--配置redis監聽器-->
<bean id="messageListener" class="com.zy.listener.RedisMessageListener">
    <property name="stringRedisSerializer" ref="stringRedisSerializer"/>
    <property name="jdkSerializationRedisSerializer" ref="jdkSerializationRedisSerializer"/>
</bean>
3.3 要給一個監聽容器,在 Spring 中已有類 org.springframework.data.redis.listener.RedisMessageListenerContainer。它可以用於監聽 Redis 的發布訂閱消息,下面的配置就是為了實現這個功能,讀者可以通過注釋來了解它的配置要點。

<!--配置redis監聽器container-->
<!--
配置線程池-->
<bean id="poolTaskScheduler"
        class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
    <property name="poolSize" value="3" />
</bean>
<!--配置容器,topic是監聽的通道的名稱,自定義的-->
<redis:listener-container connection-factory="connectionFactory" task-executor="poolTaskScheduler" topic-serializer="stringRedisSerializer">
    <redis:listener ref="messageListener" method="onMessage" topic="chat" serializer="stringRedisSerializer"/>
</redis:listener-container>

3.4 測試,像chat通道發送消息

  1. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  2. RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class);
  3. String channel = "chat";
  4. redisTemplate.convertAndSend(channel, "I am lazy!!");

4 springboot整合redis

4.1新建springboot項目,勾選上redis

 4.2配置application.yml

        spring:
  redis:
    host: 127.0.0.1
    port: 6379
    jedis:
      pool:
        max-active: 100
        max-idle: 10
        max-wait: 20000
    lettuce:
      shutdown-timeout: 1000

4.2 配置redis的配置類

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(stringRedisSerializer());
        redisTemplate.setValueSerializer(jdkSerializationRedisSerializer());
        return redisTemplate;
    }
   
    @Bean
    public StringRedisSerializer stringRedisSerializer(){
        return new StringRedisSerializer();
    }
    @Bean
    public JdkSerializationRedisSerializer jdkSerializationRedisSerializer(){
        return new JdkSerializationRedisSerializer();
    }
}

4.3 測試

@SpringBootTest
class SpringbootRedisApplicationTests {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
    @Test
    void contextLoads() {
        redisTemplate.opsForValue().set("myname","zhouyang");
        String myname = (String)redisTemplate.opsForValue().get("myname");
        System.out.println(myname);
    }

}

4.4 配置訂閱發布

 4.4.1新建類實現MessageListener

        public class MyRedisMessageListener implements MessageListener {
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    @Override
    public void onMessage(Message message, byte[] bytes) {
        // 獲取消息
              
byte[] body = message.getBody();
               // 使用值序列化器轉換
                  
String msgBody = (String) redisTemplate.getValueSerializer()
                           .deserialize(body);
                System.err.println(msgBody);
                   // 獲取 channel
                  
byte[] channel = message.getChannel();
                   // 使用字符串序列化器轉換
              
String channelStr = (String) redisTemplate.getStringSerializer()
                           .deserialize(channel);
                System.err.println(channelStr);
                // 渠道名稱轉換
              
String bytesStr = new String(bytes);
               System.err.println(bytesStr);

    }
}

4.4.2 配置redisConfig,把messageListener和containner放入容器中

@Bean
public MyRedisMessageListener myRedisMessageListener(){
    return new MyRedisMessageListener();
}
@Bean
public RedisMessageListenerContainer  redisMessageListenerContainer (RedisConnectionFactory redisConnectionFactory){
    RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
    redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
    redisMessageListenerContainer.addMessageListener(myRedisMessageListener(),new PatternTopic("chat"));
    return redisMessageListenerContainer;
}

4.4.3測試

@Test
void testPublish() {
    redisTemplate.convertAndSend("chat","我是周揚");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM