zoukankan      html  css  js  c++  java
  • linux下安装redis

    一、Linux安装redis===================

    1,安装Redis

    先创建好安装路径:/data1/apps/redis2.6.14


    1.1,下载及安装

    wget http://redis.googlecode.com/files/redis-2.6.14.tar.gz   #或者直接在reids官方网站下载下来gz包   
    tar -zxvf redis-2.6.14.tar.gz     #解压
    cd redis-2.6.14    #进入redis安装目录
    make PREFIX=/data1/apps/redis2.6.14 install   #安装
    mkdir /data1/apps/redis2.6.14/etc    #创建目录同于存放配置文件

    cp   redis.conf   /data/apps/redis2.6.14/etc   

    1.2,可能会出现的错误提示
    >>提示1:
    make[3]: gcc:命令未找到
    >>解决
    yum -y install gcc-c++

    >>提示2:
    在包含自 adlist.c:34 的文件中:
    zmalloc.h:50:31: 错误:jemalloc/jemalloc.h:没有那个文件或目录
    zmalloc.h:55:2: 错误:#error "Newer version of jemalloc required"
    >>解决

    • make的时候加上 MALLOC=libc 参数

      make PREFIX=/data/apps/redis2.6.14 MALLOC=libc install

      cp   redis.conf   /etc/    #这个文件是redis启动的配置文件

    • 由于redis安装在/data1/apps/redis2.6.14/下,所以

      cd /data1/apps/redis2.6.14/ 进入这个目下,执行
      cp redis-benchmark redis-cli redis-server /usr/bin/
      这样就不用再执行时加上./了,而且可以在任何地方执行

      echo 1 > /proc/sys/vm/overcommit_memory

    • 设置内存分配策略(可选,根据服务器的实际情况进行设置) /proc/sys/vm/overcommit_memory

       可选值:0、1、2。
      0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

      1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
      2,表示内核允许分配超过所有物理内存和交换空间总和的内存
      值得注意的一点是,redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent 占用的内存为8G,这个时候也要同样分配8G的内存给child,如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)

    • 开启redis端口,修改防火墙配置文件

      vi /etc/sysconfig/iptables

    • 加入端口配置

      -A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT

    • 重新加载规则

      service iptables restart

    • 启动redis service

      redis-server /etc/redis.conf

      [3862] 19 Feb 23:10:56.339 * Max number of open files set to 10032
      [3862] 19 Feb 23:10:56.347 # Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now.

    [3862] 19 Feb 23:10:56.347 # Server started, Redis version 2.6.14
    [3862] 19 Feb 23:10:56.347 * The server is now ready to accept connections on port 6379

    • 查看进程,确定redis启动成功:

      ps -ef | grep redis
      [root@mtycentos ~]# ps -ef | grep redis
      root 3862 3666 0 23:10 pts/1 00:00:00 redis-server /etc/redis.conf
      root 3886 3866 0 23:11 pts/0 00:00:00 grep redis

    • 如果启动失败,大部分情况下是因为redis.conf的配置有问题。
    • 设置redis为后台守护进程:

      vi /etc/redis.conf
      # By default Redis does not run as a daemon. Use 'yes' if you need it.
      # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
      #daemonize no
      daemonize yes
      把no 改为 yes

    • 修改完成后关闭redis : redis-cli shutdown
    • 查看是否关闭:ps -ef | grep redis
    • 再次启动为守护进程:redis-server /etc/redis.conf

      [root@mtycentos ~]# ps -ef | grep redis
      root 3913 1 0 23:16 ? 00:00:00 redis-server /etc/redis.conf
      root 3917 3866 0 23:16 pts/0 00:00:00 grep redis

      OK,启动成功

    • 测试一把:

      进入redis客户端命令行:
      redis-cli 回车
      redis 127.0.0.1:6379>
      redis 127.0.0.1:6379> set name hanlu
      OK
      redis 127.0.0.1:6379> get name
      "hanlu"

    说明成功了。

    • 退出当前命令行:quit

      关闭redis:
      redis-cli shutdown

    • redis关闭后,缓存数据会自动保存到硬盘上,硬盘地址为redis.conf中的配置项dgfilename dump.rdb
    • 强制备份数据到磁盘:

      redis-cli save or redis-cli -p 6380 save (要制定端口进行备份)

    二、redis使用

    1、简介

    2、常用命令

    3、在linux中打开redis服务

    4、推荐使用redis管理工具Redis Desktop Manager

    5、下面即将redis缓存应用到myeclipse的web项目中:

    1)设计思路

    2)首先进行Jedis配置

        <!-- redis配置 -->
        <!-- 配置数据源(redis连接池) -->
        <bean id="jedisPoolConfig"
            class="redis.clients.jedis.JedisPoolConfig" scope="singleton">
            <!-- 连接池支持最大的连接数 -->
            <property name="maxActive" value="100" />
            <!-- 连接池最多可空闲的连接数 -->
            <property name="maxIdle" value="10" />
            <!-- 最大等待时间 -->
            <property name="maxWait" value="100" />
            <!-- 取出时是否检测 -->
            <property name="testOnBorrow" value="true" />
        </bean>
    
        <!-- 配置redis数据库 -->
        <bean id="jedisPool" class="redis.clients.jedis.JedisPool"
            destroy-method="destroy">
            <!-- 构造函数参数 -->
            <!-- 指定连接池 -->
            <constructor-arg ref="jedisPoolConfig" />
            <!-- 指定ip地址 -->
            <constructor-arg value="127.0.0.1" />
            <!-- 指定端口号 -->
            <constructor-arg value="6379" />
        </bean>
    
        <!-- 注入Javabean(RedisAPI) -->
        <bean id="redisAPI" class="org.sl.util.RedisAPI">
            <property name="jedisPool" ref="jedisPool" />
        </bean>

    然后在工具类中创建RedisAPI类

    package org.sl.util;
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    
    /**
     * 工具类--redis数据库
     * @author ty
     *
     */
    public class RedisAPI {
        
        //redis数据库对象
        private JedisPool jedisPool;
    
        public JedisPool getJedisPool() {
            return jedisPool;
        }
        public void setJedisPool(JedisPool jedisPool) {
            this.jedisPool = jedisPool;
        }
        
        /**
         * 返还连接池方法
         * @param pool
         * @param jedis
         */
        public static void retuen(JedisPool pool,Jedis jedis){
            if(null != jedis){
                pool.returnResource(jedis);
            }
        }
        
        /**
         * redis数据库set方法
         * @param key
         * @param value
         * @return
         */
        public boolean set(String key,String value){
            Jedis jedis = null;
            //捕获异常
            try {
                jedis = jedisPool.getResource();
                jedis.set(key, value);
                return true;
            } catch (Exception e) {
                // TODO: handle exception
                //打印异常信息
                e.printStackTrace();
            }finally{
                retuen(jedisPool,jedis);
            }
            return false;
        }
        
        /**
         * 判断是否有key
         * @param key
         * @return
         */
        public boolean exist(String key){
            boolean flag = false;
            Jedis jedis = null;
            //捕获异常
            try {
                jedis = jedisPool.getResource();
                flag = jedis.exists(key);
            } catch (Exception e) {
                // TODO: handle exception
                //打印异常信息
                e.printStackTrace();
            }finally{
                retuen(jedisPool,jedis);
            }
            return flag;
        }
        
        /**
         * 获取key对应的value
         * @param key
         * @return
         */
        public String get(String key){
            String st = null;
            Jedis jedis = null;
            //捕获异常
            try {
                jedis = jedisPool.getResource();
                st = jedis.get(key);
            } catch (Exception e) {
                // TODO: handle exception
                //打印异常信息
                e.printStackTrace();
            }finally{
                retuen(jedisPool,jedis);
            }
            return st;
        }
    }

    在对应的Controller中创建一个RedisAPI对象

    对应方法中的代码:

    /**
         * 登录成功之后进入的方法
         * @return
         */
        @RequestMapping(value="/success")
        public ModelAndView loginSuccess(HttpSession session){
            //使用父类获取session中的当前用户
            User user = this.getSuccessUser();
            //创建一个菜单集合
            List<Menu> mList = null;
            if(null != user){
                //创建一个map集合,为之后其他页面拿到菜单列表
                Map<String, Object> modelMap = new HashMap<String, Object>();
                modelMap.put("user", user);
                
                //获取公告信息
                List<GongGao> gongGaoList = null;
                GongGao gongGao = new GongGao();
                gongGao.setStarNum(0);
                gongGao.setPageSize(5);
                //获取资讯信息
                List<ZiXun> ziXunList = null;
                ZiXun ziXun = new ZiXun();
                ziXun.setStarNum(0);
                ziXun.setPageSize(5);
                ziXun.setState(1);
                
                try {
                    gongGaoList = gongGaoService.getShouYeGongGaoList(gongGao);
                    ziXunList = ziXunService.getZiXunListFenYe(ziXun);
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                    gongGaoList = null;
                }
                
                //redis存储规则:redis+roleId
                //判断redis里是否有当前用户
                if(!(redisAPI.exist("redis"+user.getRoleId()))){
                    //如果没有
                    //根据当前用户获取菜单列表mList
                    mList = getmListBySuccessUser(user.getRoleId());
                    if(null != mList){
                        //把mList转成String
                        JSONArray jsonArray= JSONArray.fromObject(mList);
                        String st = jsonArray.toString();
                        //把mList放到map中
                        modelMap.put("menuList", st);
                        //放进redis中
                        redisAPI.set("redis"+user.getRoleId(), st);
                    }
                }else{
                    //如果有,直接从redis里取数据
                    String st = redisAPI.get("redis"+user.getRoleId());
                    if(null != st && !"".equals(st)){
                        //放到Map集合
                        modelMap.put("menuList", st);
                    }else{
                        return new ModelAndView("redirect:/");
                    }
                }
                if(!redisAPI.exist("redis"+user.getRoleId()+"url")){
                    //如果redis中没有当前用户的url列表,就放入redis中
                    QuanXian quanXian = new QuanXian();
                    quanXian.setRoleId(user.getRoleId());
                    try {
                        //获取当前用户的所有权限(url)列表
                        List<Function> functionList = functionService.getFunctionListByRoId(quanXian);
                        if(functionList != null){
                            StringBuffer string = new StringBuffer();
                            for (Function function : functionList) {
                                string.append(function.getFuncUrl());
                            }
                            redisAPI.set("redis"+user.getRoleId()+"url", string.toString());
                        }
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                //把放有菜单列表的Map集合放到session中
                session.setAttribute("gongGaoList", gongGaoList);
                session.setAttribute("ziXunList", ziXunList);
                session.setAttribute(Statics.SESSION_BASE_MODEL, modelMap);
                return new ModelAndView("success",modelMap);
            }
            //如果user为空,返回到系统根目录(登录页面)
            return new ModelAndView("redirect:/");
        }  
  • 相关阅读:
    Python 接口测试之处理转义字符的参数和编码问题
    使用Postman工具做接口测试(三)——断言与参数提取
    Django 单元测试笔记
    django 发布会签到系统web开发
    Django自动化测试平台项目案例
    Cypress学习笔记6——Debugging调试代码
    Cypress学习笔记5——官方示例
    Cypress学习笔记4——编写第二个测试脚本(登录案例)
    Cypress学习笔记3——编写第一个测试脚本
    Cypress学习笔记2——Windows环境下安装Cypress
  • 原文地址:https://www.cnblogs.com/yutianbao/p/9163560.html
Copyright © 2011-2022 走看看