Diversión SpringBoot2.x de objetos en caché | programa de la Fuerza

Autor | mesa de la luna

Fuente | Blog RDCC

Figura cabeza | Descarga de pago de la China, visual

Exposición | RDCC (ID: CSDNnews)

prefacio

Se mencionó la posibilidad de Redis mayoría de la gente primer pensamiento se almacena en caché, entonces cómo los objetos Java se almacenan en caché en el proyecto de hacer? Eso es lo que este artículo junto a introducir: objeto de caché. En este artículo se lleva a través de una visión rápida de SpringBoot proyecto por Jedis en la memoria caché de objetos a Redis.

Lee este artículo que necesita saber cómo SpringBoot proyecto de construcción, lo que necesita saber es otra versión de este artículo es SpringBoot 2.1.0.RELEASE. Sobre SpringBoot integrado Jedis consulte: Diversión 2.x SpringBoot de rápida integración cliente Jedis (Edición Normal)

A continuación, vamos a empezar casos de código específico que introducen!

Casos de código

Siguiendo objeto de caché presentación creada a la clase User Redis en particular, hay dos maneras: serialización, JSON. Usuario código específico de clase de la siguiente manera:

 1public class User implements Serializable {
 2
 3    private String name;
 4    private Integer age;
 5
 6    public User(String name,Integer age){
 7        this.name = name;
 8        this.age = age;
 9    }
10    //省略 getter and setter 方法
11}

tiempo de expiración en el procesamiento y retorno a la agrupación de hebras de hilo Jedis operaciones operación a JedisCacheServiceSupport paquete, el código específico de la siguiente manera:

 1public abstract class JedisCacheServiceSupport {
 2    public static final long EXPIRE_MILLISECONDS_DEFAULT_LONG = 3*60*60*1000;
 3
 4    public Long getExpireTime(Long expireTime) {
 5        expireTime = (expireTime == null || expireTime.longValue() <= 0) ? EXPIRE_MILLISECONDS_DEFAULT_LONG : expireTime;
 6        return expireTime;
 7    }
 8
 9    public void close(Jedis jedis){
10        if(jedis != null){
11            jedis.close();
12        }
13    }
14}

serialización

de manera serializado por ahora convertirse en un flujo binario después de objetos de almacenamiento (serialización) a Redis entonces adquirida por una clave binaria, flujo binario a un objeto (deserializar) en.

Sosteniendo objeto hacer lo siguiente:

Por ObjectOutputStream.writeObject (objeto) para convertir el objeto en una matriz de bytes de usuario, psetex entonces (clave byte [], largos milisegundos, byte [] Valor) a byte [] matriz se almacena en Redis. entre

  • byte tecla []: necesidades clave que se convierte en una matriz de bytes.

  • largos milisegundos: supervivencia del sujeto que está en el tiempo Redis, en milisegundos.

  • byte [] Valor: btye objeto en la matriz.

La adquisición de un objeto hacer lo siguiente:

