Heim > Web-Frontend > js-Tutorial > Java Spring MVC betreibt Redis und Redis-Cluster

Java Spring MVC betreibt Redis und Redis-Cluster

高洛峰
Freigeben: 2017-05-26 14:40:39
Original
1488 Leute haben es durchsucht

Informationen zum Redis-Cluster-Aufbau finden Sie in meinem anderen Artikel Redis-Cluster-Aufbau und einfache Verwendung

Was ist Redis und was kann es?

Redis ist eine Open Source (BSD-Lizenz). ), Speicher Ein Server mit gespeicherter Datenstruktur, der als Datenbank, Cache und Nachrichtenwarteschlangenbroker 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 nicht das, worum es in diesem Artikel geht. 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  
Nach dem Login kopieren

Operation Redis Standalone

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();
        }
    }
}
Nach dem Login kopieren

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();
    }
}  
Nach dem Login kopieren

Spring MVC betreibt Redis

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}
Nach dem Login kopieren

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;
    }
}
Nach dem Login kopieren

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;
    }
}  
Nach dem Login kopieren

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
Nach dem Login kopieren

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. Weitere Informationen finden Sie in der Konfiguration >

Redis-Dienstattribut-Konfigurationsdatei:

redis.maxIdle=300
redis.maxWait=3000
redis.testOnBorrow=true
redis.host=192.168.31.121
redis.port=6379
redis.password=password
redis.timeout=3000
Nach dem Login kopieren
spring-data-redis XML-Konfigurationsdatei redis-context.xml:

                                    
                                    -->
                     
                                                 
                                    -->
Nach dem Login kopieren
Verweisen Sie dann im Frühjahr auf die obige Datei Konfigurationsdatei:

  
Nach dem Login kopieren
Erklären Sie die obige Konfiguration:

poolConfig Das heißt, konfigurieren Sie den Redis-Verbindungspool und konfigurieren Sie dann zwei JedisConnectionFactory und RedisTemplate Auf diese Weise können je nach Szenario unterschiedliche Redis-Verbindungen konfiguriert werden, z. B. inkonsistente Timeout-Anforderungen, Datenbank 0-15 kann unterschiedliche Daten speichern 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 diese beiden RedisTemplates wie folgt in die Service-Schicht eingefügt und referenziert werden:

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
Nach dem Login kopieren
Zum Schluss wird es im Controller aufgerufen, um den Redis-Cluster zu betreiben

verwendet Jedis nur, um die Injektion selbst zu implementieren (anders als die Spring-Data-Redis-Referenz unten)
@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";
}  
Nach dem Login kopieren

Nehmen Sie einfach den vorherigen JedisClusterClient-Code und verweisen Sie darauf. Sie müssen nur einen Dienst implementieren, um auf Redis zuzugreifen. Das ist möglich in Spring mvc integriert werden. Der Service-Code lautet wie folgt:

Rufen Sie abschließend den implementierten Service im Controller auf

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;
        }
    }
}
Nach dem Login kopieren
Verwenden Sie das Spring-Data-Redis-Paket zur Integration

Spring und spring Die -data-redis-Maven-Paketreferenz ist die gleiche wie zuvor. Der Grund, warum auf spring-data-redis 1.7.2.RELEASE verwiesen wird, liegt darin, dass derzeit nur diese neueste Version Clusteroperationen unterstützt.
@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";
    }
}  
Nach dem Login kopieren

Redis-Cluster-Service-Attributkonfiguration

spring-data-redis xml Cluster-Konfigurationsdatei redis-cluster-context.xml

redis.maxIdle=300
redis.maxWait=3000
redis.testOnBorrow=false
redis.timeout=3000
Nach dem Login kopieren
nach der Spring-Konfigurationsdatei Zitiert in

<br/>
Nach dem Login kopieren
Nach dem Login kopieren
, um die obige Konfiguration zu erläutern:

poolConfig ist die Verbindungspoolkonfiguration, redisClusterConfig konfiguriert jeden Knoten des Redis-Clusters (Knotenhost und Port werden am besten in geschrieben). Attributkonfigurationsdatei), Die Clusterkonstruktion finden Sie in meinem anderen Blog. Dann ist das Folgende dasselbe wie die eigenständige Konfiguration, ein Paar aus JedisConnectionFactory und RedisTemplate.
<br/>
Nach dem Login kopieren
Nach dem Login kopieren

Anschließend kann dieses RedisTemplate in die Service-Schicht eingefügt und referenziert werden. Der Code lautet wie folgt:

Zum Schluss rufen Sie es im Controller auf 🎜>Hinweise:

Versionsproblem: Wenn Sie Spring-Data-Redis zum Integrieren des Reids-Clusters verwenden, enthält nur die neueste Version 1.7 von Spring-Data-Redis Operationen auf dem Cluster, einige Funktionen in den neuesten Spring-Data-Redis jedoch nicht Geeignet für Die Version von Spring MVC weist auch einige Einschränkungen auf. Versuchen Sie daher, eine höhere Version von Spring MVC auszuwä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

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage