zoukankan      html  css  js  c++  java
  • 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包,并且告诉你依赖的关系,非常方便

  • 相关阅读:
    微信小程序,地址助手
    Cordova 项目,升级 Xcode 从 10.3 到 11.0 扫坑日记
    MySQL 重启提示超出可打开文件数限制|Buffered warning: Changed limits: max_open_files: 1024
    “基于名称”的虚拟主机支持
    阿里云免费证书配置
    微信小程序开发常见问题
    webpack 打包压缩 ES6文件报错UglifyJs + Unexpected token punc «(», expected punc «:»
    本地不安装webpack,找不到webpack包
    Hdu1097(计算a的b次幂最后一位数值)
    计算某天是所在年的第几天
  • 原文地址:https://www.cnblogs.com/linkstar/p/5637794.html
Copyright © 2011-2022 走看看