Maison  >  Article  >  Java  >  Explication détaillée d'exemples de cluster Redis fonctionnant avec Java

Explication détaillée d'exemples de cluster Redis fonctionnant avec Java

零下一度
零下一度original
2017-05-26 14:38:303475parcourir

Pour plus d'informations sur la construction de cluster Redis, veuillez vous référer à mon autre article Construction de cluster Redis et utilisation simple

Qu'est-ce que Redis et que peut-il faire

Redis est un serveur de structure de données en mémoire open source (sous licence BSD) qui peut être utilisé comme courtier de base de données, de cache et de file d'attente de messages. Il prend en charge les chaînes, les tables de hachage, les listes, les ensembles, les ensembles ordonnés, les bitmaps, les hyperloglogs et d'autres types de données. Réplication intégrée, scripts Lua, expulsion LRU, transactions et différents niveaux de fonctions de persistance du disque, tout en offrant une haute disponibilité via Redis Sentinel et un partitionnement automatique via Redis Cluster. (Extrait du site officiel de Redis)

En tant que base de données en mémoire, Redis est encore principalement utilisé comme cache dans les systèmes Web Internet modernes. Les systèmes Web Internet à grande échelle ont des exigences de performances élevées, et l'ajout de la mise en cache des données entre le front-end et la couche de données est devenu l'un des moyens essentiels. Les deux technologies actuellement populaires sont Redis et Memcached. Ce n’est pas le sujet de cet article. Cet article parle principalement de la façon dont Java Web exploite Redis et le cluster Redis.

Fonctionnement général du programme Java Redis

Redis fournit des clients dans plusieurs langues, la plus populaire en Java est Jedis. Visitez pour voir le code source et comment l'utiliser. Actuellement, la dernière version de Jedis est la 2.9.0. Qu'il s'agisse d'une machine autonome ou d'un cluster, Jedis propose des instructions très détaillées et des exemples de codes. Voici seulement une brève explication. Si vous utilisez Maven pour la gestion des packages, vous devez référencer le package jedis. Cet exemple utilise la dernière version 2.9.0, comme suit :

  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 Operating Redis

Pour faire fonctionner Redis dans Spring mvc, vous devez bien sûr d'abord configurer le framework Spring mvc. Ce qui suit suppose que l'environnement Spring mvc a été configuré. Dans cet exemple, la version Spring est la version 4.3.2. La référence maven sur Spring est la suivante :

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}

Faire fonctionner Redis de manière autonome

Utiliser uniquement Jedis pour implémenter l'injection (différent de la référence suivante spring-data-redis)

Le code JedisClient précédent peut être référencé. Il vous suffit d'implémenter un service pour accéder à Redis, et il peut être intégré à Spring mvc. Le code du service est le suivant :

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;
    }
}

Le contrôleur est implémenté comme suit :

@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;
    }
}  

Utilisez le package spring-data-redis pour l'intégration

Ce qui précède est le injection implémentée par moi-même, j'utilise ici L'intégration de spring-data-redis ne nécessite qu'une configuration simple. Vous devez référencer le package maven comme suit La version est la dernière version 1.7.2.RELEASE :

      org.springframework.data      spring-data-redis      1.7.2.RELEASE
Utilisez spring-data-redis, c'est-à-dire save Au lieu d'implémenter le processus d'injection par vous-même, grâce à certaines des configurations qu'il fournit, vous pouvez réaliser la configuration du pool de connexions, la configuration RedisTemplate, la configuration JedisConnectionFactory, vous pouvez configurer la connexion ; paramètres du pool, serveur redis, port, mot de passe, délai d'attente, index de base de données, etc. ; RedisTemplate est le bean injecté. Vous pouvez utiliser les entités automatiquement injectées par RedisTemplate pour effectuer une série d'opérations redis. Plus précisément, voir la configuration ;


fichier de configuration des attributs du service redis :

puis Les fichiers ci-dessus sont cités dans le fichier de configuration du printemps :
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:                                                              -->                                                                                                          -->

Expliquez la configuration ci-dessus :

poolConfig configure le pool de connexions Redis, puis configure deux JedisConnectionFactory et RedisTemplate. Un RedisTemplate correspond à un JedisConnectionFactory, de sorte que Configuration Configure différentes connexions Redis selon le scénario. Par exemple, les exigences de délai d'attente sont incohérentes, la base de données 0-15 peut stocker. données différentes, etc. Les bases de données 1 et 2 sont configurées ici. L'appel de commonRedisTemplate l'enregistrera dans la base de données1 et l'appel de cacheRedisTemplate l'enregistrera dans la base de données2.

Ensuite, ces deux RedisTemplates peuvent être injectés et référencés dans la couche Service, de la manière suivante :

Enfin, appelez-les dans le Controller
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


Faire fonctionner le cluster Redis
@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";
}  

Utilisez uniquement Jedis pour implémenter l'injection vous-même (différent de spring-data-redis référencé ci-dessous)

Prenez simplement le code JedisClusterClient précédent et citez-le, et il vous suffit de implémenter un accès au service Redis peut être intégré à Spring mvc. Le code du service est le suivant :

Appelez enfin le service implémenté dans le contrôleur
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;
        }
    }
}

Remarque :
@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";
    }
}  

Problème de version, si vous utilisez spring-data - Redis effectue des opérations intégrées sur le cluster Reids. Seule la dernière version 1.7 de spring-data-redis inclut des opérations sur le cluster. Certaines fonctions de la dernière version de spring-data-redis ont également certaines restrictions sur la version de Spring mvc, alors essayez. pour choisir une version supérieure de Spring mvc correspondante.

Si la valeur stockée est un objet entité, alors l'interface Serialisable doit être implémentée

[Recommandations associées]

1

Explication détaillée du code d'utilisation de. Annotations du framework Spring Exemple

2.

Explication détaillée du code de Spring et Hibernate pour l'apprentissage de la gestion des transactions Java

3

Partage d'un exemple de tutoriel sur l'utilisation. Spring Boot pour développer des programmes Restful

4

Explication détaillée des sept méthodes de retour prises en charge par spring mvc

.

5. Explication détaillée des exemples d'implémentation améliorés de Spring basés sur des aspects

6 Exemples de PHPRPC pour Java Spring

8. 🎜 >Explication détaillée des tutoriels pratiques sur l'utilisation d'Elasticsearch au printemps

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn