您的足迹:首页 > 精彩文章 >Redis缓存以及Redis集群的简单使用

Redis缓存以及Redis集群的简单使用

Redis简介

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如

下:

字符串类型(String)

哈希类型(hash)

列表类型(list)

集合类型(set)

有序集合类型(zset)(sorted set)

作用:

1、可以减轻数据库服务器压力。

2、提高性能

 

1、应用场景:

缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)

分布式集群架构中的session分离。

聊天室的在线好友列表。

任务队列。(秒杀、抢购、12306等等)

应用排行榜。

网站访问统计。

数据过期处理(可以精确到毫秒)

Redis持久化方案

rdb:快照形式,将当前的状态保存起来,隔断时间修改

aof:命令行形式,将命令存入到aof文件里面,一秒保存数据。对数据安全性比较高,西欧马性能比较差。

默认开启rdb模式。

2Redis数据库

 

 

数量:16

默认使用数据库:db0

设置Redis链接密码

 

允许本地局域网连接

 

Redis搭建

1、安装c语言编译器gcc

[[email protected] Desktop]# yum install gcc-c++

2、下载(上传)redis的源代码

2.1、解压

[[email protected] Desktop]# tar -zxvf redis-3.0.0.tar.gz

3、编译

[[email protected] Desktop]# cd redis-3.0.0

编译

[[email protected] redis-3.0.0]# make

4、安装

进入编译目录

[[email protected] Desktop]# cd src

编译安装

[[email protected] src]# make install PREFIX=/usr/local/redis

PREFIX指定安装路径

3.4.3Redis启动

1、前段启动模式

[[email protected] src]# cd /usr/local/redis/bin
[[email protected] bin]# ./redis-server

39849:C 19 Dec 19:52:06.240 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf

