linux-Centos-7-64位:7、 redis安装及配置

Redis安装部署(最好使用3.0及以上功能附带集群)
Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。

Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。
需要安装gcc:yum install gcc-c++
然后开始安装redis
1. 下载地址:

$ wget http://redis.googlecode.com/files/redis-3.0.0.tar.gz

2. 解压缩 ( 放到/usr/local 目录下解压 )

$ tar -zxvf redis-3.0.0.tar.gz

3. 编译

$ cd redis-3.0.0

$ make

$make install  PREFIX=/usr/local/redis (安装的目录)

a、前端启动模式

/usr/local/redis/bin/redis-server

默认是前端启动模式,端口是6379

b、后端启动
1)从redis的源码目录(既解压目录)中复制redis.conf到redis的安装目录/bin文件夹下。
2)修改配置文件

cp /usr/local/redis/redis-3.0.0/redis.conf /usr/local/redis/bin
cd /usr/local/redis/bin
vi redis.conf

这里写图片描述
后端启动

[root@leopard bin]# ./redis-server redis.conf

也可配置到/etc目录下

$cp redis.conf /etc/       (复制到etc主目录下,方便当机启动)

参数介绍:

make install命令执行完成后,会在/usr/local/bin目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof 、redis-check-dump,它们的作用如下:

redis-server:Redis服务器的daemon启动程序(默认前端启动模式,端口是6379)

redis-cli:Redis命令行操作工具。也可以用telnet根据其纯文本协议来操作

redis-benchmark:Redis性能测试工具,测试Redis在当前系统下的读写性能

redis-check-aof:数据修复

redis-check-dump:检查导出工具

4. 修改系统配置文件,执行命令

a) echo vm.overcommit_memory=1 >> /etc/sysctl.conf

b) sysctl vm.overcommit_memory=1 或执行echo vm.overcommit_memory=1 >>/proc/sys/vm/overcommit_memory

使用数字含义:

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

1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

2,表示内核允许分配超过所有物理内存和交换空间总和的内存

5. 修改redis配置文件

a) $ cd /etc

b) vi redis.conf

c) 修改daemonize yes—目的使进程在后台运行

参数介绍:

daemonize:是否以后台daemon方式运行

pidfile:pid文件位置

port:监听的端口号

timeout:请求超时时间

loglevel:log信息级别

logfile:log文件位置

databases:开启数据库的数量

save * :保存快照的频率,第一个表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。

rdbcompression:是否使用压缩

dbfilename:数据快照文件名(只是文件名,不包括目录)

dir:数据快照的保存目录(这个是目录)

appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。

appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)

6. 启动redis

a) $ cd /usr/local/bin

b) ./redis-server /etc/redis.conf

7. 检查是否启动成功

a) $ ps -ef | grep redis

小插曲:
/*************************************************/
搭建集群需要使用到官方提供的ruby脚本。
需要安装ruby的环境。
安装ruby

yum install ruby                    (ruby的虚拟机)
yum install rubygems                (ruby包的管理器)

redis集群管理工具 redis-trib.rb 位置

[root@bogon ~]# cd /usr/local/redis-3.0.0
[root@bogon redis-3.0.0]# cd src
[root@bogon src]# ll *.rb

这里写图片描述

根据下载好后的路径有 redis-3.0.0 和 redis-3.0.0.gem 两个包 没有就要去找官网下载
这里写图片描述

脚本需要的ruby包: redis-3.0.0.gem

需要上传到linux服务。
安装ruby的包(拷贝redis-3.0.0.gem 至 /usr/local下 执行以下命令):

gem install redis-3.0.0.gem
[root@bogon ~]# gem install redis-3.0.0.gem 

这里写图片描述

伪集群的搭建(单个服务器创建6个redis实例,如果服务器充足,则各配一个)
第一步:创建6个redis实例,端口号从7001~7006

#cd /user/local
#mkdir redis-cluster
#cd redis
#cp -r bin ../redis-cluster/redis01

进入redis01将 dump.rdb快照文件删除并更改端口号

#cd ../redis-cluster/redis01/
#rm -f dump.rdb

这里写图片描述

第二步:修改redis的配置文件

修改配置文件 redis-conf
1、修改端口号

#vi redis-conf

这里写图片描述

2、打开cluster-enable前面的注释。(标示开始做集群)
这里写图片描述

保存更改完后返回到redis-cluster目录下,复制出其他5个redis实例,并将端口号改为7002-7006

#cd ..
#cp -r redis01/ redis02
#cp -r redis01/ redis03
#cp -r redis01/ redis04
#cp -r redis01/ redis05
#cp -r redis01/ redis06

第三步:把创建集群的ruby脚本复制到redis-cluster目录下。

#cd /usr/local/redis-3.0.0/src
#cp *.rb /usr/local/redis-cluster/

这里写图片描述
第四步:启动6个redis实例
因为单个启动比较麻烦,创建一个 startall.sh 脚本,一次性全启动

vim startall.sh

写入如下内容,然后保存
这里写图片描述

