Heim  >  Artikel  >  Java  >  Ausführliche Erläuterung von Beispielen für den Java-Betrieb eines Redis-Clusters

Ausführliche Erläuterung von Beispielen für den Java-Betrieb eines Redis-Clusters

零下一度
零下一度Original
2017-05-26 14:38:303495Durchsuche

Informationen zur Redis-Clusterkonstruktion finden Sie in meinem anderen Artikel Redis-Clusterkonstruktion und einfache Verwendung

Was ist Redis und was kann es?

Redis ist ein Open-Source-In-Memory-Datenstrukturserver (BSD-lizenziert), der als Datenbank-, Cache- und Nachrichtenwarteschlangen-Broker verwendet werden kann. Es unterstützt Strings, Hash-Tabellen, Listen, Mengen, geordnete Mengen, Bitmaps, Hyperloglogs und andere Datentypen. Integrierte Replikation, Lua-Skripte, LRU-Eviction, Transaktionen und verschiedene Ebenen der Festplattenpersistenzfunktionen bei gleichzeitiger Bereitstellung hoher Verfügbarkeit durch Redis Sentinel und automatischer Partitionierung durch Redis Cluster. (Auszug aus der offiziellen Redis-Website)

Als In-Memory-Datenbank wird Redis immer noch hauptsächlich als Cache in modernen Internet-Websystemen verwendet. Große Internet-Websysteme stellen hohe Leistungsanforderungen, und das Hinzufügen von Daten-Caching zwischen dem Front-End und der Datenschicht ist zu einem der wesentlichen Mittel geworden. Die beiden derzeit beliebten Technologien sind Redis und Memcached. Darum geht es in diesem Artikel nicht. In diesem Artikel geht es hauptsächlich darum, wie Java Web Redis und Redis-Cluster betreibt.

Allgemeiner Java-Programmbetrieb Redis

Redis bietet Clients in mehreren Sprachen, die beliebteste in Java ist Jedis. Besuchen Sie, um den Quellcode und seine Verwendung anzuzeigen. Derzeit ist die neueste Version von Jedis 2.9.0. Unabhängig davon, ob es sich um eine eigenständige Maschine oder einen Cluster handelt, bietet Jedis sehr detaillierte Anweisungen und Beispielcodes. Hier nur eine kurze Erklärung. Wenn Sie Maven für die Paketverwaltung verwenden, müssen Sie auf das Jedis-Paket verweisen, wie folgt:

  redis.clients      jedis      2.9.0  
操作 Redis 单机
import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig; /** * Created by fengdezitai on 2016/10/9. */public class JedisClient {     private static final String host= "192.168.31.121";     private static final JedisClient jedisClient = new JedisClient();     private Jedis jedis = null;    /**     * 私有构造函数     */    private JedisClient(){}     public static JedisClient getInstance(){        return jedisClient;    }     private JedisPoolConfig getPoolConfig(){        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();        jedisPoolConfig.setMaxIdle(10);        jedisPoolConfig.setMaxTotal(100);        jedisPoolConfig.setMaxWaitMillis(3000);        return jedisPoolConfig;    }     /**     * 添加     * @param key     * @param value     * @return     * @throws Exception     */    public Boolean add(String key,String value) throws Exception{        JedisPool pool = new JedisPool(getPoolConfig(),host);        Jedis jedis = null;        try {            jedis = pool.getResource();            if(jedis.exists(key)){                throw new Exception(String.format("key (%s) 已存在 ",key));            }            jedis.set(key,value);         }catch (Exception e){            throw e;        }        finally {            if(jedis!=null){                jedis.close();            }        }        pool.destroy();        return true;    }     /**     * 获取值     * @param key     * @return     * @throws Exception     */    public String get(String key) throws Exception{        JedisPool pool = new JedisPool(getPoolConfig(),host);        Jedis jedis = null;        String result = "";        try {            jedis = pool.getResource();            result = jedis.get(key);        }catch (Exception e){            throw e;        }        finally {            if(jedis!=null){                jedis.close();            }        }        pool.destroy();        return result;    }     public static void main(String[] args) {        JedisClient jedisClient = JedisClient.getInstance();        try {            /*Boolean result = jedisClient.add("hello", "redis1");            if(result){                System.out.println("success");            }*/             System.out.println(jedisClient.get("hello"));        }catch (Exception e){            e.printStackTrace();        }    }}

Operation Redis Cluster

import redis.clients.jedis.*;
import java.util.HashSet;
import java.util.Set;
 
/**
 * Created by fengdezitai on 2016/10/13.
 */
public class JedisClusterClient {
 
    private static int count = 0;
 
