window下redis的常用命令、spring结合redis实现消息发布监听系统

     redis是近几年比较流行的基于内存的高性能key-value持久化非关系型数据库,redis也可与spring结合做异步消费发布监听系统

redis下载地址:

https://download.csdn.net/download/higherzjm/10762200

解压即可使用,点开redis-server.exe即做服务,点开redis-cli.exe即做客户端命令窗口

1 redis常用命令

1.1  info   获取Redis的相关信息

1.2 keys * 获取当前redis数据库中所有的key名称

1.3 select 1   切换数据库,1 是数据库索引

1.4 设置和获取普通的key-value值

       命令设置:  set name "Saturday"

      命令获取: get name

扫描二维码关注公众号,回复: 4902539 查看本文章

      使用Java设置:redisTemplate.opsForValue().set("name","sunday") (redisTemplate初始化方式后面会说明

      使用java获取:redisTemplate.opsForValue().get("name");

1.5 设置或获取set值

       命令设置:sadd set_123 aaaa bbbb cccc (set_123 是key名称

       命令获期:smembers set_123

       使用Java设置:redisTemplate.opsForSet().add("set_123", "set1","set2","set3")

       使用java获取:redisTemplate.opsForSet().members("set_123")

1.6 设置或获取list值

        命令设置:lpush mylist list1 list2 list3 (mylist 是key名称

       命令获期:lrange mylist 0 -1 (第二个数值表示结束的索引,如果为-1表示所有

       使用Java设置:redisTemplate.opsForList().leftPush("mylist ", String.valueOf(Arrays.asList("list1","list2","list3")) );

       使用java获取:redisTemplate.opsForList().leftPop("mylist ");

1.7 设置或获取lHash值(其实这边所说的hash值就是我们日常遇到的key-value键值对)    

       命令设置:hmset myhash k1 "v1" k2 "v2" (k1,k2是key名称

       命令获期:hmget myhash k1 k2(获取k1,k2键的值

       使用Java设置:             

          Map<String,String> map=new HashMap<>();

          map.put("key1","value1"); map.put("key2","value2");

          map.put("key3","value3"); map.put("key4","value4");

          redisTemplate.opsForHash().putAll("map",map);

      使用java获取:redisTemplate.opsForHash().entries("map")

    

2  redis 与spring结合实现消息发送监听系统

      消息发送监听系统主要spring结合redis异步推送消息到redis队列,并进行监听处理

   2.1 xml配置: 初始化redisTemplat和其他监听信息

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:redis="http://www.springframework.org/schema/redis"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
                            http://www.springframework.org/schema/redis http://www.springframework.org/schema/redis/spring-redis-1.0.xsd
                            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    <description>spring-data-redis配置</description>
    <util:properties id="redisConfig" location="classpath:redis.properties"  />
    <context:property-placeholder ignore-unresolvable="true" properties-ref="redisConfig"/>
    <context:component-scan base-package="com.j2ee.*" />
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="${redis.maxIdle}" />
        <property name="maxTotal" value="${redis.maxTotal}" />
        <property name="maxWaitMillis" value="${redis.maxWait}" />
        <property name="testOnBorrow" value="true" />
    </bean>
    <bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="usePool" value="true"/><!--是否使用连接池-->
        <property name="hostName" value="${redis.host}"/>
        <property name="port" value="${redis.port}"/>
        <property name="database" value="1" /><!--配置数据库名称-->
        <property name="timeout" value="${redis.timeout}" />
        <property name="poolConfig" ref="poolConfig"/><!--配置连接池-->
    </bean>

    <!--初始化redisTemplate-->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="redisConnectionFactory"/>
    </bean>
    <bean id="jdkSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
    
    <!--初始化监听bean-->
    <bean id="messageListener" class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter">
        <property name="delegate" ref="adapterMessageDelegateListener" /> <!--监听bean的依赖-->
        <property name="serializer" ref="jdkSerializer" /><!--系列化模式-->
    </bean>

    <redis:listener-container>
        <redis:listener ref="messageListener" method="handleMessage" serializer="jdkSerializer" topic="msgname"/>
    </redis:listener-container><!--messageListener:监听适配的bean;handleMessage:监听适配的方法,
                              msgname:监听的channel,必须与发送消息时设置的一样-->

</beans>

 redis.properties 

redis.host=127.0.0.1
#redis的服务端口
redis.port=6379
#客户端超时时间单位是毫秒
redis.timeout=100000
#最大连接数
redis.maxTotal=300
#最大空闲数
redis.maxIdle=100
#最大建立连接等待时间
redis.maxWait=1000
  
  2.2 从control实际运用
@Controller
@RequestMapping(value ="/send_redis_merssagecontroller")
public class Send_REDIS_MessageController {

    @Resource(name="redisTemplate")
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 
     * @param channel  监听的channel名称
     * @param message  监听的消息内容
     */
    public void sendMessage(String channel, Serializable message) {
        //channel消息监听名称必须与配置文件配置的一样
        redisTemplate.convertAndSend(channel, message);
    }
    //http://localhost:8080/repository2018_2/send_redis_merssagecontroller/sendmsg.do
    @RequestMapping(value = "sendmsg")
    @ResponseBody
    public  String sendMsg() {
        try {
            MessageVo messageVo = new MessageVo();
            messageVo.setDate("20171207");
            messageVo.setKey("tuofuwebservices");
            List<String> webmatids = new ArrayList<String>();
            webmatids.add("123");
            webmatids.add("456");
            Map<String, List<String>> webmaidmtaids = new HashMap<String, List<String>>();
            webmaidmtaids.put("1147", webmatids);
            messageVo.setWebsitematids(webmaidmtaids);

            //异步发送短信到redis队列
            sendMessage("msgname", messageVo);
            return "消息发送成功";
        }catch (Exception e){
            e.printStackTrace();
            return "消息发送失败";
        }

    }
}

   2.3 监听类

@Component("adapterMessageDelegateListener")
public class AdapterMessageDelegateListener {

    //监听Redis消息,监听方法名称需要与配置的一样
    public void handleMessage(Serializable message){
        System.out.println("消息监听----redis消息队列接收消息");
        if(message instanceof MessageVo){
            MessageVo messageVo = (MessageVo) message;//强制转化为发送的消息model
            System.out.println(messageVo.getKey()+":"+messageVo.getDate());
            Map<String,List<String>> webmatids= messageVo.getWebsitematids();
            for (Map.Entry<String,List<String>> data:webmatids.entrySet()){
                System.out.println(data.getKey());
                System.out.println(data.getValue());
            }

        }
    }

}

   model 类

public class MessageVo implements Serializable {
    private String key;
    private String date;
    private Map<String,List<String>>  websitematids;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public Map<String, List<String>> getWebsitematids() {
        return websitematids;
    }

    public void setWebsitematids(Map<String, List<String>> websitematids) {
        this.websitematids = websitematids;
    }
}

      以上讲的两部分内容更偏向于实际应用,因研究有限,原理性的东西没有进一步阐述,如阅读到此博文的博友们发现有讲得不到位,或讲错的部分,敬请谅解,同时麻烦指出来

猜你喜欢

转载自blog.csdn.net/higherzjm/article/details/83658953