Using java redis to implement redis Message Queue using jedis
Application scenarios
Recently, I am working on a project in the company and need to store chat content. Considering the high I/O connections and frequent connections in the database, I decided to use the cache.
I learned from the Internet that redis can store binary data for all content, while java can serialize all objects. The serialization method will be provided in the following code.
Serialization
Here I have compiled a java serialization tool that converts an object to byte [] and deserializes it into a java object based on the byte [] array;
ByteArrayOutputStream and ByteArrayInputStream are mainly used;
Note that each custom object to be serialized must implement the Serializable interface;
The Code is as follows:
Package com. bean. util; import java. io. byteArrayInputStream; import java. io. byteArrayOutputStream; import java. io. IOException; import java. io. objectInputStream; import java. io. objectOutputStream; public class ObjectUtil {/** Object to byte [] * @ param obj * @ return * @ throws IOException */public static byte [] objectToBytes (Object obj) throws Exception {ByteArrayOutputStream bo = new ByteArrayOutputStream (); ObjectOutputStream oo = new ObjectOutputStream (bo); oo. writeObject (obj); byte [] bytes = bo. toByteArray (); bo. close (); oo. close (); return bytes;}/** byte [] convert Object * @ param bytes * @ return * @ throws Exception */public static Object bytesToObject (byte [] bytes) throws Exception {ByteArrayInputStream in = new ByteArrayInputStream (bytes); ObjectInputStream sIn = new ObjectInputStream (in); return sIn. readObject ();}}
Defines a message class, which is mainly used to receive the message content and set the following message table.
Package com. bean; import java. io. serializable;/** define the content of the Message received by the Message class and set the subscript of the Message * @ author lenovo **/public class Message implements Serializable {private static final long serialVersionUID = 7792729L; private int id; private String content; public int getId () {return id;} public void setId (int id) {this. id = id;} public String getContent () {return content;} public void setContent (String content) {this. content = content ;}}
Using redis for queue, we adopt the list push and pop operations in redis;
Combined with the characteristics of the queue:
Only new elements can be inserted at one end. Only FIFO is allowed at the end of the queue.
In redis, lpush (rpop) or rpush (lpop) can meet the requirements. In redis, the objects to push or pop in list must be converted to byte [].
Java uses Jedis for redis storage and redis connection pool settings
Package com. redis. util; import java. util. list; import java. util. map; import java. util. set; import redis. clients. jedis. jedis; import redis. clients. jedis. jedisPool; import redis. clients. jedis. jedisPoolConfig; public class JedisUtil {private static String JEDIS_IP; private static int JEDIS_PORT; private static String JEDIS_PASSWORD; // private static String secret; private static JedisPool jedisPool; static {Configuration conf = Configuration. getInstance (); JEDIS_IP = conf. getString ("jedis. ip "," 127.0.0.1 "); JEDIS_PORT = conf. getInt ("jedis. port ", 6379); JEDIS_PASSWORD = conf. getString ("jedis. password ", null); JedisPoolConfig config = new JedisPoolConfig (); config. setMaxActive (5000); config. setMaxIdle (256); // 20config. setMaxWait (5000L); config. setTestOnBorrow (true); config. setTestOnReturn (true); config. setTestWhileIdle (true); config. setMinEvictableIdleTimeMillis (60000l); config. setTimeBetweenEvictionRunsMillis (3000l); config. setNumTestsPerEvictionRun (-1); glasispool = new glasispool (config, glasis_ip, glasis_port, 60000 );} /*** get data ** @ param key * @ return */public static String get (String key) {String value = null; Jedis jedis = null; try {jedis = jedisPool. getResource (); value = jedis. get (key) ;}catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} return value;} public static void close (Jedis jedis) {try {jedisPool. returnResource (jedis);} catch (Exception e) {if (jedis. isConnected () {jedis. quit (); jedis. disconnect () ;}}/ *** get data ** @ param key * @ return */public static byte [] get (byte [] key) {byte [] value = null; Jedis jedis = null; try {jedis = jedisPool. getResource (); value = jedis. get (key) ;}catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} return value;} public static void set (byte [] key, byte [] value) {Jedis jedis = null; try {jedis = jedisPool. getResource (); jedis. set (key, value);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} public static void set (byte [] key, byte [] value, int time) {Jedis jedis = null; try {jedis = jedisPool. getResource (); jedis. set (key, value); jedis. expire (key, time);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} public static void hset (byte [] key, byte [] field, byte [] value) {Jedis jedis = null; try {jedis = jedisPool. getResource (); jedis. hset (key, field, value);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace () ;}finally {// return to connection pool close (jedis) ;}} public static void hset (String key, String field, String value) {Jedis jedis = null; try {jedis = jedisPool. getResource (); jedis. hset (key, field, value);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis );}} /*** get data ** @ param key * @ return */public static String hget (String key, String field) {String value = null; Jedis jedis = null; try {jedis = jedisPool. getResource (); value = jedis. hget (key, field);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} return value ;} /*** get data ** @ param key * @ return */public static byte [] hget (byte [] key, byte [] field) {byte [] value = null; Jedis jedis = null; try {jedis = jedisPool. getResource (); value = jedis. hget (key, field);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} return value;} public static void hdel (byte [] key, byte [] field) {Jedis jedis = null; try {jedis = jedisPool. getResource (); jedis. hdel (key, field);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis );}} /*** storage REDIS queue ordered storage * @ param byte [] key reids key name * @ param byte [] value key value */public static void lpush (byte [] key, byte [] value) {Jedis jedis = null; try {jedis = jedisPool. getResource (); jedis. lpush (key, value);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis );}} /*** store REDIS queue reverse storage * @ param byte [] key reids key name * @ param byte [] value key value */public static void rpush (byte [] key, byte [] value) {Jedis jedis = null; try {jedis = jedisPool. getResource (); jedis. rpush (key, value);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace () ;}finally {// return to the connection pool close (jedis) ;}}/*** to bring up the last element (tail element) in the list source, return to the client * @ param byte [] key reids key name * @ param byte [] value key value */public static void rpoplpush (byte [] key, byte [] destination) {Jedis jedis = null; try {jedis = jedisPool. getResource (); jedis. rpoplpush (key, destination);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis );}} /*** get queue data ** @ param byte [] key name * @ return */public static List
LpopList (byte [] key) {List
List = null; Jedis jedis = null; try {jedis = jedisPool. getResource (); list = jedis. lrange (key, 0,-1);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} return list ;} /*** get queue data ** @ param byte [] key name * @ return */public static byte [] rpop (byte [] key) {byte [] bytes = null; Jedis jedis = null; try {jedis = jedisPool. getResource (); bytes = jedis. rpop (key);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} return bytes;} public static void hmset (Object key, Map
Hash) {Jedis jedis = null; try {jedis = jedisPool. getResource (); jedis. hmset (key. toString (), hash);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} public static void hmset (Object key, Map
Hash, int time) {Jedis jedis = null; try {jedis = jedisPool. getResource (); jedis. hmset (key. toString (), hash); jedis. expire (key. toString (), time);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} public static List
Hmet (Object key, String... fields) {List
Result = null; Jedis jedis = null; try {jedis = jedisPool. getResource (); result = jedis. hmet (key. toString (), fields);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} return result;} public static Set
Hkeys (String key) {Set
Result = null; Jedis jedis = null; try {jedis = jedisPool. getResource (); result = jedis. hkeys (key);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} return result;} public static List
Lrange (byte [] key, int from, int to) {List
Result = null; Jedis jedis = null; try {jedis = jedisPool. getResource (); result = jedis. lrange (key, from, to);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} return result;} public static Map
HgetAll (byte [] key) {Map
Result = null; Jedis jedis = null; try {jedis = jedisPool. getResource (); result = jedis. hgetAll (key);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace ();} finally {// return to connection pool close (jedis);} return result;} public static void del (byte [] key) {Jedis jedis = null; try {jedis = jedisPool. getResource (); jedis. del (key);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace () ;}finally {// return to connection pool close (jedis) ;}} public static long llen (byte [] key) {long len = 0; Jedis jedis = null; try {jedis = jedisPool. getResource (); jedis. llen (key);} catch (Exception e) {// release the redis object jedisPool. returnBrokenResource (jedis); e. printStackTrace () ;}finally {// return to connection pool close (jedis) ;}return len ;}}
Configuration is mainly used to read redis Configuration information
package com.redis.util;import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class Configuration extends Properties {private static final long serialVersionUID = 50440463580273222L;private static Configuration instance = null;public static synchronized Configuration getInstance() {if (instance == null) {instance = new Configuration();}return instance;}public String getProperty(String key, String defaultValue) {String val = getProperty(key);return (val == null || val.isEmpty()) ? defaultValue : val;}public String getString(String name, String defaultValue) {return this.getProperty(name, defaultValue);}public int getInt(String name, int defaultValue) {String val = this.getProperty(name);return (val == null || val.isEmpty()) ? defaultValue : Integer.parseInt(val);}public long getLong(String name, long defaultValue) {String val = this.getProperty(name);return (val == null || val.isEmpty()) ? defaultValue : Integer.parseInt(val);}public float getFloat(String name, float defaultValue) {String val = this.getProperty(name);return (val == null || val.isEmpty()) ? defaultValue : Float.parseFloat(val);}public double getDouble(String name, double defaultValue) {String val = this.getProperty(name);return (val == null || val.isEmpty()) ? defaultValue : Double.parseDouble(val);}public byte getByte(String name, byte defaultValue) {String val = this.getProperty(name);return (val == null || val.isEmpty()) ? defaultValue : Byte.parseByte(val);}public Configuration() {InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream("config.xml");try {this.loadFromXML(in);in.close();} catch (IOException e) {}}}
Test redis queue
Package com. quene. test; import com. bean. message; import com. bean. util. objectUtil; import com. redis. util. jedisUtil; public class TestRedisQuene {public static byte [] redisKey = "key ". getBytes (); static {init ();} public static void main (String [] args) {pop ();} private static void pop () {byte [] bytes = JedisUtil. rpop (redisKey); Message msg = (Message) ObjectUtil. bytesToObject (bytes); if (msg! = Null) {System. out. println (msg. getId () + "" + msg. getContent () ;}} private static void init () {Message msg1 = new Message (1, "content 1"); JedisUtil. lpush (redisKey, ObjectUtil. objectToBytes (msg1); Message msg2 = new Message (2, "content 2"); JedisUtil. lpush (redisKey, ObjectUtil. objectToBytes (msg2); Message msg3 = new Message (3, "content 3"); JedisUtil. lpush (redisKey, ObjectUtil. objectToBytes (msg3);} the test result is as follows:
1 content 1
2 content 2
3 content 3