    private static final JedisClusterClient redisClusterClient = new JedisClusterClient();
 
    /**
     * 私有构造函数
     */
    private JedisClusterClient() {}
 
    public static JedisClusterClient getInstance() {
        return redisClusterClient;
    }
 
    private JedisPoolConfig getPoolConfig(){
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(1000);
        config.setMaxIdle(100);
        config.setTestOnBorrow(true);
        return config;
    }
 
    public void SaveRedisCluster() {
        Set jedisClusterNodes = new HashSet();
        jedisClusterNodes.add(new HostAndPort("192.168.31.245", 7000));
        jedisClusterNodes.add(new HostAndPort("192.168.31.245", 7001));
        jedisClusterNodes.add(new HostAndPort("192.168.31.245", 7002));
        jedisClusterNodes.add(new HostAndPort("192.168.31.210", 7003));
        jedisClusterNodes.add(new HostAndPort("192.168.31.210", 7004));
        jedisClusterNodes.add(new HostAndPort("192.168.31.210", 7005));
 
        JedisCluster jc = new JedisCluster(jedisClusterNodes,getPoolConfig());
        jc.set("cluster", "this is a redis cluster");
        String result = jc.get("cluster");
        System.out.println(result);
    }
 
    public static void main(String[] args) {
        JedisClusterClient jedisClusterClient = JedisClusterClient.getInstance();
        jedisClusterClient.SaveRedisCluster();
    }
}  

Spring mvc Redis betreiben

Um Redis in Spring mvc zu betreiben, müssen Sie natürlich zuerst das Spring mvc-Framework einrichten. Im Folgenden wird davon ausgegangen, dass die Spring MVC-Umgebung eingerichtet wurde. In diesem Beispiel ist die Spring-Version 4.3.2 RELEASE. Die Maven-Referenz zu Spring lautet wie folgt:

4.3.2.RELEASE 
    
          org.springframework      spring-core      ${spring.version}                        commons-logging          commons-logging                   
          org.springframework      spring-web      ${spring.version}     
          org.springframework      spring-oxm      ${spring.version}     
          org.springframework      spring-tx      ${spring.version}     
          org.springframework      spring-jdbc      ${spring.version}     
          org.springframework      spring-webmvc      ${spring.version}                        commons-logging          commons-logging                   
          org.springframework      spring-aop      ${spring.version}     
          org.springframework      spring-context-support      ${spring.version}     
 
          org.springframework      spring-test      ${spring.version}

Betreiben Sie Redis eigenständig

Verwenden Sie Jedis nur zum Implementieren der Injektion (anders als die folgende Referenz Spring-Data-Redis)

Der vorherige JedisClient-Code kann referenziert werden. Sie müssen nur einen Dienst implementieren, um auf Redis zuzugreifen, und dieser kann in Spring MVC integriert werden. Der Servicecode lautet wie folgt:

import org.springframework.stereotype.Service;
import util.JedisClient;
 
/**
 * Created by fengdezitai on 2016/10/9.
 */
@Service
public class RedisService {
 
    public String get(String key) throws Exception{
        JedisClient jedisClient = JedisClient.getInstance(); //上面实现的JedisClient
        String result = "";
        try {
            result = jedisClient.get("hello");
        }catch (Exception e){
            throw e;
        }
        return result;
    }
}

Controller wird wie folgt implementiert:

@Controller
@RequestMapping(value = "redisAllInOne")
public class RedisAllInOneController {
 
    @Autowired
    private RedisService redisService;
 
