From 05b028e4f119ec0ebdcb22a28faaf39dc0c208eb Mon Sep 17 00:00:00 2001 From: javahongxi Date: Sun, 30 Dec 2018 12:51:21 +0800 Subject: [PATCH] =?UTF-8?q?RedisService=E5=B0=81=E8=A3=85=E7=AE=80?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../whatsmars/redis/client/RedisTemplate.java | 81 +++++++++++++++++++ .../redis/client/service/RedisService.java | 17 ++++ .../client/service/impl/RedisServiceImpl.java | 74 +++++++++++++---- .../spring/boot/controller/InitRunner.java | 8 ++ .../whatsmars/spring/boot/model/User.java | 4 +- 5 files changed, 166 insertions(+), 18 deletions(-) diff --git a/whatsmars-redis/src/main/java/org/hongxi/whatsmars/redis/client/RedisTemplate.java b/whatsmars-redis/src/main/java/org/hongxi/whatsmars/redis/client/RedisTemplate.java index aac8e0e1..b55dcdba 100644 --- a/whatsmars-redis/src/main/java/org/hongxi/whatsmars/redis/client/RedisTemplate.java +++ b/whatsmars-redis/src/main/java/org/hongxi/whatsmars/redis/client/RedisTemplate.java @@ -1,5 +1,7 @@ package org.hongxi.whatsmars.redis.client; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPool; @@ -10,10 +12,13 @@ * 单个redis模式作为sharding模式的特例(配一个host:port即可) * JedisCluster不用封装,直接用即可 */ +@Slf4j public class RedisTemplate { private ShardedJedisPool shardedJedisPool; + private ObjectMapper objectMapper = new ObjectMapper(); + public T execute(RedisCallback action) { ShardedJedis jedis = fetchJedis(); try { @@ -155,6 +160,15 @@ public Set smembers(String key) { } } + public boolean sismember(String key, String value) { + ShardedJedis jedis = fetchJedis(); + try { + return jedis.sismember(key, value); + } finally { + release(jedis); + } + } + public long lpush(String key, String... values) { ShardedJedis jedis = fetchJedis(); try { @@ -200,6 +214,56 @@ public String hget(String key, String field) { } } + public boolean hexists(String key, String field) { + ShardedJedis jedis = fetchJedis(); + try { + return jedis.hexists(key, field); + } finally { + release(jedis); + } + } + + public long hdel(String key, String... fields) { + ShardedJedis jedis = fetchJedis(); + try { + return jedis.hdel(key, fields); + } finally { + release(jedis); + } + } + + public void set(String key, T value, int seconds) throws Exception { + ShardedJedis jedis = fetchJedis(); + try { + jedis.setex(key.getBytes(), seconds, this.serialize(value)); + } finally { + release(jedis); + } + } + + public void set(String key, T value) throws Exception { + ShardedJedis jedis = fetchJedis(); + try { + jedis.set(key.getBytes(), this.serialize(value)); + } finally { + release(jedis); + } + } + + public T get(String key, Class clazz) { + byte[] value = this.getBytes(key); + return this.deserialize(value, clazz); + } + + public byte[] getBytes(String key) { + ShardedJedis jedis = fetchJedis(); + try { + return jedis.get(key.getBytes()); + } finally { + release(jedis); + } + } + public void setShardedJedisPool(ShardedJedisPool shardedJedisPool) { this.shardedJedisPool = shardedJedisPool; } @@ -213,4 +277,21 @@ private void release(ShardedJedis jedis) { jedis.close(); } } + + public void setObjectMapper(ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + } + + private byte[] serialize(T value) throws Exception { + return objectMapper.writeValueAsBytes(value); + } + + private T deserialize(byte[] value, Class clazz) { + try { + return objectMapper.readValue(value, clazz); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return null; + } } diff --git a/whatsmars-redis/src/main/java/org/hongxi/whatsmars/redis/client/service/RedisService.java b/whatsmars-redis/src/main/java/org/hongxi/whatsmars/redis/client/service/RedisService.java index 49a54a1c..13ae73d4 100644 --- a/whatsmars-redis/src/main/java/org/hongxi/whatsmars/redis/client/service/RedisService.java +++ b/whatsmars-redis/src/main/java/org/hongxi/whatsmars/redis/client/service/RedisService.java @@ -1,5 +1,6 @@ package org.hongxi.whatsmars.redis.client.service; +import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; @@ -42,6 +43,22 @@ public interface RedisService { Set smembers(String key); + boolean sismember(String key, String value); + + void hset(String key, String hashKey, String value); + + String hget(String key, String hashKey); + + boolean hexists(String key, String hashKey); + + void hdel(String key, String... hashKeys); + + long leftPush(String key, Serializable value); + + Serializable rightPop(String key); + + List range(String key, long start, long end); + void convertAndSend(String channel, Object obj); void delete(String key); diff --git a/whatsmars-redis/src/main/java/org/hongxi/whatsmars/redis/client/service/impl/RedisServiceImpl.java b/whatsmars-redis/src/main/java/org/hongxi/whatsmars/redis/client/service/impl/RedisServiceImpl.java index ba618624..791dd284 100644 --- a/whatsmars-redis/src/main/java/org/hongxi/whatsmars/redis/client/service/impl/RedisServiceImpl.java +++ b/whatsmars-redis/src/main/java/org/hongxi/whatsmars/redis/client/service/impl/RedisServiceImpl.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.hongxi.whatsmars.redis.client.service.RedisService; import org.springframework.dao.DataAccessException; @@ -30,6 +31,8 @@ public class RedisServiceImpl implements RedisService { private RedisTemplate redisTemplate; @Resource private StringRedisTemplate stringRedisTemplate; + @Setter + private ObjectMapper objectMapper = new ObjectMapper(); @Override public void set(String key, String value) { @@ -111,6 +114,49 @@ public Set smembers(String key) { return stringRedisTemplate.opsForSet().members(key); } + @Override + public boolean sismember(String key, String value) { + return stringRedisTemplate.opsForSet().isMember(key, value); + } + + @Override + public void hset(String key, String hashKey, String value) { + redisTemplate.opsForHash().put(key, hashKey, value); + } + + @Override + public String hget(String key, String hashKey) { + if (hexists(key, hashKey)) { + return redisTemplate.opsForHash().get(key, hashKey).toString(); + } + return null; + } + + @Override + public boolean hexists(String key, String hashKey) { + return redisTemplate.opsForHash().hasKey(key, hashKey); + } + + @Override + public void hdel(String key, String... hashKeys) { + redisTemplate.opsForHash().delete(key, hashKeys); + } + + @Override + public long leftPush(String key, Serializable value) { + return redisTemplate.opsForList().leftPush(key, value); + } + + @Override + public Serializable rightPop(String key) { + return redisTemplate.opsForList().rightPop(key); + } + + @Override + public List range(String key, long start, long end) { + return redisTemplate.opsForList().range(key, start, end); + } + @Override public void convertAndSend(String channel, Object obj) { assert obj != null; @@ -150,22 +196,8 @@ public void set(String key, T value) throws Exception { @Override public T get(String key, Class clazz) { - return redisTemplate.execute(new RedisCallback() { - @Override - public T doInRedis(RedisConnection connection) throws DataAccessException { - byte[] value = connection.get(key.getBytes()); - if (value == null) { - return null; - } - ObjectMapper objectMapper = new ObjectMapper(); - try { - return objectMapper.readValue(value, clazz); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - return null; - } - }); + byte[] value = this.getBytes(key); + return this.deserialize(value, clazz); } @Override @@ -201,8 +233,16 @@ public byte[] doInRedis(RedisConnection connection) throws DataAccessException { } private byte[] serialize(T value) throws Exception { - ObjectMapper objectMapper = new ObjectMapper(); return objectMapper.writeValueAsBytes(value); } + private T deserialize(byte[] value, Class clazz) { + try { + return objectMapper.readValue(value, clazz); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return null; + } + } diff --git a/whatsmars-spring-boot/src/main/java/org/hongxi/whatsmars/spring/boot/controller/InitRunner.java b/whatsmars-spring-boot/src/main/java/org/hongxi/whatsmars/spring/boot/controller/InitRunner.java index ae7f9bbd..7b3d7377 100644 --- a/whatsmars-spring-boot/src/main/java/org/hongxi/whatsmars/spring/boot/controller/InitRunner.java +++ b/whatsmars-spring-boot/src/main/java/org/hongxi/whatsmars/spring/boot/controller/InitRunner.java @@ -55,5 +55,13 @@ public void run(String... args) throws Exception { redisService.sadd("countries", "China", "America", "Japan"); System.out.println(redisTemplate.opsForSet().isMember("countries", "China")); // fasle System.out.println(stringRedisTemplate.opsForSet().isMember("countries", "China")); // true + + redisService.hset("menu", "A", "a"); + System.out.println(redisService.hget("menu", "A")); + + redisService.leftPush("message", "haha"); + redisService.leftPush("message", user); + System.out.println(redisService.rightPop("message")); + System.out.println(redisService.rightPop("message")); } } diff --git a/whatsmars-spring-boot/src/main/java/org/hongxi/whatsmars/spring/boot/model/User.java b/whatsmars-spring-boot/src/main/java/org/hongxi/whatsmars/spring/boot/model/User.java index 56908a0b..3920a37b 100644 --- a/whatsmars-spring-boot/src/main/java/org/hongxi/whatsmars/spring/boot/model/User.java +++ b/whatsmars-spring-boot/src/main/java/org/hongxi/whatsmars/spring/boot/model/User.java @@ -2,12 +2,14 @@ import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.util.Date; /** * Created by shenhongxi on 2017/6/26. */ -public class User { +public class User implements Serializable { + private static final long serialVersionUID = 6469790070035101683L; @JsonProperty("user_id") // 有时候前端定义的字段名与后端不一致时采用此法处理 private Long id;