添加权限操作,并执行
这里写图片描述

检查是否启动

#ps aux | grep redis

启动成功
这里写图片描述

第五步:创建集群。

#./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005  192.168.25.153:7006

创建6个实例节点,三个主,三个备
这里写图片描述

完成 yes
这里写图片描述

测试集群–

# redis01/redis-cli -h 192.168.25.153 -p 7002 -c

注: -c 一定要加,标示集群
OK成功
这里写图片描述

关闭redis集群

cd /usr/local/redis

单个关闭

#bin/redis-cli -p 7001 shutdown

脚本一次性全关闭

#vim shutdown.sh

这里写图片描述

保存并赋予操作权限,执行关闭
这里写图片描述

/*************************************************/

导入redis.clients.jedis jar 包
进行集群

jedis整合spring
单机版

<!-- 连接池配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大连接数 -->
        <property name="maxTotal" value="30" />
        <!-- 最大空闲连接数 -->
        <property name="maxIdle" value="10" />
        <!-- 每次释放连接的最大数目 -->
        <property name="numTestsPerEvictionRun" value="1024" />
        <!-- 释放连接的扫描间隔(毫秒) -->
        <property name="timeBetweenEvictionRunsMillis" value="30000" />
        <!-- 连接最小空闲时间 -->
        <property name="minEvictableIdleTimeMillis" value="1800000" />
        <!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
        <property name="softMinEvictableIdleTimeMillis" value="10000" />
        <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
        <property name="maxWaitMillis" value="1500" />
        <!-- 在获取连接的时候检查有效性, 默认false -->
        <property name="testOnBorrow" value="true" />
        <!-- 在空闲时检查有效性, 默认false -->
        <property name="testWhileIdle" value="true" />
        <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
        <property name="blockWhenExhausted" value="false" />
    </bean> 
    <!-- jedis客户端单机版 -->
    <bean id="redisClient" class="redis.clients.jedis.JedisPool">
        <constructor-arg name="host" value="192.168.25.153"></constructor-arg>
        <constructor-arg name="port" value="6379"></constructor-arg>
        <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
    </bean>

单机版测试

/**
     * 单机版测试
     * <p>Title: testSpringJedisSingle</p>
     * <p>Description: </p>
     */
    @Test
    public void testSpringJedisSingle() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
        JedisPool pool = (JedisPool) applicationContext.getBean("redisClient");
        Jedis jedis = pool.getResource();
        String string = jedis.get("key1");
        System.out.println(string);
        jedis.close();
        pool.close();
    }

集群版整合

<!-- jedis客户端集群版 -->
<bean id="redisClient" class="redis.clients.jedis.JedisCluster">
        <constructor-arg name="nodes">
            <set>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.153"></constructor-arg>
                    <constructor-arg name="port" value="7001"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.153"></constructor-arg>
                    <constructor-arg name="port" value="7002"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.153"></constructor-arg>
                    <constructor-arg name="port" value="7003"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.153"></constructor-arg>
                    <constructor-arg name="port" value="7004"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.153"></constructor-arg>
                    <constructor-arg name="port" value="7005"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.25.153"></constructor-arg>
                    <constructor-arg name="port" value="7006"></constructor-arg>
                </bean>
            </set>
        </constructor-arg>
        <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
    </bean>

集群版测试

@Test
    public void testSpringJedisCluster() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
        JedisCluster jedisCluster =  (JedisCluster) applicationContext.getBean("redisClient");
        String string = jedisCluster.get("key1");
        System.out.println(string);
        jedisCluster.close();
    }

把缓存添加到业务逻辑。例子如下,
注意:缓存的添加不能影响正常的业务逻辑。
(整体逻辑就是,查找的内容先通过缓存查找,如果有直接返回,不需要连接数据库,如果没,则先查询并把结果添加进缓存内)
其中的“INDEX_CONTENT_REDIS_KEY”是定义主页的键,可随便定义

@Override
    public List<TbContent> getContentList(long contentCid) {
        //从缓存中取内容
        try {
            String result = jedisClient.hget(INDEX_CONTENT_REDIS_KEY, contentCid + "");
            if (!StringUtils.isBlank(result)) {
                //把字符串转换成list
                List<TbContent> resultList = JsonUtils.jsonToList(result, TbContent.class);
                return resultList;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        //根据内容分类id查询内容列表
        TbContentExample example = new TbContentExample();
        Criteria criteria = example.createCriteria();
        criteria.andCategoryIdEqualTo(contentCid);
        //执行查询
        List<TbContent> list = contentMapper.selectByExample(example);

        //向缓存中添加内容
        try {
            //把list转换成字符串
            String cacheString = JsonUtils.objectToJson(list);
            jedisClient.hset(INDEX_CONTENT_REDIS_KEY, contentCid + "", cacheString);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return list;
    }

注:如果后台改变数据,需要同步缓存,也就是把对应的缓存信息删除,方便重新加载缓存内容。

猜你喜欢

转载自blog.csdn.net/u014799292/article/details/52232213