Obtener un objeto matriz de bytes es convertido por la tecla (byte []) get usuario, a continuación, ObjectInputStream.readObject) convertir (objeto del usuario en una matriz.

Guardar y recuperar objetos código específico de la siguiente manera serialización por:

  1@Service
  2public class JedisCacheService extends JedisCacheServiceSupport  {
  3
  4    private static Logger logger = LoggerFactory.getLogger(JedisCacheService.class);
  5
  6
  7
  8    @Autowired
  9    private JedisPool jedisPool;
 10
 11    /**
 12     * 获取缓存中的对象
 13     * @param key
 14     * @return
 15     */
 16    public Object getObject(String key) {
 17        Jedis jedis = null;
 18        Object object = null;
 19        try {
 20            jedis = jedisPool.getResource();
 21            byte[] ObjectByteArray = jedis.get(key.getBytes());
 22            object = unserialize(ObjectByteArray);
 23        }catch (Exception e){
 24            e.printStackTrace();
 25        }finally {
 26            close(jedis);
 27        }
 28        return object;
 29    }
 30
 31    /**
 32     *  将对象缓存到Redis中,设置默认过期时间
 33     * @param key
 34     * @param value
 35     */
 36    public void putObject(String key, Object value) {
 37        putObject(key,value,null);
 38    }
 39    /**
 40     *  将对象缓存到Redis中,自定义认过期时间
 41     * @param key
 42     * @param value
 43     */
 44    public void putObject(String key, Object value, Long expireTime) {
 45        Jedis jedis = null;
 46        try {
 47            jedis = jedisPool.getResource();
 48            jedis.psetex(key.getBytes(),getExpireTime(expireTime),serialize(value));
 49        }catch (Exception e){
 50            e.printStackTrace();
 51        }finally {
 52            close(jedis);
 53        }
 54    }
 55
 56
 57    /**
 58     * 序列化
 59     * @param object
 60     * @return
 61     */
 62    public static byte[] serialize(Object object) {
 63        ObjectOutputStream oos = null;
 64        ByteArrayOutputStream baos = null;
 65        try {
 66            baos = new ByteArrayOutputStream();
 67            oos = new ObjectOutputStream(baos);
 68            oos.writeObject(object);
 69            byte[] bytes = baos.toByteArray();
 70            return bytes;
 71        } catch (Exception e) {
 72            logger.error(e.getMessage(), e);
 73        } finally {
 74            IOUtil.closeStream(oos);
 75            IOUtil.closeStream(baos);
 76        }
 77        return null;
 78    }
 79
 80    /**
 81     * 反序列化
 82     * @param bytes
 83     * @return
 84     */
 85    public static Object unserialize(byte[] bytes) {
 86        if (bytes == null) return null;
 87
 88        ByteArrayInputStream bais = null;
 89        ObjectInputStream ois = null;
 90        try {
 91            bais = new ByteArrayInputStream(bytes);
 92            ois = new ObjectInputStream(bais);
 93            return ois.readObject();
 94        } catch (Exception e) {
 95            logger.error(e.getMessage(), e);
 96        } finally {
 97            IOUtil.closeStream(bais);
 98            IOUtil.closeStream(ois);
 99        }
100        return null;
101    }
102}

El cierre de la entrada y salida de flujos de código específico de herramientas de la siguiente manera:

 1public class IOUtil {
 2    public static void closeStream(InputStream inputStream) {
 3        if (inputStream != null) {
 4            try {
 5                inputStream.close();
 6            } catch (IOException e) {
 7                e.printStackTrace();
 8            }
 9
10        }
11    }
12
13    public static void closeStream(OutputStream outputStream) {
14        if (outputStream != null) {
15            try {
16                outputStream.close();
17            } catch (IOException e) {
18                e.printStackTrace();
19            }
20
21        }
22    }
23}

serialización de demostración

Prueba JedisCacheService putObject (un objeto colocado en la memoria caché), el getObject (obtener el objeto de la caché), el código específico es el siguiente:

 1@RunWith(SpringRunner.class)
 2@SpringBootTest
 3public class JedisCacheServiceTest {
 4    private  Logger logger = LoggerFactory.getLogger(JedisCacheService.class);
 5    @Autowired
 6    private JedisCacheService jedisCacheService;
 7
 8    @Test
 9    public void putObject() {
10        User user = new User("zhuoqiammingyue",19);
11        jedisCacheService.putObject("user01",user);
12        logger.info("缓存用户成功!");
13    }
14
15    @Test
16    public void getObject() {
17        User user = (User)jedisCacheService.getObject("user01");
18        logger.info("User name={},age={}",user.getName(),user.getAge());
19    }
20}

putObject información de registro:

12020-02-26 22:08:50.320  INFO 26748 --- [           main] cn.lijunkui.cache.JedisCacheServiceTest  : Started JedisCacheServiceTest in 7.157 seconds (JVM running for 9.357)
22020-02-26 22:08:51.144  INFO 26748 --- [           main] cn.lijunkui.cache.JedisCacheService      : 缓存用户成功!

getObject registrar información:

12020-02-26 22:09:57.492  INFO 9612 --- [           main] cn.lijunkui.cache.JedisCacheServiceTest  : Started JedisCacheServiceTest in 7.07 seconds (JVM running for 8.902)
22020-02-26 22:09:58.143  INFO 9612 --- [           main] cn.lijunkui.cache.JedisCacheService      : User name=zhuoqiammingyue,age=19

forma JSON

JSON manera es guardar el objeto en una cadena legible a JSON Redis luego cadena JSON adquirida por la llave, en el objeto JSON encadenan. cadena JSON se convierta en un objeto por parte de Google de finalización Gson, es necesario confiar en la introducción Gson, código específico dependiente es la siguiente:

1<dependency>
2    <groupId>com.google.code.gson</groupId>
3    <artifactId>gson</artifactId>
4    <version>2.8.5</version>
5</dependency>

operación Json específico de destino de almacenamiento es como sigue:

Por Gson.toJson (src Object) convertir el objeto en una cadena Json de usuario, (String key, milisegundos de largo, valor String) psetex a continuación en la cadena de JSON en Redis.

La adquisición de un objeto JSON haga lo siguiente:

Por get (String key) objeto de usuario de cadena JSON, entonces Gson.fromJson (JSON cadena, Clase <T> classOfT) para convertir la cadena en JSON objeto Usuario.

Para guardar y recuperar objetos JSON código específico de la siguiente manera por:

 1@Service
 2public class JedisJsonCacheService extends JedisCacheServiceSupport {
 3
 4    private static Logger logger = LoggerFactory.getLogger(JedisJsonCacheService.class);
 5
 6    @Autowired
 7    private JedisPool jedisPool;
 8
 9    /**
10     * 获取缓存中的对象
11     * @param key
12     * @param clazz
13     * @return
14     */
15    public Object getObject(String key,Class clazz) {
16        Jedis jedis = null;
17        Object object = null;
18        try {
19            jedis = jedisPool.getResource();
20            String objectJson = jedis.get(key);
21             object = toObjce(objectJson,clazz);
22        }catch (Exception e){
23            e.printStackTrace();
24        }finally {
25            close(jedis);
26        }
27        return object;
28    }
29
30    /**
31     * 将对象缓存到Redis中,设置默认过期时间
32     * @param key
33     * @param value
34     */
35    public void putObject(String key, Object value) {
36        putObject(key, value,null);
37    }
38
39    /**
40     * 将对象缓存到Redis中,自定义认过期时间
41     * @param key
42     * @param value
43     * @param expireTime
44     */
45    public void putObject(String key, Object value, Long expireTime) {
46        Jedis jedis = null;
47        try {
48            jedis = jedisPool.getResource();
49            jedis.psetex(key,getExpireTime(expireTime),toJson(value));
50        }catch (Exception e){
51            e.printStackTrace();
52        }finally {
53            close(jedis);
54        }
55    }
56
57
58
59    /**
60     * 将对象转换成Json串
61     * @param value
62     * @return
63     */
64    private String toJson(Object value) {
65        Gson gson = new Gson();
66        return gson.toJson(value);
67    }
68
69    /**
70     * 将Json串转换成对象
71     * @param json
72     * @param clazz
73     * @return
74     */
75    private Object  toObjce(String json,Class clazz) {
76        Gson gson = new Gson();
77        return gson.fromJson(json,clazz);
78    }
79}

serialización de demostración

Prueba JedisJsonCacheServiceTest putObject (un objeto colocado en la memoria caché), el getObject (obtener el objeto de la caché), el código específico es el siguiente:

 1@RunWith(SpringRunner.class)
 2@SpringBootTest
 3public class JedisJsonCacheServiceTest {
 4
 5    private Logger logger = LoggerFactory.getLogger(JedisJsonCacheServiceTest.class);
 6    @Autowired
 7    private JedisJsonCacheService jedisJsonCacheService;
 8
 9    @Test
10    public void putObject() {
11        User user = new User("zhuoqiammingyue2",20);
12        jedisJsonCacheService.putObject("user02",user);
13        logger.info("缓存用户成功!");
14    }
15
16    @Test
17    public void getObject() {
18        User user = (User)jedisJsonCacheService.getObject("user02",User.class);
19        logger.info("User name={},age={}",user.getName(),user.getAge());
20    }
21}

putObject información de registro:

12020-02-27 07:57:16.184  INFO 3692 --- [           main] c.l.cache.JedisJsonCacheServiceTest      : Started JedisJsonCacheServiceTest in 7.92 seconds (JVM running for 10.786)
22020-02-27 07:57:16.852  INFO 3692 --- [           main] c.l.cache.JedisJsonCacheServiceTest      : 缓存用户成功!

getObject registrar información:

12020-02-27 07:57:56.359  INFO 27624 --- [           main] c.l.cache.JedisJsonCacheServiceTest      : Started JedisJsonCacheServiceTest in 7.364 seconds (JVM running for 9.256)
22020-02-27 07:57:56.824  INFO 27624 --- [           main] c.l.cache.JedisJsonCacheServiceTest      : User name=zhuoqiammingyue2,age=20

resumen

JSON y secuencias de estas dos maneras, en el desarrollo real pueden elegir de acuerdo a sus preferencias. de manera JSON usando Gson Por supuesto, también puede utilizar FASTJSON, utilizando una secuencia de serialización y deserialización nativa de Java, pero también se puede cambiar a una serialización de Hesse más eficiente y deserialización.

El código de ejemplo

Mi entorno local de la siguiente manera:

  • SpringBoot Versión: 2.1.0.RELEASE

  • Apache Maven Versión: 3.6.0

  • Versión de Java: 1.8.0_144

  • Idea: idea IntellJ

Durante la operación, tales como problemas pueden springbootexamples en mis repositorio GitHub en el módulo de llamada primavera-boot-2.x-redescubrir jedis-objectcache comparar Ver proyecto

GitHub: https: //github.com/zhuoqianmingyue/springbootexamples

fuente original: https: //blog.csdn.net/ljk126wy/article/details/104519059

【Final】

"Plan de Trabajo [el segundo trimestre] - la capacidad de aprendizaje Challenge" comenzó!
A partir de ahora hasta el 21 de marzo debe fluir para apoyar el autor original, la exclusiva [más] medalla esperando a que reto

lectura recomendada 

micro-canal de programa pequeño QQ fue cerrado debido a las irregularidades; rotura grande de Microsoft en botnets más grandes del mundo; Código VS 1,43 liberación | Geeks titulares

propaganda oficial! Ali en 5G, el establecimiento de la nueva infraestructura de laboratorio fuerza XG

tecnología de vanguardia de la misión: procesos y métodos de mapa de conocimiento de construcción

en Alemania Wuhan programador en las zonas afectadas: descargar datos de la madrugada, el trabajo de la velocidad de impacto

vulnerabilidades y amenazas nube Lo nativa? cómo la seguridad nativa nube? Aquí está todo lo que necesita saber!

programación sencillo sistema Bitcoin analógico blanco, un movimiento de la mano y le llevará a escribir! (Con el código) | Bowen destacados

Nos fijamos en cada punto, en serio como favorito

Liberadas 1817 artículos originales · ganado elogios 40000 + · Vistas 16,440,000 +

Supongo que te gusta

Origin blog.csdn.net/csdnnews/article/details/104832409
Recomendado
Clasificación