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!
Nos fijamos en cada punto, en serio como favorito