Java使⽤redis:将数据插⼊redis缓存的⽅式
背景:
当redis⾥⾯需要存储 “key-字符串,value-对象” 时,是不能直接存对象,⽽是需要将序列化后或转换为JSON后的对象存进redis。
redis没有实现内部序列化对象的功能,所以需要⾃⼰提前序列化对象及转换为Json对象。
序列化介绍:
序列化的⽅法有很多,⽐如java原⽣序列化(需要实现Serializable接⼝)、json序列化、protobuff序列化。
protobuff序列化:告诉我对象的class,内部有schema来描述你的class是什么结构,class必须有get/set⽅法这种标准的类,⽽不是string等类关于Serializable和protobuff序列化的介绍在我的上⼀篇⽂章:
由于之前对redis有很⼤兴趣,在使⽤redis当做数据缓存;所以趁着这些天的时间,⾃⼰写了⼀个将数据插⼊redis的demo;这⾥仅供⾃⼰后期学习笔记参考,若有不对的地⽅,请轻拍砖!
第⼀种:将数据对象转换为JSONString存⼊redis
1.⾸先pom⽂件导⼊
<!-- Jedis connection redis-->
<dependency>
<groupId>org.apachemons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- protostuff序列化依赖  -->
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.0.8</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.0.8</version>
</dependency>
redis.pool.maxTotal=1000
redis.pool.maxIdle=200
redis.pool.maxWaitMillis=2000
stOnBorrow=true
jedis.host=127.0.0.1
jedis.port=6379
<context:property-placeholder location="classpath:redis.properties" file-encoding="utf-8" ignore-unresolvable="true"></context:property-placeholder>
<!--  Jedis config-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.pool.maxTotal}"/>
<property name="maxIdle" value="${redis.pool.maxIdle}"/>
<property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>
<property name="testOnBorrow" value="${stOnBorrow}"/>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg ref="jedisPoolConfig"/>
<constructor-arg value="${jedis.host}" type="java.lang.String"/>
<constructor-arg type="int" value="${jedis.port}"/>
</bean>
3.写⼀个RedisUtil来获取和释放redis资源,得到Jedis对象
/**
* Created by ${HeJD} on 2018/6/29.
*/
@Component
public class RedisUtil {
/**
* ⽇志记录
*/
private static final Logger LOG = Logger(RedisUtil.class);
/
**
* redis 连接池,这⾥jedisPool我们再之前spring配置中配置好了,交给spring管理,这⾥可以⾃动注⼊
*/
@Autowired
private JedisPool jedisPool;
public void setPool(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
/**
* 获取jedis
* @return
*/
public Jedis getResource(){
Jedis jedis =null;
try {
jedis =Resource();
} catch (Exception e) {
LOG.info("can't  get  the redis resource");
}
return jedis;
}
/**
* 关闭连接
* @param jedis
*/
public void disconnect(Jedis jedis){
jedis.disconnect();
}
/**
* 将jedis 返还连接池
* @param jedis
*/
public void returnResource(Jedis jedis){
if(null != jedis){
if(null != jedis){
try {
} catch (Exception e) {
LOG.info("can't return jedis to jedisPool");
}
}
}
/**
* ⽆法返还jedispool,释放jedis客户端对象,
* @param jedis
*/
public void brokenResource(Jedis jedis){
if (jedis!=null) {
try {
} catch (Exception e) {
LOG.info("can't release jedis Object");
}
}
}
}
4. 创建好RedisUtil后,我们来写⼀个对Redis操作的接⼝及其实现类(注意导包)
import java.util.Map;
/**
* Created by ${HeJD} on 2018/6/29.
*/
public interface RedisCacheStorage<K,V> {
/**
* 在redis数据库中插⼊ key  和value
* @param key
* @param value
* @return
*/
boolean set(K key,V value);
/**
* 在redis数据库中插⼊ key  和value 并且设置过期时间
* @param key
* @param value
* @param exp 过期时间
* @return
*/
boolean set(K key, V value, int exp);
/
**
* 根据key 去redis 中获取value
* @param key
* @return
*/
V get(K key,Object object);
/**
* 删除redis库中的数据
* @param key
* @return
*/
boolean remove(K key);
/**
* 设置哈希类型数据到redis 数据库
* @param cacheKey 可以看做⼀张表
* @param key  表字段
* @param value
* @return
*/
boolean hset(String cacheKey,K key,V value);
/**
* 获取哈希表数据类型的值
* @param cacheKey
* @param key
* @return
*/
V hget(String cacheKey,K key,Object object);
/**
* 获取哈希类型的数据
* @param cacheKey
* @return
*/
Map<K,V> hget(String cacheKey,Object object);
redis支持的五种数据类型}
all.service.RedisCacheStorage;
all.util.RedisUtil;
import net.sf.json.JSONObject;
import org.apachemons.lang3.StringUtils;
import org.slf4j.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.ptions.JedisException;
import java.util.HashMap;
import java.util.Map;
/**
* Created by ${HeJD} on 2018/6/29.
*/
@Service("redisCacheStorage")
public class RedisCacheStorageImpl<V>  implements RedisCacheStorage<String,V>{
//⽇志记录
private Logger log= Logger(RedisCacheStorageImpl.class);
/**
* 默认过时时间
*/
private static final int EXPRIE_TIME =3600*24;
/**
* 获取Jedis相关操作
*/
@Autowired
private RedisUtil redisUtil;
@Override
public boolean set(String key, V value) {
return set(key,value,EXPRIE_TIME);
}
@Override
public boolean set(String key, V value, int exp) {
Jedis jedis=null;
if(StringUtils.isEmpty(key)){
return  false;
}
try {
//获取jedis对象
jedis= Resource();
//使⽤对象转换为Json格式插⼊redis
JSONObject json = JSONObject.fromObject(value);//将java对象转换为json对象            String jsonValue = String();//将json对象转换为json字符串
jedis.setex(key,exp,jsonValue);
}catch (Exception e){
//释放jedis对象
redisUtil.brokenResource(jedis);
log.info("client can't connect server");
return  false;
}finally {
//返还连接池
return true;
}
}
@Override
public V get(String key,Object object) {
Jedis jedis=null;
V v=null;
if(StringUtils.isEmpty(key)){

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。