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:/");
    }  
原文地址:https://www.cnblogs.com/yutianbao/p/9163560.html