39849:M 19 Dec 19:52:06.240 * Increased maximum number of open files to 10032 (it was originally set to 1024).

                _._                                                  

           _.-``__ ''-._                                             

      _.-``    `.  `_.  ''-._           Redis 3.0.0 (00000000/0) 64 bit

  .-`` .-```.  ```\/    _.,_ ''-._                                   

 (    '      ,       .-`  | `,    )     Running in standalone mode

 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379

 |    `-._   `._    /     _.-'    |     PID: 39849

  `-._    `-._  `-./  _.-'    _.-'                                   

 |`-._`-._    `-.__.-'    _.-'_.-'|                                  

 |    `-._`-._        _.-'_.-'    |           http://redis.io        

  `-._    `-._`-.__.-'_.-'    _.-'                                   

 |`-._`-._    `-.__.-'    _.-'_.-'|                                  

 |    `-._`-._        _.-'_.-'    |                                  

  `-._    `-._`-.__.-'_.-'    _.-'                                   

      `-._    `-.__.-'    _.-'                                       

          `-._        _.-'                                           

              `-.__.-'                                               

 

39849:M 19 Dec 19:52:06.261 # Server started, Redis version 3.0.0

39849:M 19 Dec 19:52:06.263 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

39849:M 19 Dec 19:52:06.263 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

39849:M 19 Dec 19:52:06.263 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

39849:M 19 Dec 19:52:06.263 * The server is now ready to accept connections on port 6379

 

默认启动端口号为6379端口

后端启动模式

A、redis的源码目录中复制redis.confredis的安装目录。

[[email protected] redis-3.0.0]# cp redis.conf /usr/local/redis/bin/

B、修改redis.conf配置文件

[[email protected] redis-3.0.0]# cd /usr/local/redis/bin/
[[email protected] redis-3.0.0]# vim redis.conf

 

C、启动

[[email protected] bin]# ./redis-server redis.conf

3.4.4、查询Redis进程

[[email protected] bin]# ps aux|grep redis

3.4.5、关闭Redis进程

[[email protected] bin]# ./redis-cli -p 6379 shutdown

3.4.6Redis基本命令

[[email protected] bin]# ./redis-cli
127.0.0.1:6379> set a 10
OK
127.0.0.1:6379> get a
"10"
127.0.0.1:6379> incr a
(integer)11
127.0.0.1:6379> decr a
(integer)10
127.0.0.1:6379> del a
(integer)1
127.0.0.1:6379> keys 
(empty list or set)

 

Redis缓存集群

集群原理

redis-cluster架构图

 

架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.

(3)客户端与redis节点直连,不需要中间proxy.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

(4)redis-cluster把所有的物理节点映射到[0-16383]slot,cluster 负责维护node<->slot<->value

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

redis-cluster投票:容错

 

(1)领着投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.

(2):什么时候整个集群不可用(cluster_state:fail)? 

    a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

    b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

  ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

集群环境搭建

Ruby是一种面向对象的编程语言,20世纪90年代日本人开发。

搭建集群需要使用到官方提供的ruby脚本。

需要安装ruby的环境。小编使用的是6台虚拟机搭建的Redis集群

1安装ruby

[[email protected] Desktop] yum install ruby
[[email protected] Desktop] yum install rubygems

2、redis集群管理工具

[[email protected] Desktop]# cd redis-3.0.0/src/
[[email protected] src]# ll *.rb
-rwxrwxr-x. 1 root root 48141 Apr  1  2015 redis-trib.rb

3、安装rubyredis的接口程序

redis-3.0.0.gem上传的到linux服务器

安装ruby

[[email protected] Desktop]# gem install redis-3.0.0.gem

集群搭建

1.、在/usr/local下创建redis-cluster文件夹

[[email protected] ]# cd /usr/local
[[email protected] local]# mkdir redis-cluster
[[email protected] redis]# cd redis/

2、将redis目录下的bin目录拷贝到/redis-cluster/redis文件下

[[email protected] redis]# cp -r bin ../redis-cluster/redis
[[email protected] redis]# cd ../redis-cluster/
[[email protected] redis-cluster]# ll
total 4
drwxr-xr-x. 2 root root 4096 Dec 21 20:04 redis
[[email protected] redis-cluster]# cd redis/
dump.rdb删除
删除
[[email protected] redis-cluster]# rm -f dump.rdb

3、修改redis-conf文件

 cluster-enabled yes这行取消注释,开启redis_cluster

 

进入redis源代码拷贝redis-trib.rb/usr/local/redis-cluster/目录下

[[email protected] src]cp redis-trib.rb /usr/local/redis-cluster/

配置其他redis服务器略

[[email protected] src] ./redis-server redis.conf

4、创建集群

[[email protected] redis-cluster]# ./redis-trib.rb  create  --replicas  1  192.168.0.184:6379 192.168.0.109:6379  192.168.0.110:6379 192.168.0.114:6379  192.168.0.113:6379  192.168.0.102:6379
>>> Creating cluster
Connecting to node 192.168.0.184:6379: OK
Connecting to node 192.168.0.109:6379: OK
Connecting to node 192.168.0.110:6379: OK
Connecting to node 192.168.0.114:6379: OK
Connecting to node 192.168.0.113:6379: OK
Connecting to node 192.168.0.102:6379: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.0.102:6379
192.168.0.109:6379
192.168.0.184:6379
Adding replica 192.168.0.113:6379 to 192.168.0.102:6379
Adding replica 192.168.0.114:6379 to 192.168.0.109:6379
Adding replica 192.168.0.110:6379 to 192.168.0.184:6379
M: 347129817247251ab9b89b6b985ce4193f68269f 192.168.0.184:6379
   slots:10923-16383 (5461 slots) master
M: 202807bf910b0fe350f7a990d84671120e4e7b9f 192.168.0.109:6379
   slots:5461-10922 (5462 slots) master
S: fd0bc6dca63e917298e697a1e0ccd90be3bedf5a 192.168.0.110:6379
   replicates 347129817247251ab9b89b6b985ce4193f68269f
S: 9b9affc04e7052c3be2c75fafb4561fea5abb3bc 192.168.0.114:6379
   replicates 202807bf910b0fe350f7a990d84671120e4e7b9f
S: 4beac51798f3790d0f59d967df713459a4bfc8bf 192.168.0.113:6379
   replicates 27b8a3175ce59f4d62e4894b5abe57c64ef3e860
M: 27b8a3175ce59f4d62e4894b5abe57c64ef3e860 192.168.0.102:6379
   slots:0-5460 (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.....
>>> Performing Cluster Check (using node 192.168.0.184:6379)
M: 347129817247251ab9b89b6b985ce4193f68269f 192.168.0.184:6379
   slots:10923-16383 (5461 slots) master
M: 202807bf910b0fe350f7a990d84671120e4e7b9f 192.168.0.109:6379
   slots:5461-10922 (5462 slots) master
M: fd0bc6dca63e917298e697a1e0ccd90be3bedf5a 192.168.0.110:6379
   slots: (0 slots) master
   replicates 347129817247251ab9b89b6b985ce4193f68269f
M: 9b9affc04e7052c3be2c75fafb4561fea5abb3bc 192.168.0.114:6379
   slots: (0 slots) master
   replicates 202807bf910b0fe350f7a990d84671120e4e7b9f
M: 4beac51798f3790d0f59d967df713459a4bfc8bf 192.168.0.113:6379
   slots: (0 slots) master
   replicates 27b8a3175ce59f4d62e4894b5abe57c64ef3e860
M: 27b8a3175ce59f4d62e4894b5abe57c64ef3e860 192.168.0.102:6379
   slots:0-5460 (5461 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

4、测试Redis缓存集群

./redis-cli -h 集群节点ip地址 -p 端口号 -c(代表连接集群)

[[email protected] redis]# ./redis-cli -h 192.168.0.109 -p 6379 -c
192.168.0.109:6379> ping
PONG
192.168.0.109:6379>

Redis图形化操作

1、Redis Desktop Manager

 

只能连接单机版,不能连接集群。

2、Jedis客户端

2.1、单机版

1、需要将jedisjar包添加到工程中,如果是maven需要添加jar包的坐标

<!-- Redis客户端 --><dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>

2、单机版测试

public static void main(String[] args) {
//创建jedis对象
Jedis jedis = new Jedis("192.168.1.101",6379);
//设置redis连接密码
jedis.auth("woo0nise");
//调用jedis对象的方法,方法域名和redis的命令一致
jedis.set("b", "Redis Test");
String b = jedis.get("b");
System.out.println(b);
//关闭jedis
jedis.close();
}


 

3、Jedis连接池

@Test
public void testJedisPool(){
//设置连接池的配置信息
JedisPoolConfig config = new JedisPoolConfig();
    //最大空闲连接数, 应用自己评估,不要超过AliCloudDB for Redis每个实例最大的连接数
    config.setMaxIdle(200);
    //最大连接数, 应用自己评估,不要超过AliCloudDB for Redis每个实例最大的连接数
    config.setMaxTotal(300);
    config.setTestOnBorrow(false);
    config.setTestOnReturn(false);
    String host = "192.168.1.101";
    String password = "woo0nise";
    //创建连接池
    JedisPool pool = new JedisPool(config, host, 6379, 3000, password);
//从连接池获取连接对象
    Jedis jedis =  pool.getResource();
System.out.println("a:"+jedis.get("a"));
System.out.println("b:"+jedis.get("b"));
jedis.close();
pool.close();
}

2.2、集群

1、需要设置权限(我设置的为本地局域网全部可以访问该Redis集群)

@Test
public void jedisCluster(){
//集群节点集合
Set<HostAndPort> nodes = new HashSet<HostAndPort>();
nodes.add(new HostAndPort("192.168.1.101",6379));
nodes.add(new HostAndPort("192.168.1.105",6379));
nodes.add(new HostAndPort("192.168.1.102",6379));
nodes.add(new HostAndPort("192.168.1.106",6379));
nodes.add(new HostAndPort("192.168.1.107",6379));
nodes.add(new HostAndPort("192.168.1.104",6379));
//创建集群
JedisCluster cluster = new JedisCluster(nodes);
cluster.set("test", "ok");
String data = cluster.get("test");
System.out.println(data);
cluster.close();
}

集群自带连接池

3.7Spring整合Jedis

3.7.1Spring整合Jedis(单机版)

applicationContext-jedis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd">
 
<!-- 连接池配置,可有可无 -->
<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="jedisPool" class="redis.clients.jedis.JedisPool" >
<constructor-arg name="host" value="192.168.1.101" ></constructor-arg>
<constructor-arg name="port" value="6379" ></constructor-arg>
<constructor-arg name="poolConfig" ref="jedisPoolConfig" ></constructor-arg>
</bean>
 
</beans>

测试连接

@Test
public void JedisTest(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:/spring/applicationContext-*.xml");
JedisPool jedisPool = (JedisPool)applicationContext.getBean("jedisPool");
Jedis jedis = jedisPool.getResource();
jedis.set("a", "100");
String a = jedis.get("a");
System.out.println(a);
jedis.close();
jedisPool.close();
}

3.7.2Spring整合Jedis(集群版本)

<!-- 配置集群版jedis -->
<bean id="jedisCluster"  class="redis.clients.jedis.JedisCluster" >
<constructor-arg name="nodes" >
<set>
 <bean class="redis.clients.jedis.HostAndPort" >
  <constructor-arg name="host" value="192.168.1.101" ></constructor-arg>
  <constructor-arg name="port" value="6379" ></constructor-arg>
 </bean>
 <bean class="redis.clients.jedis.HostAndPort" >
  <constructor-arg name="host" value="192.168.1.111" ></constructor-arg>
  <constructor-arg name="port" value="6379" ></constructor-arg>
 </bean>
<bean class="redis.clients.jedis.HostAndPort" >
  <constructor-arg name="host" value="192.168.1.112" ></constructor-arg>
  <constructor-arg name="port" value="6379" ></constructor-arg>
 </bean>
 <bean class="redis.clients.jedis.HostAndPort" >
  <constructor-arg name="host" value="192.168.1.113" ></constructor-arg>
  <constructor-arg name="port" value="6379" ></constructor-arg>
 </bean>
 <bean class="redis.clients.jedis.HostAndPort" >
  <constructor-arg name="host" value="192.168.1.114" ></constructor-arg>
  <constructor-arg name="port" value="6379" ></constructor-arg>
 </bean>
 <bean class="redis.clients.jedis.HostAndPort" >
  <constructor-arg name="host" value="192.168.1.115" ></constructor-arg>
  <constructor-arg name="port" value="6379" ></constructor-arg>
 </bean>
</set>
</constructor-arg>
</bean>

测试连接

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


本博客所有文章如无特别注明均为原创。作者:0nise复制或转载请以超链接形式注明转自 0nise's Blog ---1931sec TeAm!
原文地址《Redis缓存以及Redis集群的简单使用

相关推荐

  • blogger

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(0)