您的位置:首页 > 数据库 > Redis

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

2016-08-17 16:35 477 查看
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[/code] 
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


小插曲:

/[b]*************************************************[/b]/

搭建集群需要使用到官方提供的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




保存并赋予操作权限,执行关闭



/[b]*************************************************[/b]/

导入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;
}


注:如果后台改变数据,需要同步缓存,也就是把对应的缓存信息删除,方便重新加载缓存内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis