Fork me on GitHub

Redis(2)用jedis实现在java中使用redis

昨天已经在windows环境下安装使用了redis。

下面准备在java项目中测试使用redis。

redis官网推荐使用jedis来访问redis。所以首先准备了jedis的jar包,以及需要依赖的jar包。

commons-pool2-2.3

hamcrest-core-1.3

jedis-2.7.2.jar

 

因为redis也是属于一种数据库,也是对数据的访问,所以把他放置在dao层,与service分开

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.runtime.RuntimeSchema;
import com.xhxkj.ssm.entity.UserEntity;

/**
 * 访问redis数据层
 * @author XX
 *
 */
public class RedisDao {

    private final JedisPool jedisPool;//redis连接池
    
    /**
     * 构造方法
     * @param ip 访问的ip
     * @param port 访问的端口
     */
    public RedisDao(String ip, int port)
    {
        jedisPool = new JedisPool(ip,port);
    }
    
    //创建一个schema用来序列化
    private RuntimeSchema<UserEntity> schema = RuntimeSchema.createFrom(UserEntity.class);
    
    /**
     * 通过用户名获取redis中对应的用户信息
     * @param username 输入的用户名
     * @return 存在返回:这个对象,不存在返回:null
     */
    public UserEntity getUser(String username)
    {
        //redis操作
        try{
            Jedis jedis = jedisPool.getResource();
            try {
                //在redis中存放时,key的书写规则,官方推荐,对象:对象属性
                //也就是获取时利用“user:username”作为键来得到值
                String key = "user:" + username;
                
                //自定义序列化
                //在redis中获取的值一定是一个字节数组,需要通过反序列化转换成java对象
                byte[] bytes = jedis.get(key.getBytes());
                if(bytes != null)
                {
                    //获取一个空对象
                    UserEntity user = schema.newMessage();
                    //反序列化后放置在user中
                    ProtostuffIOUtil.mergeFrom(bytes, user, schema);
                    return user;
                }
            }finally{
                jedis.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
    
    
    /**
     * 在缓存中存放user对象
     * @param user
     * @return 成功返回“OK”;失败返回错误信息
     */
    public String putUser(UserEntity user)
    {
        try {
            Jedis jedis = jedisPool.getResource();
            try {
                //通过对应的键存放user对象
                String key = "user:" + user.getUsername();
                
                //自定义序列化操作,利用protostuff将对象序列化成字节数组
                byte[] bytes = ProtostuffIOUtil.toByteArray(user, schema, 
                        LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
                
                //缓存时间1小时,缓存的时间是用秒来计的
                int timeout = 60*60;
                
                //在redis中存放这个对象
                return jedis.setex(key.getBytes(),timeout,bytes);
            } finally{
                jedis.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

这里提供了两个方法,分别是put和get,其中需要用到序列化和反序列化的操作,用到的jar包有下面这几个

protostuff-core-1.0.8.jar

protostuff-runtime-1.0.8.jar

protostuff-collectionschema-1.0.8.jar

protostuff-api-1.0.8.jar

protostuff属于性能相当优秀的一种

 

在spring中配置

<!-- redisDao -->
    <bean id="redisDao" class="com.xxx.dao.redis.RedisDao">
        <constructor-arg index="0" value="localhost"/>
        <constructor-arg index="1" value="6379"/>
    </bean>

 

之后就可以直接在服务层调用redisDao的方法了

        //首先去redis中寻找是否存在缓存的用户信息
        UserEntity resultUser = redisDao.getUser("xx");
        //如果不存在,那就在缓存中放置一个用户信息
        if(resultUser == null)
        {
            String result = redisDao.putUser(user);
            System.out.println(result);
            return null;
        }
        else
        {
            return resultUser;
        }

 

需要注意的是,如果存放成功,返回是一个字符串“OK”

在使用前一定要确定你的redis服务处于开启状态,cmd窗口是开着的

 

因为网络上面很多都是用maven配置的,所以jar包比较难找,jar包间的依赖确实比较麻烦,推荐一个网站http://maven.outofmemory.cn/

这个网站能很好的找到各种jar包,并且告诉你依赖的关系,非常方便

posted @ 2016-07-03 11:51  LinkinStar  阅读(2566)  评论(0编辑  收藏  举报