Redisはspringboot構成と組み合わせて、redisは非同期(メッセージキューのような)操作を実現します.(学習ノート)

108655 ワード

Redisはオープンソース(BSDライセンス)で、メモリに格納されたデータ構造サーバであり、データベース、キャッシュ、メッセージキューエージェントとして使用できます.文字列、ハッシュテーブル、リスト、集合、秩序集合、ビットマップ、hyperlogsなどのデータ型をサポートします.レプリケーション、luaスクリプト、LRUリサイクリング、さまざまなレベルのディスク持続化機能を内蔵し、Redis Centinelで高可用性を提供し、Redis Clusterで自動パーティションを提供します.
Redisのメリット
  • の性能は極めて高い:Redisの読み取り速度は11万回毎秒、書き込み速度は8.1万回毎秒である.
  • 豊富なデータ型:RedisはバイナリケースのStrings,Lists,Hashes,SetsおよびOrdered Setsデータ型操作をサポートする.
  • 原子:Redisのすべての操作は原子的であり、同時にRedisはいくつかの操作の完全な並列後の原子的実行をサポートする.
  • 豊富な機能:Redisはpublish/subscribe、通知、keyの期限切れなどの機能もサポートしています.

  • Redisコマンド(ローカルまたはリモートに接続)
    redisクライアントを起動し、端末を開き、コマンドredis-cliを入力します.このコマンドは、ローカルのredisサービスに接続されます.
    $redis-cli
    redis 127.0.0.1:6379>
    redis 127.0.0.1:6379> PING
    

    リモート・サービスでのコマンドの実行
    $redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
    redis 127.0.0.1:6379>
    redis 127.0.0.1:6379> PING
    

    Redisキー
    DELはコマンドで、w 3 ckeyはキーです.キーの削除に成功した場合、コマンド実行後に1を出力します.そうしないと0を出力します.
    redis 127.0.0.1:6379> SET w3ckey redis
    OK
    redis 127.0.0.1:6379> DEL w3ckey
    (integer) 1
    

    Redisキー
    シーケンス番号
    コマンドと説明
    1
    DEL keyこのコマンドは、keyが存在する場合にkeyを削除するために使用されます.
    2
    DUMP keyは、所与のkeyをシーケンス化し、シーケンス化された値を返す.
    3
    EXISTSキーは、所与のキーが存在するかどうかをチェックします.
    4
    EXPIRE key secondsは、所与のkeyの有効期限を設定します.
    5
    EXPIREAT key timestamp EXPIREATの役割はEXPIREと同様で、keyの有効期限を設定するために使用されます.異なる点は、EXPIREATコマンドが受け入れる時間パラメータがUNIXタイムスタンプ(unix timestamp)であることである.
    6
    PEXPIRE key milliseconds設定keyの有効期限はミリ秒で1億ドルです.
    7
    PEXPIREAT key milliseconds-timestampキーの有効期限をミリ秒単位で設定
    8
    KEYS patternは、所与のモード(pattern)に適合するすべてのkeyを検索する.
    9
    MOVE key dbは、現在のデータベースのkeyを所定のデータベースdbに移動する.
    10
    PERSIST keyはkeyの期限切れを除去し、keyは持続的に維持されます.
    11
    PTTL keyは、keyの残りの有効期限をミリ秒単位で返します.
    12
    TTL keyは秒単位で所与のkeyの残存生存時間(TTL,time to live)を返す.
    13
    RANDOMKEYは、現在のデータベースからランダムにキーを返します.
    14
    RENAME key newkey修正keyの名前
    15
    RENAMENX key newkeyは、newkeyが存在しない場合にのみ、keyをnewkeyと改名する.
    16
    TYPE keyは、keyが格納した値のタイプを返します.
    その他:公式サイトhttp://www.redis.net.cn/tutorial/3509.html
    义齿
  • Maven依存
  •        
            
                org.springframework.boot
                spring-boot-starter-data-redis
                
                    
                        redis.clients
                        jedis
                    
                    
                        io.lettuce
                        lettuce-core
                    
                
            
            
            
                redis.clients
                jedis
                2.9.0
            
    

    2.プロファイルyml
      ## redis    
      redis:
        database: 0
        host: 127.0.0.1
        password: jijl
        port: 6380
        timeout: 6000ms  #       (  )
        jedis:
          pool:
            max-active: 1000  #         (          )
            max-wait: -1ms      #            (          )
            max-idle: 10      #            
            min-idle: 5       #            
    

    3.redisのプロファイルは后のコードの中で、1つのredisのツールクラスを书いて、ここでプロジェクトの中のコードを摘用してソースコードを通じて知ることができて、SpringBootは自动的に私达に容器の中で1つのRedisTemplateと1つのStringRedisTemplateを生成しました.このRedisServiceはSpringコンテナにインスタンス化され,使用時に直接注記注入される.
     package com.laiganhlj.dlc.common.redis;
    
    
    import com.laiganhlj.dlc.common.result.SysConstant;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisConnectionUtils;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Component;
    import org.springframework.util.CollectionUtils;
    
    import java.io.Serializable;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @Author: jijl
     * @Description: redis   
     * @Date: 2018/7/2 16:53
     **/
    @Slf4j
    @Component
    public class RedisService {
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        public void redisColse() {
            RedisConnectionUtils.unbindConnection(redisTemplate.getConnectionFactory());
        }
        //=============================common============================
    
        /**
         *         
         *
         * @param key   
         * @param time   ( )
         * @return
         */
        public boolean expire(String key, long time) {
            try {
                if (time > 0) {
                    redisTemplate.expire(key, time, TimeUnit.SECONDS);
                }
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    
        /**
         *   key       
         *
         * @param key      null
         * @return   ( )   0       
         */
        public long getExpire(String key) {
            long timeOut = redisTemplate.getExpire(key, TimeUnit.SECONDS);
            redisColse();
            return timeOut;
        }
    
        /**
         *   key    
         *
         * @param key  
         * @return true    false   
         */
        public boolean hasKey(String key) {
            boolean flag = false;
            try {
                flag = redisTemplate.hasKey(key);
            } catch (Exception e) {
                e.printStackTrace();
                flag = false;
            } finally {
                redisColse();
                return flag;
            }
        }
    
        /**
         *     
         *
         * @param key           
         */
        @SuppressWarnings("unchecked")
        public void del(String... key) {
            if (key != null && key.length > 0) {
                if (key.length == 1) {
                    redisTemplate.delete(key[0]);
                } else {
                    redisTemplate.delete(CollectionUtils.arrayToList(key));
                }
            }
            redisColse();
        }
    
        //============================String=============================
    
        /**
         *       
         *
         * @param key  
         * @return  
         */
        public Object get(String key) {
            Object o = redisTemplate.opsForValue().get(key);
            redisColse();
            return o;
        }
    
        /**
         *       
         *
         * @param key    
         * @param value  
         * @return true   false  
         */
        public boolean set(String key, Object value) {
            boolean flag = false;
            try {
                redisTemplate.opsForValue().set(key, value);
                flag = true;
            } catch (Exception e) {
                e.printStackTrace();
                flag = false;
            } finally {
                redisColse();
                return flag;
            }
        }
    
        /**
         *            
         *
         * @param key    
         * @param value  
         * @param time    ( ) time   0   time    0       
         * @return true   false   
         */
        public boolean set(String key, Object value, long time) {
            boolean flag = false;
            try {
                if (time > 0) {
                    redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
                } else {
                    set(key, value);
                }
                flag = true;
            } catch (Exception e) {
                e.printStackTrace();
                flag = false;
            } finally {
                redisColse();
                return flag;
            }
        }
    
        /**
         *   
         *
         * @param key    
         * @param delta     (  0)
         * @return
         */
        public long incr(String key, long delta) {
            if (delta < 0) {
                throw new RuntimeException("        0");
            }
            long timeOut = redisTemplate.opsForValue().increment(key, delta);
            redisColse();
            return timeOut;
        }
    
        /**
         *   
         *
         * @param key    
         * @param delta     (  0)
         * @return
         */
        public long decr(String key, long delta) {
            if (delta < 0) {
                throw new RuntimeException("        0");
            }
            long timeOut = redisTemplate.opsForValue().increment(key, -delta);
            return timeOut;
        }
    
        //================================Map=================================
    
        /**
         * HashGet
         *
         * @param key       null
         * @param item      null
         * @return  
         */
        public Object hget(String key, String item) {
            Object o = redisTemplate.opsForHash().get(key, item);
            redisColse();
            return o;
        }
    
        /**
         *   hashKey       
         *
         * @param key  
         * @return        
         */
        public Map<Object, Object> hmget(String key) {
            Map<Object, Object> map = redisTemplate.opsForHash().entries(key);
            redisColse();
            return map;
        }
    
        /**
         * HashSet
         *
         * @param key  
         * @param map       
         * @return true    false   
         */
        public boolean hmset(String key, Map<String, Object> map) {
            boolean flag = false;
            try {
                redisTemplate.opsForHash().putAll(key, map);
                flag = true;
            } catch (Exception e) {
                e.printStackTrace();
                flag = false;
            } finally {
                redisColse();
                return flag;
            }
        }
    
        /**
         * HashSet      
         *
         * @param key   
         * @param map        
         * @param time   ( )
         * @return true   false  
         */
        public boolean hmset(String key, Map<String, Object> map, long time) {
            boolean flag = false;
            try {
                redisTemplate.opsForHash().putAll(key, map);
                if (time > 0) {
                    expire(key, time);
                }
                flag = true;
            } catch (Exception e) {
                e.printStackTrace();
                flag = false;
            } finally {
                redisColse();
                return flag;
            }
        }
    
        /**
         *    hash      ,        
         *
         * @param key    
         * @param item   
         * @param value  
         * @return true    false  
         */
        public boolean hset(String key, String item, Object value) {
            boolean flag = false;
            try {
                redisTemplate.opsForHash().put(key, item, value);
                flag = true;
            } catch (Exception e) {
                e.printStackTrace();
                flag = false;
            } finally {
                redisColse();
                return flag;
            }
        }
    
        /**
         *    hash      ,        
         *
         * @param key    
         * @param item   
         * @param value  
         * @param time    ( )    :      hash    ,           
         * @return true    false  
         */
        public boolean hset(String key, String item, Object value, long time) {
            boolean flag = false;
            try {
                redisTemplate.opsForHash().put(key, item, value);
                if (time > 0) {
                    expire(key, time);
                }
                flag = true;
            } catch (Exception e) {
                e.printStackTrace();
                flag = false;
            } finally {
                redisColse();
                return flag;
            }
        }
    
        /**
         *   hash    
         *
         * @param key       null
         * @param item            null
         */
        public void hdel(String key, Object... item) {
            redisTemplate.opsForHash().delete(key, item);
            redisColse();
        }
    
        /**
         *   hash         
         *
         * @param key       null
         * @param item      null
         * @return true    false   
         */
        public boolean hHasKey(String key, String item) {
            boolean flag = redisTemplate.opsForHash().hasKey(key, item);
            redisColse();
            return flag;
        }
    
        /**
         * hash        ,                
         *
         * @param key   
         * @param item  
         * @param by       (  0)
         * @return
         */
        public double hincr(String key, String item, double by) {
            double num = redisTemplate.opsForHash().increment(key, item, by);
            redisColse();
            return num;
        }
    
        /**
         * hash  
         *
         * @param key   
         * @param item  
         * @param by       (  0)
         * @return
         */
        public double hdecr(String key, String item, double by) {
            double num = redisTemplate.opsForHash().increment(key, item, -by);
            redisColse();
            return num;
        }
    
        //============================set=============================
    
        /**
         *   key  Set     
         *
         * @param key  
         * @return
         */
        public Set<Object> sGet(String key) {
            try {
                Set<Object> set = redisTemplate.opsForSet().members(key);
                return set;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                redisColse();
            }
        }
    
        /**
         *   value   set   ,    
         *
         * @param key    
         * @param value  
         * @return true    false   
         */
        public boolean sHasKey(String key, Object value) {
            boolean flag = false;
            try {
                flag = redisTemplate.opsForSet().isMember(key, value);
                return flag;
            } catch (Exception e) {
                e.printStackTrace();
                flag = false;
            } finally {
                redisColse();
                return flag;
            }
        }
    
        /**
         *      set  
         *
         * @param key     
         * @param values        
         * @return     
         */
        public long sSet(String key, Object... values) {
            try {
                long num = redisTemplate.opsForSet().add(key, values);
                return num;
            } catch (Exception e) {
                e.printStackTrace();
                return 0;
            } finally {
                redisColse();
            }
        }
    
        /**
         *  set      
         *
         * @param key     
         * @param time     ( )
         * @param values        
         * @return     
         */
        public long sSetAndTime(String key, long time, Object... values) {
            try {
                Long count = redisTemplate.opsForSet().add(key, values);
                if (time > 0) expire(key, time);
                return count;
            } catch (Exception e) {
                e.printStackTrace();
                return 0;
            } finally {
                redisColse();
            }
        }
    
        /**
         *   set     
         *
         * @param key  
         * @return
         */
        public long sGetSetSize(String key) {
            try {
                long num = redisTemplate.opsForSet().size(key);
                return num;
            } catch (Exception e) {
                e.printStackTrace();
                return 0;
            } finally {
                redisColse();
            }
        }
    
        /**
         *     value 
         *
         * @param key     
         * @param values        
         * @return      
         */
        public long setRemove(String key, Object... values) {
            try {
                Long count = redisTemplate.opsForSet().remove(key, values);
                return count;
            } catch (Exception e) {
                e.printStackTrace();
                return 0;
            } finally {
                redisColse();
            }
        }
        //===============================list=================================
    
        /**
         *   list     
         *
         * @param key    
         * @param start   
         * @param end       0   -1     
         * @return
         */
        public List<Object> lGet(String key, long start, long end) {
            try {
                List<Object> list = redisTemplate.opsForList().range(key, start, end);
                return list;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                redisColse();
            }
        }
    
        /**
         *   list     
         *
         * @param key  
         * @return
         */
        public long lGetListSize(String key) {
            try {
                long num = redisTemplate.opsForList().size(key);
                return num;
            } catch (Exception e) {
                e.printStackTrace();
                return 0;
            } finally {
                redisColse();
            }
        }
    
        /**
         *        list   
         *
         * @param key    
         * @param index     index>=0 , 0   ,1      ,    ;index<0 ,-1,  ,-2       ,    
         * @return
         */
        public Object lGetIndex(String key, long index) {
            try {
                Object o = redisTemplate.opsForList().index(key, index);
                return o;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                redisColse();
            }
        }
    
        /**
         *  list    
         *
         * @param key    
         * @param value  
         * @return
         */
        public boolean lSet(String key, Object value) {
            try {
                redisTemplate.opsForList().rightPush(key, value);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            } finally {
                redisColse();
            }
        }
    
        /**
         *  list    
         *
         * @param key    
         * @param value  
         * @param time    ( )
         * @return
         */
        public boolean lSet(String key, Object value, long time) {
            try {
                redisTemplate.opsForList().rightPush(key, value);
                if (time > 0) expire(key, time);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            } finally {
                redisColse();
            }
        }
    
        /**
         *  list    
         *
         * @param key    
         * @param value  
         * @return
         */
        public boolean lSet(String key, List<Object> value) {
            try {
                redisTemplate.opsForList().rightPushAll(key, value);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            } finally {
                redisColse();
            }
        }
    
        /**
         *  list    
         *
         * @param key    
         * @param value  
         * @param time    ( )
         * @return
         */
        public boolean lSet(String key, List<Object> value, long time) {
            try {
                redisTemplate.opsForList().rightPushAll(key, value);
                if (time > 0) expire(key, time);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            } finally {
                redisColse();
            }
        }
    
        /**
         *       list      
         *
         * @param key    
         * @param index   
         * @param value  
         * @return
         */
        public boolean lUpdateIndex(String key, long index, Object value) {
            try {
                redisTemplate.opsForList().set(key, index, value);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            } finally {
                redisColse();
            }
        }
    
        /**
         *   N   value
         *
         * @param key    
         * @param count      
         * @param value  
         * @return      
         */
        public long lRemove(String key, long count, Object value) {
            try {
                Long remove = redisTemplate.opsForList().remove(key, count, value);
                return remove;
            } catch (Exception e) {
                e.printStackTrace();
                return 0;
            } finally {
                redisColse();
            }
        }
    
        //===============================    =================================
    
        /**
         *     
         *
         * @param channel   
         * @param message   
         */
        public void sendMessage(String channel, Serializable message) {
            redisTemplate.convertAndSend(channel, message);
        }
    
        /**
         *       
         *
         * @param uniqueId     
         * @return
         */
        public Object getAuthorizedSubject(String uniqueId) {
            return get(SysConstant.PROJECT_NAME + uniqueId);
        }
    
        /**
         *       
         *
         * @param uniqueId     
         */
        public void delAuthorizedSubject(String uniqueId) {
            del(SysConstant.PROJECT_NAME + uniqueId);
        }
    
        /**
         *       
         *
         * @param uniqueId     
         * @param obj        
         * @param time         
         * @return
         */
        public boolean setAuthorizedSubject(String uniqueId, Object obj, long time) {
            return set(SysConstant.PROJECT_NAME + uniqueId, obj, time);
        }
    }
    
    

    redisの非同期(類似メッセージキュー)使用
  • 受信メッセージクラスインジェクションReceiveMessageを作成し、redisツールクラスを作成する上に
  • がある.
    package com.laiganhlj.dlc.common.redis;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import java.io.Serializable;
    import java.util.concurrent.CountDownLatch;
    
    /**
     *     
     */
    @Slf4j
    public class ReceiveMessage {
    
        private CountDownLatch latch;
    
        @Autowired
        public ReceiveMessage(CountDownLatch countDownLatch) {
            this.latch = countDownLatch;
        }
     
    
        public void receiveMessage(Serializable message) {
            log.info("message      :{}", message);
       
        }
    
        public void receiveMessage2(Serializable message) {
            log.info("message2      :{}", message);
        }
    
    }
    
    
    
  • redis構成クラス
  • package com.laiganhlj.dlc.config;
    
    
    import com.laiganhlj.dlc.common.redis.ReceiveMessage;
    import com.laiganhlj.dlc.common.result.SysConstant;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.cache.annotation.CachingConfigurerSupport;
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.listener.PatternTopic;
    import org.springframework.data.redis.listener.RedisMessageListenerContainer;
    import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
    import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    
    import java.io.Serializable;
    import java.util.concurrent.CountDownLatch;
    
    /**
     * @Author: jijl
     * @Description: redis   
     * @Date: 2018/6/27 15:05
     **/
    @Slf4j
    @Configuration
    @EnableCaching
    public class RedisConfig extends CachingConfigurerSupport {
    
        @Bean
        public RedisTemplate<Serializable, Serializable> redisTemplate(
                JedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<Serializable, Serializable> redisTemplate = new RedisTemplate<>();
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
            redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            redisTemplate.afterPropertiesSet();
            redisTemplate.opsForValue().get(SysConstant.PROJECT_NAME);
            log.info("-------------------------------------------------");
            log.info("---------------local redis success---------------");
            log.info("-------------------------------------------------");
            return redisTemplate;
        }
    
        /**
         *      1
         *
         * @return
         */
        @Bean
        public MessageListenerAdapter listenerAdapter(ReceiveMessage receiveMessage) {
            MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(receiveMessage, "receiveMessage");
            messageListenerAdapter.setSerializer(new JdkSerializationRedisSerializer());
            return messageListenerAdapter;
        }
    
    
        /**
         *      2
         *
         * @return
         */
        @Bean
        public MessageListenerAdapter listenerAdapter2(ReceiveMessage receiveMessage) {
            MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(receiveMessage, "receiveMessage2");
            messageListenerAdapter.setSerializer(new JdkSerializationRedisSerializer());
            return messageListenerAdapter;
        }
    
        /**
         *       
         *
         * @param connectionFactory
         * @param listenerAdapter
         * @param listenerAdapter2
         * @return
         */
        @Bean
        public RedisMessageListenerContainer container(JedisConnectionFactory connectionFactory,
                                                       MessageListenerAdapter listenerAdapter,
                                                       MessageListenerAdapter listenerAdapter2) {
            RedisMessageListenerContainer container = new RedisMessageListenerContainer();
            container.setConnectionFactory(connectionFactory);
            container.addMessageListener(listenerAdapter, new PatternTopic(SysConstant.Redis.END_ORDER_MESSAGE_CHANNLE));
            container.addMessageListener(listenerAdapter2, new PatternTopic(SysConstant.Redis.CHANNLE_TWO));
            return container;
        }
    
        /**
         *      1
         *
         * @return
         */
        @Bean
        public ReceiveMessage receiveMessage(CountDownLatch countDownLatch) {
            return new ReceiveMessage(countDownLatch);
        }
    
        /**
         *      2
         *
         * @return
         */
        @Bean
        public ReceiveMessage receiveMessage2(CountDownLatch countDownLatch) {
            return new ReceiveMessage(countDownLatch);
        }
    
        @Bean
        public CountDownLatch countDownLatch() {
            return new CountDownLatch(1);
        }
    
    
    }
    
    
  • redisキューはここで使用するときに伝達された値をシーケンス化操作を行い、受信時に逆シーケンス化を行い、公開時にjsonを使用することを推奨しますここでは完全なコードを貼らない
  • 	//  redis
    	@Autowired
    	private RedisService redisService;
    
    		//                ,ReceiveMessage             ,                  redis     
         redisService.sendMessage("message2", "        ");