    @RequestMapping(value = "get",method = RequestMethod.GET)
    @ResponseBody
    public Object getByMyService(String key){
        try {
            String result = redisService.get(key);
            return result;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}  

Verwenden Sie das Spring-Data-Redis-Paket für die Integration

Das Obige ist das Die von mir selbst implementierte Injektion erfordert nur eine einfache Konfiguration. Die Version ist die neueste Version 1.7.2.RELEASE:

      org.springframework.data      spring-data-redis      1.7.2.RELEASE

Verwenden Sie spring-data-redis, d. h. Speichern Anstatt den Injektionsprozess selbst zu implementieren, können Sie über einige der bereitgestellten Konfigurationen die Verbindungspoolkonfiguration, die RedisTemplate-Konfiguration und die JedisConnectionFactory-Konfiguration realisieren und die Verbindung konfigurieren Poolparameter, Redis-Server, Port, Passwort, Zeitüberschreitung, Datenbankindex usw.; RedisTemplate ist die automatisch injizierte Bean, um eine Reihe von Redis-Vorgängen auszuführen

Redis-Dienstattribut-Konfigurationsdatei:

redis.maxIdle=300redis.maxWait=3000redis.testOnBorrow=trueredis.host=192.168.31.121redis.port=6379redis.password=passwordredis.timeout=3000
spring-data-redis xml 配置文件 redis-context.xml:                                                              -->                                                                                                          -->
und dann Die oben genannten Dateien werden in der Spring-Konfigurationsdatei zitiert:

Erklären Sie die obige Konfiguration:

poolConfig konfiguriert den Redis-Verbindungspool und konfiguriert dann zwei JedisConnectionFactory und RedisTemplate. Ein RedisTemplate entspricht einer JedisConnectionFactory, sodass die Konfiguration je nach Szenario unterschiedlich ist. Die Timeout-Anforderungen können in der Datenbank 0-15 gespeichert werden unterschiedliche Daten usw. Datenbank 1 und 2 werden hier konfiguriert. Durch Aufrufen von commonRedisTemplate wird es in Datenbank1 gespeichert, und durch Aufrufen von CacheRedisTemplate wird es in Datenbank2 gespeichert.

Anschließend können Sie diese beiden RedisTemplates wie folgt in die Service-Schicht einfügen und referenzieren:

import org.apache.commons.lang3.StringUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;
 
import javax.annotation.Resource;
import java.io.*;
 
@Repository
public class RedisCache {  
    @Resource(name = "cacheRedisTemplate")
    private RedisTemplate
Zum Schluss im Controller aufrufen


@Autowired
private RedisCache redisCache;
 
 
@RequestMapping(value = "get", method = RequestMethod.GET)
@ResponseBody
public Object getByMyService(String key) {
    try {
        String result = redisService.get(key);
        return result;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
 
@RequestMapping(value = "save", method = RequestMethod.GET)
@ResponseBody
public Object save() {
    Token token = new Token();
    token.setAccess_token("token");
    token.setExpires_in(1000);
    try {
        redisCache.put("token", token);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "ok";
}  
Redis-Cluster betreiben

Verwenden Sie Jedis nur zum Implementieren der Injektion (im Gegensatz zu Spring-Data-Redis, auf das unten verwiesen wird)

Nehmen Sie einfach den vorherigen JedisClusterClient-Code und verweisen Sie darauf, und Sie müssen nur einen implementieren Zugriff auf Redis Service kann in Spring MVC integriert werden. Der Servicecode lautet wie folgt:

import org.springframework.stereotype.Service;
import util.JedisClusterClient;
 
/**
 * Created by fengdezitai on 2016/10/13.
 */
@Service
public class RedisClusterService {
 
    public void save() throws Exception{
        //调用 JedisClusterClient 中的方法
        JedisClusterClient jedisClusterClient = JedisClusterClient.getInstance();
        try {
            jedisClusterClient.SaveRedisCluster();
        }catch (Exception e){
            throw e;
        }
    }
}
Rufen Sie abschließend den implementierten Service im Controller auf

@Controller
@RequestMapping(value = "redisCluster")
public class RedisClusterController {
 
    @Autowired
    private RedisClusterService redisClusterService;
 
    @RequestMapping(value = "save",method = RequestMethod.GET)
    @ResponseBody
    public Object save(){
        try{
            redisClusterService.save();
        }catch (Exception e){
            e.printStackTrace();
            return String.format("error: %s",e.getMessage());
        }
        return "ok";
    }
}  
Hinweis:

Versionsproblem, wenn Sie Spring-Data verwenden - Redis führt integrierte Operationen auf dem Reids-Cluster aus. Einige Funktionen in der neuesten Version von Spring-Data-Redis unterliegen auch einigen Einschränkungen gegenüber der Version von Spring MVC um eine höhere Version von Spring MVC zu wählen.

Wenn der gespeicherte Wert ein Entitätsobjekt ist, muss die Serialisierbare Schnittstelle implementiert werden

[Verwandte Empfehlungen]

1. Detaillierte Erläuterung des Verwendungscodes von Beispiel für Spring-Framework-Anmerkungen

2.

Detaillierte Code-Erklärung von Spring und Hibernate zum Erlernen der Java-Transaktionsverwaltung

3 Spring Boot zur Entwicklung von Restful-Programmen

4. Detaillierte Erläuterung der sieben von Spring MVC unterstützten Rückgabemethoden

5. Detaillierte Erläuterung der erweiterten Implementierungsbeispiele von Spring

6.Beispiele für PHPRPC für Java Spring

8 🎜 >Ausführliche Erläuterung praktischer Tutorials zur Verwendung von Elasticsearch im Frühjahr

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Beispielen für den Java-Betrieb eines Redis-Clusters. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn