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

来源:互联网 发布:淘宝打假部门联系方式 编辑:程序博客网 时间:2024/06/14 00:29

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

1:windows版    redis。:

2::jar包。

commons-pool2-2.3

jedis-2.7.2.jar

 

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

-
package com.hdys.www.redisDao;

import com.dyuproject.protostuff.runtime.RuntimeSchema;

import org.springframework.stereotype.Component;

import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.hdys.www.pojo.ProductList;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

@Component
public class RedisDao {

    private final static JedisPool jedisPool;
    private Jedis jedis;

    // 创建一个schema用来序列化
    private RuntimeSchema<ProductList> schema = RuntimeSchema.createFrom(ProductList.class);

    /**
     * 构造方法
     *
     * @param ip
     *            访问的ip
     * @param port
     *            访问的端口
     */
    /*public RedisDao(String uri, int port) {
        jedisPool = new JedisPool(uri, port);
    }
*/
//静态代码块初始化jedisPool
  static {
        //RedisDao redisDao = new RedisDao("localhost", 6379);
        jedisPool = new JedisPool("localhost", 6379);
    }

    public ProductList getProductInfo(int ProductId) {

        // redis操作
        try {
            Jedis jedis = jedisPool.getResource();
            try {
                // 在redis中存放时,key的书写规则,官方推荐,对象:对象属性
                String key = "Product" + ProductId;

                // 自定义序列化
                // 在redis中获取的值一定是一个字节数组,需要通过反序列化转换成java对象
                byte[] bytes = jedis.get(key.getBytes());
                if (bytes != null) {
                    // 获取一个空对象
                    ProductList productList = schema.newMessage();
                    // 反序列化后放置在productList中
                    ProtostuffIOUtil.mergeFrom(bytes, productList, schema);
                    return productList;
                }
            } finally {
                jedis.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public String putProductInfo(ProductList productList) {
        try {
            Jedis jedis = jedisPool.getResource();
            try {
                // 通过对应的键存放user对象,建的ID唯一,一般使用ID
                String key = "Product" + productList.getSid();

                // 自定义序列化操作,利用protostuff将对象序列化成字节数组
                byte[] bytes = ProtostuffIOUtil.toByteArray(productList, 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属于性能相当优秀的一种

 ----------------------------------------------------------------------------我是华丽的分割线——————————————————————————————————————————


JUNIT测试:

    @Test
     public void testRedis(){
     //首先去redis中寻找是否存在缓存的用户信息
         productInfo = redisDao.getProductInfo(1);
     //如果不存在,那就在缓存中放置一个用户信息
     if(productInfo == null)
     {
         //先取到
         productInfo=productListService.getProductInfo(2);
         //put
         String result = redisDao.putProductInfo(productInfo);       
         System.out.println(result);
     }else{
         System.out.println("无");
          System.out.println(productInfo);
     }

     }



 实际应用:


package com.hdys.www.servicesImp;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.hdys.www.mappers.ProductListMapper;
import com.hdys.www.pojo.ProductList;
import com.hdys.www.redisDao.RedisDao;
import com.hdys.www.services.ProductListService;

@Service
public class ProductListServiceImp implements ProductListService{
    private final Logger log = LoggerFactory.getLogger(ProductListServiceImp.class);
    @Autowired
    private ProductListMapper productListMapper;
    
    private List<ProductList> products;
    
    @Autowired
    private ProductList productInfo;
    
    @Autowired
    private RedisDao redisDao;


    public List<ProductList> getProductList() {
        try {
            products = productListMapper.selectProducts();
        } catch (Exception e) {
            log.info("闔キ蜿門膚蜩∝、ア雍・�シ悟シょクク菫。諱ッ�シ�" + e);
        }
        return products;
    }

    public ProductList getProductInfo(int sid) {
        try {
            productInfo = redisDao.getProductInfo(sid);
             //如果不存在,那就在缓存中放置一个用户信息
             if(productInfo == null)
             {
                 //先取到
                 productInfo=productListMapper.selectProductsInfo(sid);
                 //put
                 redisDao.putProductInfo(productInfo);       
             }else{
                    return productInfo;
             }
        } catch (Exception e) {
            log.info("闔キ蜿門膚蜩∽ソ。諱ッ螟ア雍・�シ悟シょクク菫。諱ッ�シ�" + e);
        }
        

        return productInfo;
    }


}





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

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